暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 使用utl将表中的多行导出到单行文本

askTom 2017-11-15
574

问题描述

在我的项目中,我需要使用utl文件将多行从单列导出到单行文本
下面的示例
我的表: 员工
员工名称
-----------------------------
史密斯
约翰
汤姆
亚当

我的输出文本文件应该像下面一样导出

史密斯约翰汤姆亚当

行之间不应有任何空间是分隔符。即使是一百万行也应该导出到
文本格式的单行

专家解答

好吧,如果你知道最后的字符串将小于4,000字节长 * 你可以在SQL中使用listagg:

with rws as (
  select rownum r, lpad(chr(rownum+64), 3, chr(rownum+64)) str 
  from   dual
  connect by level <= 5
)
  select listagg(str, '') within group (order by r) s from rws;

S                 
AAABBBCCCDDDEEE


如果比这更长,但是 <32,767您可以在PL/SQL中构建字符串:

declare
  s varchar2(32767);
begin
  
  for rws in (
    select rownum r, lpad(chr(rownum+64), 3, chr(rownum+64)) str 
    from   dual
    connect by level <= 10000
  ) loop
    s := s || rws.str;
  end loop;

  dbms_output.put_line ('Length: ' || length(s));
  dbms_output.put_line ('Start: ' || substr(s, 1, 30));
end;
/

Length: 30000
Start: AAABBBCCCDDDEEEFFFGGGHHHIIIJJJ


如果你超过32,767个字节,你可以使用clob:

declare
  s clob;
begin
  
  dbms_lob.createtemporary ( s , true );
  
  for rws in (
    select rownum r, lpad(chr(rownum+64), 3, chr(rownum+64)) str 
    from   dual
    connect by level <= 20000
  ) loop
    dbms_lob.append ( s, rws.str );
  end loop;

  dbms_output.put_line ('Length: ' || dbms_lob.getlength(s));
  dbms_output.put_line ('Start: ' || dbms_lob.substr(s, 30, 1));
end;
/

Length: 60000
Start: AAABBBCCCDDDEEEFFFGGGHHHIIIJJJ


* 如果您在12.1和up上,则可以使用listagg向上32,767,如果将MAX_STRING_SIZE设置为EXTENDED。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论