【问题标题】:How to query a CLOB column in Oracle如何在 Oracle 中查询 CLOB 列
【发布时间】:2011-04-16 23:09:01
【问题描述】:

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

我尝试使用DBMS_LOB.substr(column),但出现错误

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

如何查询 CLOB 列?

【问题讨论】:

  • 典型的桌面工具,如 Toad 和 PL/SQL Developer 不会尝试预览 CLOB 列,而是在可点击的文本框中显示一个通用的 <CLOB> 占位符,当当你点击它。

标签: sql oracle plsql clob ora-06502


【解决方案1】:

这行得通

select DBMS_LOB.substr(myColumn, 3000) from myTable

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我想获取clob数据,请问有什么方法可以选择clob数据吗?
    • 这个函数似乎运行缓慢.. 有没有其他更快的替代方案?
    • 检查 dbms_lob.COPY 方法。
    • Oracle 文档链接已损坏。
    【解决方案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 连接起来并作为电子邮件发送。

    【讨论】:

    • 问题是什么?
    【解决方案4】:

    如果是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
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 当我使用这个函数时,我得到了空值
      • Cliff Bender 写道:dbms_lob.substr 只允许函数中的值 4000,也许这就是问题
      【解决方案6】:

      另一个选项是创建一个函数并在每次需要选择 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);
      

      【讨论】:

        【解决方案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 是您要提取的 clob 长度。

        Third parameter 是您要从中提取的单词。

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

        【讨论】:

        • 如何从我的 clob 中获取整个角色
        • 您能简要介绍一下您想要实现的目标吗?
        【解决方案8】:

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

        set long 8000
        
        select ...
        

        【讨论】:

        • "set long 8000" 在这里有什么帮助?请详细说明
        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        相关资源
        最近更新 更多