[英]How to query a CLOB column in Oracle
我正在嘗試運行一個查詢,其中有幾列是 CLOB 數據類型。 如果我像往常一樣運行查詢,所有這些字段都只有(CLOB)
作為值。
我嘗試使用DBMS_LOB.substr(column
) ,但出現錯誤
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
如何查詢 CLOB 列?
這有效
select DBMS_LOB.substr(myColumn, 3000) from myTable
當獲取 CLOB 列的子字符串並使用具有大小/緩沖區限制的查詢工具時,有時您需要將 BUFFER 設置為更大的大小。 例如,在使用 SQL Plus 時,使用SET BUFFER 10000
將其設置為 10000,因為默認值為 4000。
運行DBMS_LOB.substr
命令,您還可以指定要返回的字符數量和偏移量。 因此,使用DBMS_LOB.substr(column, 3000)
可能會將其限制為足夠小的緩沖區數量。
有關 substr 命令的更多信息,請參閱oracle 文檔
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;
我的 Oracle 數據庫中的 HugeClob 確實遇到了另一種情況。 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 為什么我們不能對列進行字符化,然后正常搜索?
創建一個表
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
對於大 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 個字符。
如果您使用 SQL*Plus,請嘗試以下操作...
set long 8000
select ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.