Как запросить столбец CLOB в Oracle - PullRequest
40 голосов
/ 24 сентября 2010

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

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

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

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

Ответы [ 8 ]

64 голосов
/ 17 ноября 2010

Это работает

select DBMS_LOB.substr(myColumn, 3000) from myTable
39 голосов
/ 24 сентября 2010

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

Запустив команду DBMS_LOB.substr, вы также можете указать количество символов, которое вы хотите вернуть, и смещение, от которого. Таким образом, использование 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;

8 голосов
/ 20 февраля 2017

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

1 голос
/ 04 мая 2016

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

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

0 голосов
/ 03 июня 2019

Если это CLOB, почему мы не можем to_char столбец, а затем искать в обычном режиме?

Создать таблицу

CREATE TABLE MY_TABLE(Id integer PRIMARY KEY, Name varchar2(20), message clob);

Создать несколько записей в этой таблице

INSERT INTO MY_TABLE VALUES(1,'Tom','Hi This is Row one');
INSERT INTO MY_TABLE VALUES(2,'Lucy', 'Hi This is Row two');
INSERT INTO MY_TABLE VALUES(3,'Frank', 'Hi This is Row three');
INSERT INTO MY_TABLE VALUES(4,'Jane', 'Hi This is Row four');
INSERT INTO MY_TABLE VALUES(5,'Robert', 'Hi This is Row five');
COMMIT;

Поиск в столбце clob

SELECT * FROM MY_TABLE where to_char(message) like '%e%';

Результаты

ID   NAME    MESSAGE   
===============================  
1    Tom     Hi This is Row one         
3    Frank   Hi This is Row three
5    Robert  Hi This is Row five
0 голосов
/ 20 ноября 2017

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

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 символов.

0 голосов
/ 06 декабря 2012

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

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

set long 8000

select ...
...