2012-02-15 5 views
0

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

Вероятный дубликат 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; 

Отказа от ответственности, я нашел этот подход из статьи Тома Kyte некоторое время назад, подобные будет работа для LONG RAW, просто нужна таблица temp как BLOB.

+0

Вы должны были вызвать функцию 'how_long'! Это хорошее решение; просто кажется ужасно кругом; но тогда все с 'long' есть. – Ben

+0

@Ben ха-ха, тоже смешно :-) – tbone

Смежные вопросы