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