我在Oracle中有一个表,其中包含数据类型为LONG
的字段。使用以下函数,我试图找出表格中特定记录的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!
任何人都可以给我一个暗示我做错了什么?
谢谢!
答案 0 :(得分:1)
您的问题是当您达到尺寸> 32K。要么遵循Vincent的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;
免责声明,我从Tom Kyte的文章中发现了这种方法,类似于LONG RAW,只需将临时表作为BLOB。