使用包装器参数化的sql脚本

时间:2017-09-05 08:24:46

标签: sql oracle csv parameter-passing wrapper

我创建了下面的sql脚本,我试图使用zone和market ans参数化它将此脚本保存为wrapper.sql

define zone1= &1.
define market1= &2.
set lines etc
SET ECHO OFF
SET FEEDBACK OFF
SET HEAD OFF
SET LIN 256
SET WRAP OFF
SET PAGES 0
spool H:\extract_&zone1&market1..csv
select 'zone'         ||','||
       'market'         ||','||
       'id'                 
result from dual
union all
select zone    ||','||
       market    ||','||
       id     
from solution_report
where rownum <5 and zone = &zone1 and market = &market1;
/
spool off

现在因为我有23个区域,我创建了23个包装脚本并将其保存在文件wrapper_script.sql中。我想为每个区域生成23个excel文件。

@C:\Users\raw\Desktop\wrapper.sql As Asia
.
.
.
@C:\Users\raw\Desktop\wrapper.sql AF Africa

但是当我尝试运行这个wrapper_script.sql时,它会生成23个csv文件,但文件中没有数据。我正在使用oracle sql developer客户端来运行此脚本,因为我无法访问sql plus。

我不确定我是否在错误的地方使用假脱机,或者我在调用错误时调用错误,因为我在包装器中传递字符串值?

还有其他任何方法,以便它可以优化工作,而不是创建23个包装文件。

以下是我的选择查询结果,我相信我必须格式化区域和市场列的字符串。

zone,market,boutique_id
EUR,Belgium,1233
EUR,Portugal,1345
EUR,Portugal,1567

1 个答案:

答案 0 :(得分:1)

您需要在脚本中使用&1.&2.来引用第一个和第二个命令行参数。您可以立即将它们分配给命名变量,如下所示:

define zone1 = &1.
define market1 = &2.

最后的.是可选的,但我更喜欢在某些情况下始终使用它来避免含糊不清。