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 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
oraccept
或提示输入变量值时。但是在这里,您的变量值已经包含您需要的所有引号,因此它应该就像您在问题中实际显示的那样,没有引号:
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')
现在有效。
推荐阅读
- keras - 之后具有多个密集层的堆叠 LSTM
- php - 如何使用按钮更改页面 URL
- python - 尝试从外部脚本更新进度条时,QWidget 变得无响应
- symfony - Symfony 编译错误无法打开所需的代理
- asp.net-core - ASP.NET CORE MVC 项目中未显示字体真棒图标
- sql - SQL查询有条件地使用不同的表
- javascript - 创建一个 monorepo 而不托管在包注册表上并通过 bitbucket 安装
- java - tagForChildDirectedTreatment(boolean) 已弃用
- python - 批处理到 python 打开 chrome
- python-3.x - matplotlib 错误:AttributeError:“int”对象没有属性“toordinal”