2012-02-15 11 views
0

データ型がLONGのフィールドを含むOracle内のテーブルがあります。次の関数では、テーブル内の特定のレコードのこのLONGフィールドに格納されている文字数を調べようとしています。長い値の長さの取得

CREATE OR REPLACE FUNCTION Find_Length(i_nwt_id number) 
RETURN NUMBER 

IS 
    long_var LONG; 

BEGIN 
    SELECT NWT_TEXT 
     INTO long_var 
     FROM qf.NWT 
    WHERE nwt_id=i_nwt_id; 

    RETURN length(long_var); 

END; 

私は次のようにそれを呼び出そう:

select nwt_id, find_length(nwt_id)leng from nwt ; 

いずれにせよ、この選択は私に例外をスロー:

Numeric or value error! 

誰もが私に私が間違っているの何のヒントを与えるだろうか?

ありがとうございます!

+1

おそらく重複するhttp://stackoverflow.com/questions/5497238/get-the-length-of-a-long-raw – Ben

答えて

1

あなたの問題は、サイズが32kを超える場合です。長い生のためのヴィンセントのJavaストアドプロシージャのソリューションに従う、またはこれを行う次のいずれか

create global temporary table ltt(x clob) 
on commit delete rows; 

create or replace function length_of_long(p_tname in varchar2, p_cname in varchar2, p_rowid in rowid) 
return number authid current_user 
as 
    pragma autonomous_transaction; 
    l_length number; 
begin 
    execute immediate 
    'insert into ltt(x) 
    select to_lob(' || p_cname || ') 
    from ' || p_tname || ' 
    where rowid = :x' using p_rowid; 

    select dbms_lob.get_length(x) into l_length from ltt; 

    commit; 

    return l_length; 
end; 

そして、このようにそれを使用します。

select id, length_of_long('MY_TABLE', 'LONG_COL', rowid) as len from MY_TABLE; 

免責事項、私は、いつか前にトム・カイトの記事から同様の意志を、このアプローチを見つけましたLONG RAWの場合は、BLOBとして一時テーブルが必要です。

+0

あなたは関数 'how_long'を呼び出す必要があります。それは良い解決策です。ちょうどひどく丸みを帯びているようだ。しかし、「長い」ものはすべてです。 – Ben

+0

@Ben haha​​、too funny :-) – tbone