如何摆脱由PLSQL行大小大于每行数据引起的空白?

时间:2019-01-14 19:18:50

标签: sql oracle plsql toad

我有一个脚本,其中已将LINESIZE设置为1000。

结果是,我通过dbms_output.put_line输出的行显示出来,但是要使该行包含1000个字符,还需要很多额外的空格。

如何更改linesize参数或脚本以允许内容设置行大小并避免输出文件中出现空格?

2 个答案:

答案 0 :(得分:3)

您可以尝试将SET TRIMSPOOL和SET LINESIZE一起打开,希望这将有助于您在记录末尾删除多余的空间。

答案 1 :(得分:2)

嗯,如果有办法,我不知道。尽管我 TRIMMED 结果(请参见第3行),但一个简单的过程(模拟您所描述的内容)可以完全按照您的意思进行,使每行长1000个字符(见第3行):

SQL> set linesize 1000
SQL> set serveroutput on
SQL> spool a.txt
SQL> begin
  2    for cur_r in (select empno ||' '||ename col from emp) loop
  3      dbms_output.put_line(trim(cur_r.col)) ;
  4    end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> spool off

因此,我建议另一种方法- UTL_FILE 。就是这样。

首先,作为SYS创建一个目录(对象),该目录指向数据库服务器文件系统中的目录。我的笔记本电脑上有11gXE,因此我选择了其Temp目录。另外,向要使用该目录的用户授予该目录的 read write 特权(在我的示例中为Scott):

SQL> show user
USER is "SYS"
SQL> create directory ext_dir as 'c:\temp';

Directory created.

SQL> grant read, write on directory ext_dir to scott;

Grant succeeded.

现在,过程本身:

SQL> connect scott/tiger
Connected.
SQL> declare
  2    v_file utl_file.file_type;
  3  begin
  4    v_file := utl_file.fopen(location     => 'EXT_DIR',
  5                             filename     => 'test.txt',
  6                             open_mode    => 'w',
  7                             max_linesize => 1000);
  8    for cur_r in (select empno ||' '|| ename result from emp) loop
  9      utl_file.put_line(v_file, cur_r.result);
 10    end loop;
 11    utl_file.fclose(v_file);
 12  end;
 13  /

PL/SQL procedure successfully completed.

SQL>

如果您检查输出文件的内容,您会发现行的大小可变,只要每一行的内容都一样。

希望会有所帮助。