2016-10-03 182 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>

相關問題