我怎样才能摆脱因 PLSQL linesize 大于每行中的数据而导致的空白?

How can I get rid of blank spaces caused by PLSQL linesize being larger than the data in each line?

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

因此,我通过 dbms_output.put_line 输出的行出现了,但是需要许多额外的空格才能使该行完整包含 1000 个字符。

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

嗯,如果有办法,我就不知道了。一个简单的过程(模拟你所描述的)完全按照你所说的去做 - 使每行 1000 个字符长,尽管我 TRIMMED 结果(见第 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 目录。此外,将该目录的 readwrite 权限授予将使用它的用户(在我的示例中为 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>

如果您检查输出文件的内容,您会发现每行的大小与每行的内容一样长。

希望对您有所帮助。

您可以尝试 SET TRIMSPOOL ON 和 SET LINESIZE,希望这会帮助您删除记录末尾多余的 space。