2016-10-05 10 views
0

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

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

script.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; 

С уважением

+0

Я googled «имя файла динамической катушки sqlplus» и придумал много хитов. Самый первый был от Ask Tom и изложил метод, который вы должны адаптировать. [Link] (https: //asktom.oracle.com/pls/apex/f? P = 100: 11: 0 :::: P11_QUESTION_ID: 3581757800346555562) – EdStevens

ответ

1

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

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; 
1

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: \ filename.txt:

  1|   2|   3             
----------|----------|----------             
     1|   2|   3             
+0

Спасибо, Aleksej, но я хочу, чтобы один файл делал все. –

 Смежные вопросы

  • Нет связанных вопросов^_^