我可以为 SqlPlus 中的值列表定义变量吗
Can I define a variable for a list of values in SqlPlus
我有一个脚本(用于 Oracle),其中包含许多 sql 语句,它们都针对相同的值列表,例如
select * from s1.t1 where f1 in ('val1', 'val2')
select * from s2.t2 where f2 in ('val1', 'val2')
-- etc.
我不想将这个值列表粘贴到脚本的每个位置,而是定义一个变量来保存该列表,然后在正确的位置使用它,例如:
define var1 = "('val1','val2')"
select * from s1.t1 where f1 in &&var1
select * From s2.t2 where f2 in &&var1
当我按照上面写的方式尝试时,我收到错误 "ORA-00933: SQL command not properly ended",日志中经过验证的语句如下所示:
select * from s1.t1 where f1 in '('val1','val2')'
所以我可以看到变量替换是在我的整个变量值周围加上单引号,这是合理的,但不是我想要的。有什么办法可以在这里完成我想要的吗?
适合我;基于 Scott 的 EMP 的示例 table:
SQL> define vjob = "('CLERK', 'MANAGER')"
SQL> select count(*) from emp where job in &vjob;
old 1: select count(*) from emp where job in &vjob
new 1: select count(*) from emp where job in ('CLERK', 'MANAGER')
COUNT(*)
----------
7
您的 'verified statement' 结果为:
select * from s1.t1 where f1 in '('val1','val2')'
这意味着,如果您已经按照您所说的那样定义了替换变量,那么您的查询实际上是将其用作:
select * from s1.t1 where f1 in '&&var1';
old:select * from s1.t1 where f1 in '&&var1'
new:select * from s1.t1 where f1 in '('val1','val2')'
SQL Error: ORA-00933: SQL command not properly ended
当值是不带引号的字符串时,必须用单引号括起变量,new_value
通常是这种情况,默认情况下 define
或 accept
或出现提示时对于变量值。但是这里你的变量值已经有了你需要的所有引号,所以它应该就像你在问题中实际显示的那样,没有引号:
select * from s1.t1 where f1 in &&var1;
old:select * from s1.t1 where f1 in &&var1
new:select * from s1.t1 where f1 in ('val1','val2')
现在有效。
我有一个脚本(用于 Oracle),其中包含许多 sql 语句,它们都针对相同的值列表,例如
select * from s1.t1 where f1 in ('val1', 'val2')
select * from s2.t2 where f2 in ('val1', 'val2')
-- etc.
我不想将这个值列表粘贴到脚本的每个位置,而是定义一个变量来保存该列表,然后在正确的位置使用它,例如:
define var1 = "('val1','val2')"
select * from s1.t1 where f1 in &&var1
select * From s2.t2 where f2 in &&var1
当我按照上面写的方式尝试时,我收到错误 "ORA-00933: SQL command not properly ended",日志中经过验证的语句如下所示:
select * from s1.t1 where f1 in '('val1','val2')'
所以我可以看到变量替换是在我的整个变量值周围加上单引号,这是合理的,但不是我想要的。有什么办法可以在这里完成我想要的吗?
适合我;基于 Scott 的 EMP 的示例 table:
SQL> define vjob = "('CLERK', 'MANAGER')"
SQL> select count(*) from emp where job in &vjob;
old 1: select count(*) from emp where job in &vjob
new 1: select count(*) from emp where job in ('CLERK', 'MANAGER')
COUNT(*)
----------
7
您的 'verified statement' 结果为:
select * from s1.t1 where f1 in '('val1','val2')'
这意味着,如果您已经按照您所说的那样定义了替换变量,那么您的查询实际上是将其用作:
select * from s1.t1 where f1 in '&&var1';
old:select * from s1.t1 where f1 in '&&var1'
new:select * from s1.t1 where f1 in '('val1','val2')'
SQL Error: ORA-00933: SQL command not properly ended
当值是不带引号的字符串时,必须用单引号括起变量,new_value
通常是这种情况,默认情况下 define
或 accept
或出现提示时对于变量值。但是这里你的变量值已经有了你需要的所有引号,所以它应该就像你在问题中实际显示的那样,没有引号:
select * from s1.t1 where f1 in &&var1;
old:select * from s1.t1 where f1 in &&var1
new:select * from s1.t1 where f1 in ('val1','val2')
现在有效。