似乎没有任何方法可以改变这种行为。我能找到的唯一模糊参考分散在替换变量文档中,也许最连贯(但几乎没有确定性)在START
docs中,尽管它在@
and中非常相似@@
:
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 脚本中的文件。位置(或者如果相关的命名)参数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
这些都对您没有太大帮助,但是评论太长了...
唯一的解决方法似乎是在每个脚本中定义唯一命名的变量,这些变量分配了位置参数,但这很痛苦,而且很难做到万无一失。