使用sqlplus检索大型clob数据

时间:2018-03-28 04:28:50

标签: oracle sqlplus clob

如何使用sqlplus从表中完整检索大型clob数据到stdout?有一种方法可以完全使用特定于语言的DB API。但是当我尝试使用纯粹的sqlplus时,我遇到了一些问题,例如,

  • 输出缓冲区太小(最多4000个)
  • 字符串缓冲区太小

由于oracle clob字段可以包含4GB(最大)的数据,有没有正确的方法来使用sqlplus获取完整的数据块?我可以将其下载为文件吗?

我希望问题很清楚。如果我可以在不向数据库注入PL / SQL过程的情况下这样做,我更喜欢。

2 个答案:

答案 0 :(得分:4)

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

所有变量的描述均为here

  • long 2000000000 - 指定要检索的CLOB字节数。 (2gb是最大的)
  • linesize行的大小(最大32k)。线的大小。如果行超出大小,该行将被包装到下一行
  • longchunksize 32k - 将以块状物检索clob,块大小为32k
  • PAGESIZE 0 - 分发结果页面fomrationg
  • FEEDBACK,ECHO,TERMOUT - 禁用所有这些功能。
  • Spool将输出重定向到output_file.txt

答案 1 :(得分:1)

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

exec dbms_output.enable(32767);

它将clob数据打印为到stdout。

<强>解释

  • 以下两项增加了sqlplus的输出缓冲区大小 set serveroutput on VARCHAR2
  • 脚本的作用是选择clob数据到dbms_output.put_line() 变量并通过no_data_found打印出来。每当有 没有数据(NSString *filePath = [[NSBundle mainBundle] pathForResource:@"DataJson" ofType:@"json"]; NSLog(@"%@",filePath); NSURL *url = [NSURL fileURLWithPath:filePath]; NSData *jsonData = [NSData dataWithContentsOfURL:url]; NSError *error = nil; id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&error]; if (error == nil){ NSLog(@"#### JSON object #### %@",jsonObject); }else{ NSLog(@"#### JSON parsing error #### %@",error); } 异常发生),异常将是 处理并生成错误消息。