我怎样才能摆脱因 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 目录。此外,将该目录的 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>
如果您检查输出文件的内容,您会发现每行的大小与每行的内容一样长。
希望对您有所帮助。
您可以尝试 SET TRIMSPOOL ON 和 SET LINESIZE,希望这会帮助您删除记录末尾多余的 space。
我有一个脚本,其中我将 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 目录。此外,将该目录的 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>
如果您检查输出文件的内容,您会发现每行的大小与每行的内容一样长。
希望对您有所帮助。
您可以尝试 SET TRIMSPOOL ON 和 SET LINESIZE,希望这会帮助您删除记录末尾多余的 space。