带有参数

时间:2018-09-11 14:41:30

标签: sql oracle sqlplus spool

我有一个从命令行执行的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子句

考虑到这样的输出,我需要变量来存储整个输出。但是我不知道如何使用DBMS_OUTPUT.PUT_LINE继续正确读取* csv文件 谁能帮忙执行此任务吗? 预先感谢!

1 个答案:

答案 0 :(得分:3)

您不需要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
如果您传递3作为参数值,则

将给出文件 STOCK_3.csv