Получение длины длинных значений - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть таблица в 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!

Кто-нибудь может дать мне подсказку, что я делаю не так?

Спасибо!

1 Ответ

1 голос
/ 15 февраля 2012

Ваша проблема, когда вы достигли размера> 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...