我在 oracle 脚本中看到了这一行
SELECT COUNT(*) INTO version1 FROM &1..xxdt WHERE version = 3310;
我不明白这&1..
部分。我认为xxdt是表的名称,那么&1..
它前面的东西是什么?
用户输入值的&1
提示。请注意输入的值如何mytable
替换&1
如下:
SQL> SELECT COUNT(*) FROM &1 WHERE col1 = 12;
Enter value for 1: mytable
old 1: SELECT COUNT(*) FROM &1 WHERE col1 = 12
new 1: SELECT COUNT(*) FROM mytable WHERE col1 = 12
COUNT(*)
----------
0
点 ( .
) 将点后的每个非空格字符附加到输入的值。请注意table
点后的值如何附加到输入的my
:
SQL> SELECT COUNT(*) FROM &1.table WHERE COL1 = 12;
Enter value for 1: my
old 1: SELECT COUNT(*) FROM &1.table WHERE COL1 = 12
new 1: SELECT COUNT(*) FROM mytable WHERE COL1 = 12
COUNT(*)
----------
0
中的两个点&1..xxdt
不是特殊运算符。第一个点表示追加;第二个点是字面的。看起来&1
您的示例中的 用于提示输入架构/所有者名称。请注意下面我如何输入ed
并&1..mytable
转换为ed.mytable
:
SQL> SELECT COUNT(*) FROM &1..mytable WHERE COL1 = 12;
Enter value for 1: ed
old 1: SELECT COUNT(*) FROM &1..mytable WHERE COL1 = 12
new 1: SELECT COUNT(*) FROM ed.mytable WHERE COL1 = 12
COUNT(*)
----------
0
附录:David Aldridge 提出的很好的建议,包括对 的快速解释SET DEFINE
,这与变量替换密切相关。开始...
上面的替换是由 SQLPlus 完成的,它的行为可以通过使用来控制SET DEFINE
:
SET DEFINE ON
将允许替换并使用定义的替换字符。这通常是 SQLPlus 的默认设置,当我运行上面的查询时就是这种情况。SET DEFINE <char>
设置替换字符。和号 ( &
) 是通常的默认值。SQLPlus 将只接受非字母数字、非空格字符作为替换字符。请注意,在使用 Oracle 的十多年中,我从未改变过这个值。SET DEFINE OFF
将停止替换。如果您需要在查询或 proc 中有一个实际的文字 & 符号,请使用它,因为无论您将它放在哪里,包括在字符串中,SQLPlus 都会将 & 符号视为替换字符。我相信&符号用于替换变量。请参阅http://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php
替代变量
替换变量是 SQL*Plus 工具的一个特性。它们与数据库服务器处理 SQL 的方式无关。在语句中使用替换变量时,SQL*Plus 请求输入值并重写语句以包含它。重写的语句被传递到数据库。结果,数据库服务器对替换变量一无所知。下面的示例通过重复前面的测试来说明这一点,这次使用替换变量。
如果 SET CONCAT 是句点 (.) 并且您想在替换变量后立即附加句点,则一起使用两个句点。例如:
define mycity = Melbourne
spool &mycity..log
是相同的:
spool Melbourne.log
https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia#9_7
在 vi 编辑器中使用以下查询创建文件 run.sql:
vi run.sql
select 'mv &1..log &2._' ||to_char(sysdate,'DD-MON-YYYY-HH24-MI') || '.log' from dual;
:wq
现在运行:
sqlplus scott/tiger @run.sql listener renamelistener
代码分解:
(&1) -第一个参数“监听器”
(&2) -第二个参数“renamelistener”
(.log) - 替换为 &1
(.) - 其中单点 (.) 将非空格字符附加到传递的参数值
谢谢!