2

次の動作は私を困惑させます。メイン スクリプトの (位置) パラメータは、別のスクリプトを呼び出した後に変更されます。

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 変数のスコープまたはスコープの制御方法に関するドキュメントはありますか?

4

1 に答える 1

1

この動作を変更する方法はないようです。START私が見つけることができる唯一の漠然とした参照は、置換変数のドキュメント全体に散らばって@います@@

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

...ドキュメントの文言は、 への2回目の呼び出しでr2も が表示されることを意味しますxxxが、もちろんそうではありません:

script r1 : bla
script r2 : xxx
script r1 : xxx
script r3 : yyy
script r1 : yyy
script r2 : yyy
script r1 : yyy

r2サブシェルに相当するもので実行するという概念はありません。スクリプトは、シェルスクリプトに含まれるファイルのように、所定の場所に読み込まれます.。位置 (または関連する場合は名前付き) パラメーターは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

どれもあまり役に立ちませんが、コメントするには長すぎます...

唯一の回避策は、位置パラメーターが割り当てられた各スクリプトで一意の名前の変数を定義することのようですが、それは面倒であり、絶対確実ではありません。

于 2013-07-08T12:23:54.100 に答える