Подтвердить что ты не робот

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

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

Я попытался использовать DBMS_LOB.substr(column), и я получил ошибку

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

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

4b9b3361

Ответ 1

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

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

Подробнее о команде 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;

Ответ 2

Это работает

select DBMS_LOB.substr(myColumn, 3000) from myTable

Ответ 3

Я столкнулся с другим условием с HugeClob в моей базе данных Oracle. 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 и отправлял его как электронную почту.

Ответ 4

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

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

Ответ 5

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

set long 8000

select ...

Ответ 6

Другой вариант - создать функцию и вызвать эту функцию каждый раз, когда вам нужно выбрать столбец 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);

Ответ 7

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

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 - сколько длины клоба вы хотите извлечь.

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

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