以下行为让我感到困惑。调用另一个脚本后,主脚本的(位置)参数会发生变化。
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变量范围或如何控制范围的文档?
答案 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
这些对你没什么帮助,但评论太长了......
唯一的解决方法似乎是在每个脚本中定义唯一命名的变量,这些变量分配了位置参数,但这很痛苦而且几乎不是万无一失。