файл спула sqlplus с параметром - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть файл sql, который выполняется из командной строки, он отлично работает.

sqlplus username/password@DBInstance @filename.sql

Мой filename.sql выглядит примерно так:

set colsep ';'
set echo off
set feedback off
set sqlprompt ''
set trimspool on
set headsep off
set termout off
--set define off
set serveroutput on
set verify off
set autoprint off
set pagesize 0
set linesize 9999 
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

spool STOCK.csv

SELECT ils.item
  || ';'
  || ';'
  || ';'
... 
Where loc = store_no
--store_no is typed in the script by hand--
...;
spool off
exit

После выполнения команды sqlplus я получаю файл csv со всеми выбранными строками, которые разделены символом ';'для конкретного значения store_no все работает нормально.Что мне нужно, это отправить store_no в качестве параметра и для каждого параметра получить новый соответствующий * CSV-файл.Так что я могу запустить, например:

sqlplus username/password@DBInstance @filename.sql 3

И получить * CSV-файл, где store_no = 3. Я искал некоторые решения и не сделалполучить правильный.Я думаю, что я не далеко с этим решением:

set colsep ';'
set echo off
set feedback off
set sqlprompt ''
set trimspool on
set headsep off
set termout off
--set define off
set serveroutput on
set verify off
set autoprint off
set pagesize 0
set linesize 9999
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

spool STOCK.csv

DECLARE
store_no number := &1;
BEGIN

SELECT ils.item
      || ';'
      || ';'
      || ';'
    ... 
    Where loc = store_no
    ... ;
END;
/
spool off
exit

В качестве вывода я получаю это: PLS-00428: В этом операторе SELECT ожидается предложение INTO

Учитывая такой вывод, мне нужна переменная, чтобы хранить там весь вывод.Но я не знаю, как правильно читать * csv файл, используя DBMS_OUTPUT.PUT_LINE Кто-нибудь может помочь, как выполнить эту задачу?Заранее спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Для этого вам не нужен блок PL / SQL.

Скажем, у вас есть такая таблица:

create table yourTable(loc number, item varchar2(10));
insert into yourTable values (1, 'one');
insert into yourTable values (2, 'two');
insert into yourTable values (3, 'three');

со скриптом test.sql вот так:

set colsep ';'
set echo off
set feedback off
set sqlprompt ''
set trimspool on
set headsep off
set termout off
set serveroutput on
set verify off
set autoprint off
set pagesize 0
set linesize 9999
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

spool d:\temp\STOCK.csv

SELECT item
      || ';'
      || ';'
      || ';'
    from yourTable 
    Where loc = &1;
spool off
exit

и этот вызов:

sqlplus usr/pwd@DB @test.sql 3

вы получите файл наподобие:

three;;;

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

spool d:\temp\STOCK_&1..csv

даст файл STOCK_3.csv , если вы передадите 3 в качестве значения параметра

...