Как запросить столбец CLOB в Oracle

Я пытаюсь запустить запрос, который имеет несколько столбцов, которые являются типом данных CLOB. Если я запускаю запрос как обычно, все эти поля просто имеют (CLOB) как значение.

Я попытался с помощью DBMS_LOB.substr(column) и я получаю ошибку

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

как я могу запросить столбец CLOB?

7 ответов


при получении подстроки столбца CLOB и использовании инструмента запроса, который имеет ограничения размера/буфера, иногда вам нужно будет установить буфер на больший размер. Например, при использовании SQL Plus используйте SET BUFFER 10000 чтобы установить его в 10000 по умолчанию 4000.

под управлением вы также можете указать количество символов, которые вы хотите вернуть и смещение, начиная с которого. Итак, используя DBMS_LOB.substr(column, 3000) может ограничить его достаточно небольшим количеством для буфер.

посмотреть документация oracle для получения дополнительной информации о команде функцию substr


    DBMS_LOB.SUBSTR (
       lob_loc     IN    CLOB   CHARACTER SET ANY_CS,
       amount      IN    INTEGER := 32767,
       offset      IN    INTEGER := 1)
      RETURN VARCHAR2 CHARACTER SET lob_loc%CHARSET;


это работает

select DBMS_LOB.substr(myColumn, 3000) from myTable

я столкнулся с другим условием с HugeClob в моей базе данных Oracle. The dbms_lob.substr разрешено только значение 4000 в функции, например:

dbms_lob.substr(column,4000,1)

поэтому для моего HughClob, который был больше, мне пришлось использовать два вызова в select:

select dbms_lob.substr(column,4000,1) part1, 
       dbms_lob.substr(column,4000,4001) part2 from .....

Я звонил из приложения Java, поэтому я просто объединил part1 и part2 и отправил по электронной почте.


для больших CLOB выбирает также можно использовать:

SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo


другой вариант-создать функцию и вызывать эту функцию каждый раз, когда вам нужно выбрать столбец clob.

create or replace function clob_to_char_func
(clob_column in CLOB,
 for_how_many_bytes in NUMBER,
 from_which_byte in NUMBER)
return VARCHAR2
is
begin
Return substrb(dbms_lob.substr(clob_column
                            ,for_how_many_bytes
                            ,from_which_byte)
            ,1
            ,for_how_many_bytes);
end;

и вызывать эту функцию как:

SELECT tocharvalue, clob_to_char_func(tocharvalue, 1, 9999)
FROM (SELECT clob_column AS tocharvalue FROM table_name);

Если вы используете SQL*Plus, попробуйте следующее...

set long 8000

select ...

добавить к ответу.

declare
v_result clob;
begin
---- some operation on v_result
dbms_lob.substr( v_result, 4000 ,length(v_result) - 3999 );

end;
/

на dbms_lob.substr

first parameter и clob что вы хотите извлечь .

Second parameter сколько длины clob вы хотите извлечь.

Third parameter С слово, которое вы хотите извлечь .

в приведенном выше примере я знаю, что мой размер clob больше 50000, поэтому я хочу последний символ 4000 .