我可以为 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 通常是这种情况,默认情况下 defineaccept 或出现提示时对于变量值。但是这里你的变量值已经有了你需要的所有引号,所以它应该就像你在问题中实际显示的那样,没有引号:

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')

现在有效。