2010-09-24 112 views
33

我试图运行具有几列CLOB数据类型的查询。如果我像正常运行查询,所有这些字段只有(CLOB)作为值。如何查询Oracle中的CLOB列

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

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

我怎样才能查询CLOB列?

+1

我正在使用TOAD。 – Catfish 2010-09-24 20:01:55

+0

通常,像Toad和PL/SQL Developer这样的桌面工具不会试图预览CLOB列,而是在可点击的文本框中显示一个通用的''占位符,当您单击它时,它会弹出到单独的大数据窗口中。 – 2017-11-20 18:29:49

回答

35

当得到一个CLOB列的子字符串并使用查询工具,有时也有大小/缓冲限制,你就需要设置BUFFER到更大的尺寸。例如,在使用SQL Plus时,使用SET BUFFER 10000将其设置为10000,因为默认值为4000.

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

更多信息,请参见oracle documentation在SUBSTR命令

 

    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; 

+0

我将它限制为3000,它工作。谢谢! – Catfish 2010-09-24 20:03:09

0

如果您在使用SQL * Plus尝试以下...

set long 8000 

select ... 
53

这工作

select DBMS_LOB.substr(myColumn, 3000) from myTable 
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); 
2

对于大CLOB将选择也可用于:

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

3

我没有在我的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并作为电子邮件发送。

+0

问题是什么? – vulkanino 2017-02-20 13:11:21

0

添加到答案。

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个字符。