[英]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命令未正确结束”,并且日志中的已验证语句如下所示:
select * from s1.t1 where f1 in '('val1','val2')'
因此,我可以看到变量替换将单引号括在我的整个变量值上,这是合理的,但不是我想要的。 有没有办法在这里完成我想要的?
您的“已验证声明”最终显示为:
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')
现在有效。
对我来说行得通; 基于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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.