2013-07-08 50 views
1

以下行爲令我困惑。主腳本的(位置)參數在調用另一個腳本後發生改變。sqlplus參數的範圍

r1.sql

prompt script r1 : &1 

@r2 &1._xxx 

prompt script r1 : &1 

r2.sql

prompt script r2 : &1 

調用腳本:

SQL>sqlplus un/pw @r1 bla 

給出:

script r1 : bla 
script r2 : bla_xxx 
script r1 : bla_xxx 

反正有這種行爲嗎?將位置參數分配給另一個變量具有相同的問題。當在腳本中某處使用相同的變量名稱時,該值將被一個被調用的腳本覆蓋。是否有關於sqlplus變量範圍或如何控制範圍的文檔?

回答

1

似乎沒有任何方法可以改變這種行爲。唯一的含糊地提及我可以找到散佈在替代變量文檔,隨着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腳本中包含的文件。位置(或者如果有關的話)參數再次是DEFINEd,因此沒有範圍。綁定變量的行爲方式相同。將單獨的腳本與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是在每個腳本中定義唯一命名的變量,這些變量分配了位置參數,但這是一種痛苦,而且很難保證。

+0

我已經選擇啓動每個腳本:define _1 =&1等。這是一個痛苦,但唯一可以管理的解決方案。感謝您的精心解答。 –