簡體   English   中英

如何在 Oracle 中查詢 CLOB 列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM