我正在尝试运行一个查询,其中包含一些 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 在 CLOB 字符集 ANY_CS, 整数金额:= 32767, 整数中的偏移量:= 1) 返回 VARCHAR2 字符集 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,为什么我们不能 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
对于大 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 ...