Как запросить столбец 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;
я столкнулся с другим условием с 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);
добавить к ответу.
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 .