53

我正在尝试运行一个查询,其中包含一些 CLOB 数据类型的列。如果我像往常一样运行查询,所有这些字段都只是(CLOB)作为值。

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

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

如何查询 CLOB 列?

4

8 回答 8

79

这有效

select DBMS_LOB.substr(myColumn, 3000) from myTable
于 2010-11-17T01:24:20.120 回答
49

在获取 CLOB 列的子字符串并使用具有大小/缓冲区限制的查询工具时,有时您需要将 BUFFER 设置为更大的大小。例如,在使用 SQL Plus 时,使用 将SET BUFFER 10000其设置为 10000,因为默认值为 4000。

运行该DBMS_LOB.substr命令,您还可以指定要返回的字符数量和偏移量。因此使用DBMS_LOB.substr(column, 3000)可能会将其限制为足够小的缓冲区数量。

有关substr 命令的更多信息,请参阅oracle 文档

    DBMS_LOB.SUBSTR (
       lob_loc 在 CLOB 字符集 ANY_CS,
       整数金额:= 32767,
       整数中的偏移量:= 1)
      返回 VARCHAR2 字符集 lob_loc%CHARSET;

于 2010-09-24T19:57:31.860 回答
10

我确实在我的 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 连接起来并作为电子邮件发送。

于 2017-02-20T13:00:57.927 回答
7

如果是 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
于 2019-06-03T10:33:15.347 回答
1

对于大 CLOB 选择也可以使用:

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

于 2016-05-04T11:17:52.400 回答
0

另一种选择是创建一个函数并在每次需要选择 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);
于 2012-12-06T14:50:29.217 回答
-1

添加到答案。

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 parameterclob你要提取的。

Second parameter是您要提取的 clob 长度。

Third parameter是您要从哪个词中提取。

在上面的例子中,我知道我的 clob 大小超过 50000,所以我想要最后 4000 个字符。

于 2017-11-20T14:37:16.283 回答
-3

如果您使用的是 SQL*Plus,请尝试以下操作...

set long 8000

select ...
于 2010-09-24T19:56:16.203 回答