2016-10-03 177 views
0

当我传入假脱机文件的名称时,我得到的文件名不正确。例如,我双击command.bat并在提示符处输入'TEST'(不带引号)并按回车。脚本运行并正确查询数据库,但是我的输出文件是'TESTcsv.LST'(再次没有引号)。如果我将文件名更改为适当的'TEST.csv',我可以看到输出是正确的。将spool文件名传递给SQL脚本作为批处理文件中的参数 - 意外行为

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的情况下运行,如果可能的话。目前,我可以重命名该文件,但每次需要运行该脚本时都必须这样做,这有点烦人。

+0

如果我编辑的阀芯命令是'卷轴T:\&1..csv',我得到正确的输出文件。如果有人能告诉我为什么第二个'。'是必要的,它将不胜感激。谢谢。 –

+0

'&'是一种将两个命令放在一行上的方法。 'dir&set'。这是特定的命令提示符。用双引号括起或用脱字符转义。 '复制con c:\ file ^&。txt'或'copy con“文件&.txt”'。 – 2016-10-03 19:48:29

+0

@Noodles在这种情况下,'&'是SQL脚本的一部分,而不是命令提示符。它只是传递给SQL脚本的第一个参数。问题是在SQL查询语句中,该参数显示正确,但在spool命令中却没有。 –

回答

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>

相关问题