Имя файла динамической очереди SQLPlus

У меня есть база данных Oracle, и я хочу экспортировать данные в файл. Однако имя файла, расширение и разделитель будут иметь значение из таблицы. Проблема в том, что я не могу использовать значения из таблицы. Не могли бы вы предложить мне способ сделать это? Или если я могу сделать это с пакетом?

Таблица(идентификатор, путь, имя файла, расширение, разделитель)

скрипт.sql

conn ....
variable fullpath varchar2(20);
variable filename varchar2(10);  
variable extension varchar2(5);  
variable sep varchar2(1);

begin
  select filename, path, extension,separator
  into :filename, :fullpath, :extension, :sep
  from Table;
end;
/

set separator sep

spool fullpath||filename||'.'||extension;
... select queries...
spool off;

С уважением


person Seth De    schedule 05.10.2016    source источник
comment
Я погуглил имя файла динамической очереди sqlplus и нашел много совпадений. Самый первый был от Ask Tom и обрисовывал в общих чертах метод, который вы должны быть в состоянии адаптировать. 0::::P11_QUESTION_ID:3581757800346555562" rel="nofollow noreferrer">asktom.oracle.com/pls/apex/)   -  person EdStevens    schedule 06.10.2016


Ответы (2)


Вы можете использовать подстановочные переменные и предложение new_value команды column.

conn ....

column spool_path new_value sub_spool_path noprint
column sep new_value sub_sep noprint
set verify off
set termout off

select path || filename ||'.'|| extension as spool_path, separator as sep
from Table;

set termout on

set separator &sub_sep

spool &sub_spool_path
... select queries...
spool off;
person Alex Poole    schedule 05.10.2016

SPOOL — это команда SQLPlus, поэтому вы не можете динамически использовать ее в блоке PlSQL.

Одним из способов может быть создание во время выполнения второго сценария, динамически построенного на основе вашего запроса, а затем запуск его для выполнения задания. Например:

conn ...
set serveroutput on
set feedback off
variable fullpath varchar2(20);
variable filename varchar2(10);  
variable extension varchar2(5);  
variable sep varchar2(1);
/* spool to a fixed file, that will contain your dynamic script */
spool d:\secondScript.sql
begin
  select 'filename', 'd:\', 'txt', '|'
  into :filename, :fullpath, :extension, :sep
  from dual;

  /* write the second script */

  dbms_output.put_line('set colsep ' || :sep);
  dbms_output.put_line('spool ' || :fullpath || :filename || '.' || :extension);
  dbms_output.put_line('select 1, 2, 3 from dual;');
  dbms_output.put_line('spool off');
end;
/
spool off  

/* run the second script */
@d:\secondscript.sql

Это дает:

SQL> sta C:\firstScript.sql
Connected.
set colsep |
spool d:\filename.txt
select 1, 2, 3 from dual;

         1|         2|         3
----------|----------|----------
         1|         2|         3

d:\имя_файла.txt:

         1|         2|         3                                                
----------|----------|----------                                                
         1|         2|         3                                                
person Aleksej    schedule 05.10.2016