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 off
和 set 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中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章