繁体   English   中英

我可以为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命令未正确结束”,并且日志中的已验证语句如下所示:

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的情况,默认情况下是带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')

现在有效。

对我来说行得通; 基于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM