sqlplus参数的范围

时间:2013-07-08 09:42:15

标签: oracle 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 个答案:

答案 0 :(得分: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,但当然不会:{/ p>

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

没有任何概念在等效的子shell中运行r2。您的开始脚本刚刚加载到位,有点像包含在带有.表示法的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

这些对你没什么帮助,但评论太长了......

唯一的解决方法似乎是在每个脚本中定义唯一命名的变量,这些变量分配了位置参数,但这很痛苦而且几乎不是万无一失。