Как я могу избавиться от пробелов, вызванных тем, что размер строки PLSQL больше, чем данные в каждой строке? - PullRequest
0 голосов
/ 14 января 2019

У меня есть скрипт, в котором я установил LINESIZE на 1000.

В результате строки, которые я выводил через dbms_output.put_line, выходят с тем большим количеством лишних пробелов, которые необходимы, чтобы заполнить строку 1000 символов.

Как я могу изменить параметр размера строки или скрипт, чтобы содержимое могло установить размер строки и избежать пробелов в моем выходном файле?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете попробовать SET TRIMSPOOL ON вместе с SET LINESIZE, надеясь, что это поможет вам удалить дополнительное место в конце записи.

0 голосов
/ 14 января 2019

Хм, если есть способ, я его не знаю. Простая процедура (которая имитирует то, что вы описали) делает именно то, что вы сказали - каждая строка длиной 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, поэтому я выбрал его временный каталог. Кроме того, предоставьте read и write привилегии для этого каталога пользователю, который будет его использовать (Скотт в моем примере):

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>

Если вы проверите содержимое выходного файла, вы увидите, что строки имеют переменный размер, при условии, что содержимое каждой строки.

Надеюсь, это поможет.

...