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

似乎没有任何方法可以改变这种行为。我能找到的唯一模糊参考分散在替换变量文档中,也许最连贯(但几乎没有确定性)在STARTdocs中,尽管它在@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

这些都对您没有太大帮助,但是评论太长了...

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

于 2013-07-08T12:23:54.100 回答