如何将表达式的结果分配给 SQL 替换变量?

Posted

技术标签:

【中文标题】如何将表达式的结果分配给 SQL 替换变量?【英文标题】:How do you assign the result of an expression to an SQL substitution variable? 【发布时间】:2015-09-01 23:50:27 【问题描述】:

你能评估一个表达式并将结果分配给一个替换变量吗?

就我而言,我需要调用一个包含替换变量的旧脚本。在调用脚本之前,我需要计算该变量的值。我正在使用 Oracle SQL 和 SQL*Plus

这是基本问题:

def this_num = 2+2
@old_script

old_script.sql 内部

select '&this_num' from dual;  -- Probably shouldn't change this

产量: '2+2'

有没有办法强制求值,以便替换变量获得表达式的结果,而不是表达式本身?

【问题讨论】:

【参考方案1】:
def this_num = 2+2
@old_script

old_script,你可以说

select &this_num from dual;

您不需要在变量名周围使用''。这应该可以。

【讨论】:

我至少会在它周围加上括号,以防它在其他表达式中使用,例如select &this_num * 3 from dual; 你说得对,是 ' 标记搞砸了。我包含了脚本来说明一个常见的复杂情况,即您的变量在遗留代码中使用,您可能会被禁止/害怕编辑。【参考方案2】:

可行的解决方案

我在这里找到了一个可行的答案:https://blogs.oracle.com/opal/entry/sqlplus_101_substitution_varia#2_5

这是相关的文字。

2.5 将查询列值存储在替换变量中

存储在数据库中的数据可以放入替换变量中:

SQL> column last_name new_value mynv
SQL> select last_name from employees where employee_id = 100;

COLUMN 命令中的 NEW_VALUE 选项隐式创建一个 名为“mynv”的替换变量。变量不是物理的 在查询引用 LAST_NAME 列之前创建。当查询 完成后,变量“mynv”保存最后检索到的值 “姓氏”列:

SQL> define mynv
DEFINE mynv      = "King" (CHAR)

所以你这样做:

column DUMMY_COLUMN_NAME new_value THIS_NUM
select 2+2 DUMMY_COLUMN_NAME from dual;

select '&&THIS_NUM' from dual;

'4'
------------
           4

多田!

邪恶的解决方案

出于娱乐价值,这是一个非常邪恶的解决方法,如果该变量碰巧在引号之外使用,则会中断:

define this_num = "' || 2+2 ||'" (CHAR)

然后:

select '&&this_num' from dual;

评估为:

select '' || 2+2 ||'' from dual;

产量:

'

4

【讨论】:

以上是关于如何将表达式的结果分配给 SQL 替换变量?的主要内容,如果未能解决你的问题,请参考以下文章

为什么不能将包含int和long变量的算术表达式的结果分配回int变量?

如何将相同的 var 类型变量分配给不同的 linq to sql 结果集?

如何将选择结果分配给变量?

用一个表达式将两个变量分配给相同的值? [复制]

将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)

C中赋值表达式的结果是啥? [复制]