代码之家  ›  专栏  ›  技术社区  ›  Catfish

如何在Oracle中查询CLOB列

  •  40
  • Catfish  · 技术社区  · 14 年前

    我正在尝试运行一个查询,该查询有一些列是CLOB数据类型。如果我像正常一样运行查询,所有这些字段 (CLOB) 作为价值。

    我试过用 DBMS_LOB.substr(column )我得到了错误

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

    如何查询CLOB列?

    7 回复  |  直到 7 年前
        1
  •  39
  •   Community CDub    8 年前

    当获取CLOB列的子字符串并使用具有大小/缓冲区限制的查询工具时,有时需要将缓冲区设置为更大的大小。例如,在使用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;
    
    
        2
  •  64
  •   Chris    14 年前

    这个工作

    select DBMS_LOB.substr(myColumn, 3000) from myTable
    
        3
  •  7
  •   vulkanino    8 年前

    我确实在我的Oracle数据库中遇到了另一个与HugeLob有关的情况。这个 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,并作为电子邮件发送。

        4
  •  1
  •   Kapitula Alexey    8 年前

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

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

        5
  •  0
  •   Mustafa    12 年前

    另一个选项是创建一个函数,并在每次需要选择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);
    
        6
  •  -1
  •   Himanshu sharma    7 年前

    添加到答案中。

    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 是你想要提取的木块的长度。

    Third parameter 是从哪个单词中提取的。

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

        7
  •  -2
  •   Scott    14 年前

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

    set long 8000
    
    select ...