oracle中的全局变量

Posted

技术标签:

【中文标题】oracle中的全局变量【英文标题】:Global variable in oracle 【发布时间】:2014-07-02 10:24:22 【问题描述】:

在Sql developer中我需要存储变量并在以后使用它怎么做?

   VARIABLE liab NUMBER;
    exec select nvl(LIAB_ID,-1)into liab FROM GETM_LIAB_CUST WHERE CUSTOMER_NO = (select   customer_id from apps_master where ACCOUNT_NUMBER='&C' AND BRANCH_CODE = '&B') ;

SPOOL c:\query.SQL
select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID =liab ;' FROM DUAL;
spool off

试过

column liabid new_value liab noprint
select nvl(LIAB_ID,-1) liabid FROM GETM_LIAB_CUST WHERE CUSTOMER_NO = (select customer_id from apps_master where ACCOUNT_NUMBER='&C' AND BRANCH_CODE = '&B') ;

它不起作用。请帮助我

【问题讨论】:

“它不起作用”到底是什么意思?错误消息、丢失/错误的输出、爆炸的烟花......? 嗨 Frank -- ORA-06550:第 2 行,第 34 列:PLS-00201:必须声明标识符“LIAB” ORA-06550:第 2 行,第 39 列:PL/SQL:ORA-00904 : : 标识符无效 ORA-06550: 第 2 行第 7 列: PL/SQL: SQL 语句被忽略 请不要在 cmets 中添加额外的信息。改为编辑您的问题(使用“编辑”按钮)。 【参考方案1】:

VARIABLE declares a bind variable,所以在引用的时候需要在前面加上冒号:

VARIABLE liab NUMBER;
exec select nvl(LIAB_ID,-1) into :liab FROM ...

SPOOL c:\query.SQL
select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID = ' || :liab || ';' FROM DUAL;
spool off

您也可以使用替换变量而不是绑定变量来做到这一点:

column liab new_value g_liab
select nvl(LIAB_ID,-1) as liab FROM ...

SPOOL c:\query.SQL
select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID = &g_liab;' FROM DUAL;
spool off

column x new_value y syntax 定义了一个替换变量 &y,其值是在后续查询中从名为 x 的列中设置的。

在这两种情况下,SQL Developer 都会将标题和您运行的命令放入假脱机文件中,因此您会看到:

> select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID = ' || :liab || ';' from dual
'SELECT*FROMGETB_UTILSWHERELIAB_ID='||:LIAB||';'                                 
----------------------------------------------------------------------------------
SELECT * FROM GETB_UTILS WHERE LIAB_ID = 1;                                        

> spool off

您可以添加 set heading offset echo off,但如果您直接从 SQL 工作表运行它,您仍然会得到:

> select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID = ' || :liab || ';' from dual
SELECT * FROM GETB_UTILS WHERE LIAB_ID = 1;                                        

要摆脱 echo'd 命令,您需要将其保存为脚本,然后从另一个工作表运行它,就像您之前的问题一样。因此,如果您有一个名为 liab.sql 的脚本,其中包含:

VARIABLE liab NUMBER;
set feedback off
exec select nvl(LIAB_ID,-1) into :liab FROM ...

set echo off
set heading off
SPOOL c:\query.SQL
select 'SELECT * FROM GETB_UTILS WHERE LIAB_ID = ' || :liab || ';' FROM DUAL;
spool off

...然后用

运行
@liab.sql

...query.sql 文件将只包含:

SELECT * FROM GETB_UTILS WHERE LIAB_ID = 1;                                     

【讨论】:

工作。谢谢亚历克斯 :) @user3737084 - 与您之前的问题一样,您需要将其作为脚本运行以允许set echo off 生效,因为它的行为与set termout 相同。我已经更新了答案以显示差异。

以上是关于oracle中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 表变量和临时表的区别

Oracle PL/SQL 动态 if 语句全局变量

ORACLE SQL:获取实例名称作为全局变量/常量

mybatise 设置全局变量实例

如何将 db(oracle) 查询的结果存储为全局变量,以便在 talend 的 RUN-IF 条件中使用?

如何判断函数中的变量是全局变量还是局部变量