如何在Oracle中查询CLOB列

Cat*_*ish 45 sql oracle plsql clob ora-06502

我正在尝试运行一个具有几列CLOB数据类型的查询.如果我像正常一样运行查询,那么所有这些字段都只有(CLOB)值.

我尝试使用DBMS_LOB.substr(column),我得到错误

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Run Code Online (Sandbox Code Playgroud)

我如何查询CLOB列?

小智 70

这有效

select DBMS_LOB.substr(myColumn, 3000) from myTable
Run Code Online (Sandbox Code Playgroud)


mrj*_*ohn 43

获取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;


小智 8

我在Oracle数据库中遇到了HugeClob的另一个问题.将dbms_lob.substr只允许在功能,前一个4000值:

dbms_lob.substr(column,4000,1)
Run Code Online (Sandbox Code Playgroud)

所以对于我更大的HughClob,我不得不使用两个电话select:

select dbms_lob.substr(column,4000,1) part1, 
       dbms_lob.substr(column,4000,4001) part2 from .....
Run Code Online (Sandbox Code Playgroud)

我是从Java应用程序调用的,所以我简单地连接part1和part2并作为电子邮件发送.


Raj*_*Raj 5

如果是 CLOB 为什么我们不能对列进行 to_char 然后正常搜索?

创建一个表

CREATE TABLE MY_TABLE(Id integer PRIMARY KEY, Name varchar2(20), message clob);
Run Code Online (Sandbox Code Playgroud)

在此表中创建几条记录

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;
Run Code Online (Sandbox Code Playgroud)

在clob栏中搜索

SELECT * FROM MY_TABLE where to_char(message) like '%e%';
Run Code Online (Sandbox Code Playgroud)

结果

ID   NAME    MESSAGE   
===============================  
1    Tom     Hi This is Row one         
3    Frank   Hi This is Row three
5    Robert  Hi This is Row five
Run Code Online (Sandbox Code Playgroud)