6

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

SELECT COUNT(*) INTO version1 FROM &1..xxdt WHERE version = 3310;

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

4

4 回答 4

12

用户输入值的&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 都会将 & 符号视为替换字符。
于 2013-06-11T19:26:42.620 回答
0

我相信&符号用于替换变量。请参阅http://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php

替代变量

替换变量是 SQL*Plus 工具的一个特性。它们与数据库服务器处理 SQL 的方式无关。在语句中使用替换变量时,SQL*Plus 请求输入值并重写语句以包含它。重写的语句被传递到数据库。结果,数据库服务器对替换变量一无所知。下面的示例通过重复前面的测试来说明这一点,这次使用替换变量。

于 2013-06-11T19:26:08.470 回答
0

如果 SET CONCAT 是句点 (.) 并且您想在替换变量后立即附加句点,则一起使用两个句点。例如:

define mycity = Melbourne
spool &mycity..log

是相同的:

spool Melbourne.log

https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia#9_7

于 2015-06-04T13:54:07.263 回答
0

另一个例子:

在 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

(.) - 其中单点 (.) 将非空格字符附加到传递的参数值

谢谢!

于 2018-04-24T15:34:44.690 回答