【问题标题】:Retrieving length of long values检索长值的长度
【发布时间】:2012-02-15 17:09:21
【问题描述】:

我在 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!

谁能给我提示我做错了什么?

谢谢!

【问题讨论】:

标签: sql database oracle plsql


【解决方案1】:

您的问题是当您的尺寸 > 32k 时。要么按照文森特的 java 存储过程解决方案进行 long raw,要么这样做:

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。

【讨论】:

  • 你应该调用函数how_long!这是一个很好的解决方案;只是看起来可怕的迂回;但是long 的所有内容都是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2012-08-23
  • 2018-12-19
相关资源
最近更新 更多