Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用sqlplus检索大型clob数据_Oracle_Sqlplus_Clob - Fatal编程技术网

Oracle 使用sqlplus检索大型clob数据

Oracle 使用sqlplus检索大型clob数据,oracle,sqlplus,clob,Oracle,Sqlplus,Clob,如何使用sqlplus将大型clob数据从表中完全检索到标准输出?有一种方法可以完全使用特定于语言的DB API实现。但是当我尝试使用纯sqlplus获取它时,我遇到了几个问题,例如 输出缓冲区太小(最大值为4000) 字符串缓冲区太小 由于oracle clob字段可以包含4GB(最大)的数据,是否有正确的方法使用sqlplus获取完整的数据块?我可以把它作为文件下载吗 我希望问题是清楚的。我更喜欢在不向数据库注入PL/SQL过程的情况下执行此操作。1)第一个表和clob create t

如何使用sqlplus将大型clob数据从表中完全检索到标准输出?有一种方法可以完全使用特定于语言的DB API实现。但是当我尝试使用纯sqlplus获取它时,我遇到了几个问题,例如

  • 输出缓冲区太小(最大值为4000)
  • 字符串缓冲区太小
由于oracle clob字段可以包含4GB(最大)的数据,是否有正确的方法使用sqlplus获取完整的数据块?我可以把它作为文件下载吗

我希望问题是清楚的。我更喜欢在不向数据库注入PL/SQL过程的情况下执行此操作。

1)第一个表和clob

create table large_clob(a clob);
insert into large_clob values( dbms_xmlgen.getXml('select * from dba_objects'));
2) 在sqlplus中运行代码

set linesize 32767 long 2000000000 longchunksize 32767 PAGESIZE 0 FEEDBACK OFF ECHO OFF TERMOUT OFF
Spool output_file.txt
  select a from large_clob;
spool off
所有变量的描述如下所示

  • long 20000000000
    -指定要检索的CLOB字节数。(最大为2gb)
  • linesize
    行的大小(最大32k)。线的大小。如果行超过大小,该行将被换行到下一行
  • longchunksize 32k
    -将分块检索clob,其中块大小为32k
  • PAGESIZE 0
    -取消分配结果页fomrationg
  • 反馈、回音、TERMOUT
    -禁用所有这些功能
  • Spool
    将输出重定向到output_file.txt

    • 我就是这样做的。但在这里,可以检索的数据仅限于VARCHAR2(32767)的最大值

      exec dbms_output.enable(32767);
      将服务器输出设置为on
      声明
      数据缓冲区VARCHAR2(32767);
      开始
      在数据缓冲区中选择“| | CLOBDATA|U值| |”
      从虚拟表格
      其中ID='DUMMY_ID';
      dbms_输出.put_行(数据_缓冲区);
      例外情况
      当没有找到任何数据时
      dbms_output.put_行(“未选择行”);
      结束;
      
      它将clob数据按原样打印到标准输出

      解释

      • 以下两项增加了sqlplus的输出缓冲区大小
        exec dbms_output.enable(32767)
        
        打开服务器输出
      • 脚本所做的是将clob数据选择到
        VARCHAR2
        变量并通过
        dbms\u output.put\u line()
        打印它。只要有 无数据(
        no\u data\u found
        发生异常),异常将被删除 已处理并将生成错误消息

      是否限制为32767字符限制?这是clob中行的大小限制。如果行较长,则将拆分为两行。当它将该行拆分为两行时,还将添加一个额外的新行。生成的文件包含我也执行的sql。除了这些问题之外,它做了预期的事情。我建议在使用此代码之前先使用
      设置heading off
      。虽然此代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案是没有用的。@ncfirth据我所知,它只是将sqlplus终端的输出重定向到一个文件。
      exec dbms_output.enable(32767);
      set serveroutput on
      DECLARE
          data_buffer VARCHAR2(32767);
      BEGIN
          SELECT '<BGN>' || CLOBDATA_VALUE || '<END>' into data_buffer 
          FROM DUMMY_TABLE
          WHERE ID='DUMMY_ID';
          dbms_output.put_line(data_buffer);
      EXCEPTION
          when no_data_found then
          dbms_output.put_line('<BGN>no rows selected<END>');
      END;