将假脱机文件名作为批处理文件中的参数传递给SQL脚本 - 意外行为

时间:2016-10-03 18:16:29

标签: csv batch-file sqlplus

当我传递一个假脱机文件的名称时,我得到一个不正确的文件名。例如,我双击command.bat并输入' TEST' (在没有引号的情况下)在提示符下输入。脚本运行并正确查询数据库,但我的输出文件是' TESTcsv.LST' (再次没有引号)。如果我将文件名更改为正确的' TEST.csv',我可以看到输出正确。

command.bat:

@echo off
SET /P name="Enter name: "
sqlplus username/password @script.sql %name%

script.sql:

--A whole bunch of formatting code
...
spool T:\&1.csv
SELECT * FROM tablename WHERE somecol='&1';
spool off
exit

此外,如果我将sqlscript更改为:

spool T:\'&1'.csv

我的输出文件变为' TEST' .csv。当我省略单引号时,为什么要删除'。'在假脱机文件名中并附加' .LST'?

请注意,传递给脚本的参数也在查询中使用,没有任何问题。

我也尝试使用sqlcmd实用程序传递参数,但是没有运气,所以如果可能的话,我希望在没有sqlcmd的情况下使用它。现在,我可以重命名该文件,但每次需要运行脚本时都必须这样做有点烦人。

1 个答案:

答案 0 :(得分:0)

在搜索其他问题时,找到了以下回答我问题的内容。变量名必须以'。'结尾。正确连接变量和周围的字符串。 http://www.orafaq.com/node/515

  

现在,如果我想提示输入用户的名字(如Fred),并将提示设置为FredPrompt> ?简单地将变量填入其中将不会:

     

MyPrompt> set sqlp '&EnterNamePrompt> ' Enter value for enternameprompt: oops oops>

     

并且两者都不会连接,因为SQL * Plus不接受传递给其SET命令的值的连接:

     

oops> set sqlp '&EnterName' || 'Prompt> ' Enter value for entername: fred SP2-0158: unknown SET option "||" fred

     

此处要记住的超级用户提示是变量名称可以用句点终止。只需在变量名和后续文本之间插入一段时间:

     

SQL> set sqlp '&EnterName.Prompt> ' Enter value for entername: Fred FredPrompt>