0

我有一个批处理文件,当我运行时调用一个 SQL 文件。此 SQL 文件提示用户输入我存储在 MYPeriod 中的数据(这接受日期作为输入)。SQL 文件的输出是一个 CSV 文件。这是我的 SQL 文件代码:

PROMPT Enter a period
ACCEPT MYPeriod PROMPT 'Period: '

SET LINESIZE 500 FEEDBACK OFF TRIMSPOOL ON TERMOUT OFF HEAD OFF PAGESIZE 0 TERM OFF

spool E:\abc\Test\File1_&MYPeriod.csv

select Account || ',' || Membername || ',' || GROUP || ',' || FUTURE1  from ACTUAL_V@UAT1_Test where Key=21 and period_name= '&MYPeriod' ;
spool off
exit

我的疑问:

  1. 当我运行它时,会在位置 E:\abc\Test 生成一个名为 File1_12-2012csv.Lst 的文件。我想要一个 csv 文件。如果我对文件名进行硬编码(通过测试替换 &MYPeriod) File1_Test.csv 会完美生成。为什么代码无法使用用户输入的名称创建文件..?

  2. 它的输出创建了一个 csv 文件并从 db 中检索帐户,但它在顶部打印了两行额外的行。新查询和旧查询。如何重新定义我的代码,以便它自动删除。

感谢你们的帮助。

4

1 回答 1

2

替换变量可选地以句点终止,以将它们与后面的任何字符分开。如果您也想在字符串中使用一个,则必须明确添加该终止:

spool E:\abc\Test\File1_&MYPeriod..csv

对于两个额外的行问题,添加set verify off; 目前它设置为on(默认情况下),因此它向您显示您使用的任何替换变量的旧值和新值。


我知道将日期放入文件名的唯一方法是首先将其放入替换变量中:

set termout off
column x_run_dt new_value y_run_dt
select to_char(sysdate, 'YYYYMMDDHH24MISS') as x_run_dt from dual;
set termout on
spool E:\abc\Test\File1_&MYPeriod._&y_run_dt..csv

new_value子句允许您创建一个替换变量,&y_run_dt在这种情况下,使用来自查询列的值,x_run_dt. set termout当作为脚本运行时,包装在子句之间生成该值的选择会将其从正常输出中隐藏。

于 2013-05-13T07:33:22.740 回答