首页 > 解决方案 > 我可以为 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')'

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

标签: oraclesqlplus

解决方案


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

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默认情况下使用defineoraccept或提示输入变量值时。但是在这里,您的变量值已经包含您需要的所有引号,因此它应该就像您在问题中实际显示的那样,没有引号:

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

现在有效。


推荐阅读