Oracle数据库中的&1 ..意味着什么

r0d*_*ney 4 database oracle

我在一个oracle脚本中看到了这一行

SELECT COUNT(*) INTO version1 FROM &1..xxdt WHERE version = 3310;
Run Code Online (Sandbox Code Playgroud)

我不明白这一&1..部分.我认为xxdt是表的名称,那么&1..前面的东西是什么?

Ed *_*bbs 9

&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
Run Code Online (Sandbox Code Playgroud)

点(.)将点后面的每个非空格字符附加到输入的值.请注意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
Run Code Online (Sandbox Code Playgroud)

两个点&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
Run Code Online (Sandbox Code Playgroud)

附录:David Aldridge提出的一个很好的建议,包括对SET DEFINE变量替换的快速解释.开始...

上面的替换是由SQLPlus完成的,其行为可以使用SET DEFINE以下方法控制:

  • SET DEFINE ON将允许替换并使用定义的替换字符.这通常是SQLPlus的默认值,当我运行上面的查询时就是这种情况.
  • SET DEFINE <char>设置替换字符.&符号(&)是通常的默认值.SQLPlus仅接受替换字符的非字母数字,非空格字符.请注意,在使用Oracle十多年的时间里,我从来没有必要更改此值.
  • SET DEFINE OFF将停止替代.如果你需要在查询或proc中有一个实际的文字&符号,请使用它,因为无论你把它放在哪里,SQLPlus都会将&符号视为替换字符,包括在字符串中.

  • +1:您可能想要使用SET DEFINE添加注释以更改使用的字符或禁用该功能. (2认同)