似乎沒有任何方法可以改變這種行爲。唯一的含糊地提及我可以找到散佈在替代變量文檔,隨着START
docs也許是最一致的(但幾乎沒有明確的)是,但它在@
和@@
很相似:
的START命令定義帶有參數 參數值的參數;如果您在本次會話中再次啓動腳本,則可以輸入新參數 或省略使用舊值的參數。
的「省略參數」部分意味着在一次調用中設置的位置參數仍然可用,這意味着他們必須在父腳本被設置爲好,只能重寫任何原始位置值。這也有點誤導 - 如果您再次腳本START
,但是已經運行了不同腳本,而且腳本之間有不同的參數,那麼您將無法獲得您可能期望的與原文相同的舊值;與r3.sql
扔進組合和r1.sql
修改爲:
prompt script r1 : &1
@r2 xxx
prompt script r1 : &1
@r3 yyy
prompt script r1 : &1
@r2
prompt script r1 : &1
...在文檔中的措辭暗示,以r2
第二個電話仍然會看到xxx
,但當然不會:
script r1 : bla
script r2 : xxx
script r1 : xxx
script r3 : yyy
script r1 : yyy
script r2 : yyy
script r1 : yyy
沒有任何運行r2
的概念相當於一個子shell。您的開始腳本剛剛加載到位,有點類似於帶有.
表示法的shell腳本中包含的文件。位置(或者如果有關的話)參數再次是DEFINE
d,因此沒有範圍。綁定變量的行爲方式相同。將單獨的腳本與START
調用並將其內容嵌入主腳本之間沒有任何行爲差異。
有趣的是,只有傳遞的位置變量被重新定義,所以如果用更少的參數調用內部腳本,則會保留一些原始內容;你不需要參考他們的效果就可以看到。事實上r2
可以是空文件,如果你有r1
爲:
prompt script r1 &1 &2
@r2 xxx
prompt script r1 &1 &2
...並運行它:
sqlplus x/yy @r1 foo bar
...你:
script r1 foo bar
script r1 xxx bar
其中沒有哪個對您有所幫助,但評論太長...
唯一的解決方法se ems是在每個腳本中定義唯一命名的變量,這些變量分配了位置參數,但這是一種痛苦,而且很難保證。
我已經選擇啓動每個腳本:define _1 =&1等。這是一個痛苦,但唯一可以管理的解決方案。感謝您的精心解答。 –