Oracle 我可以为SqlPlus中的值列表定义一个变量吗

Oracle 我可以为SqlPlus中的值列表定义一个变量吗,oracle,sqlplus,Oracle,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

例如,我有一个脚本(针对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命令未正确结束”,日志中的已验证语句如下所示:

select * from s1.t1 where f1 in '('val1','val2')'

所以我可以看到变量替换是在我的整个变量值周围加上单引号,这有点合理,但不是我想要的。有什么方法可以完成我想要的吗?

对我来说很好;基于Scott的EMP表的示例:

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

您的“已验证声明”最终为:

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

现在有效。

这正是您运行的吗?语句末尾缺少分号,这会引发错误。不过,替换看起来还行——我不知道您是如何从前面的语句中得到最终显示的代码,以及额外的单引号。。。。除非你真的在做
select*froms2.t2,其中f2在'&&var1'中在替换变量周围加引号;但是如果是这样的话,您还没有显示。您调用了shot-在&&var周围有单引号,并且没有注意到。谢谢