Database 如何替换变量语法'&;1.';适用于用户/模式delimeter(“;”;)
我在甲骨文脚本中看到了这一行Database 如何替换变量语法'&;1.';适用于用户/模式delimeter(“;”;),database,oracle,sqlplus,Database,Oracle,Sqlplus,我在甲骨文脚本中看到了这一行 SELECT COUNT(*) INTO version1 FROM &1..xxdt WHERE version = 3310; 我不理解&1..部分。我认为xxdt是表的名称,那么它前面的&1..是什么呢 我相信符号和用于替换变量。看 替代变量 替换变量是SQL*Plus工具的一项功能。他们有 与数据库服务器处理SQL的方式无关。 在语句中使用替换变量时,SQL*Plus会请求 输入值并重写语句以包含该值。重写的 语句被传递到数据库。因此,数据库服务器
SELECT COUNT(*) INTO version1 FROM &1..xxdt WHERE version = 3310;
我不理解
&1..
部分。我认为xxdt是表的名称,那么它前面的&1..
是什么呢 我相信符号和用于替换变量。看
替代变量
替换变量是SQL*Plus工具的一项功能。他们有
与数据库服务器处理SQL的方式无关。
在语句中使用替换变量时,SQL*Plus会请求
输入值并重写语句以包含该值。重写的
语句被传递到数据库。因此,数据库服务器
对替换变量一无所知。下面的例子
通过重复上一个测试来说明这一点,这次使用
替代变量
&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
点(
)将点后面的每个非空格字符追加到输入的值。请注意,点后的值表格
如何附加到输入的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提出了一个很好的建议,包括快速解释
集合定义
,它与变量替换密切相关。这是
上面的替换由SQLPlus完成,其行为可以使用SET DEFINE
进行控制:
将允许替换并使用已定义的替换字符。这通常是SQLPlus默认值,在运行上述查询时也是如此SET DEFINE ON
设置替换字符。符号(SET DEFINE
)是通常的默认值。SQLPlus将只接受非字母数字、非空格字符作为替换字符。请注意,在使用Oracle的十多年中,我从未改变过这个值&
将停止替换。如果需要在查询或过程中使用实际的文字符号AND,请使用此选项,因为SQLPlus将把符号AND视为替换字符,无论您将其放置在何处,包括字符串中设置DEFINE OFF
define mycity = Melbourne
spool &mycity..log
同:
spool Melbourne.log
另一个例子:
在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
现在运行:
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
代码分解:
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)-第一个参数“listener”
(&2)-第二个参数“renamelistener”
(.log)-是&1的替代项
(.)-其中单点(.)附加非空格字符和传递参数值
谢谢 +1:您可能想添加一条关于使用SET DEFINE来更改使用的字符或禁用该功能的注释。谢谢,祝您通话愉快。我很少使用
SET DEFINE
,我从未想到:)我会将其添加到答案中。您的答案提供了&var..
用法的示例(从文档中复制和粘贴),但您没有回答问题:什么是&1..
?1
是一个变量吗?