在sqlplus输入文件中参数化表名

时间:2012-10-23 23:06:54

标签: oracle plsql sqlplus

我正在尝试使用sqlplus和Oracle假脱机功能导出一些数据。问题是我定义导出的SQL输入文件不允许我参数化我从中导出数据的表名 - 它想要一个文字:(

在shell脚本中调用sqlplus:

sqlplus $USER/$PASSWD@$ORADB<<!

@export.sql $OUT_FILE $SOME_VAR $ENV

exit
!

export.sql:

set heading off
set head off
set term off
set tab off
set embedded on
set feedback off
set pagesize 0
set linesize 800
set trimspool on
set verify off

spool &1

SELECT '&2|' || some_col
FROM &3_TABLE
/
spool off

当$ ENV设置为'dev'时,我得到

Enter value for 3_TABLE 

而我希望它使用dev_TABLE。当我取消参数化sql文件中的表名时,输出运行正常。另请注意,有一个param&amp; 2,它是来自shell的$ SOME_VAR,它显示得很好。唯一的问题是在FROM语句中。

在运行SQL之前,有没有办法告诉sql输入文件替换参数化表名?

由于

1 个答案:

答案 0 :(得分:5)

问题是SQL * Plus将&之后的整个字符串视为替换变量名称,直到下一个空格或者simlar。显然,这不是你想要的。

幸运的是,他们已经想到了这一点,你可以用.来表示变量名的结尾:

FROM &3._TABLE

(至少,这适用于命名变量,我几乎可以肯定它将用于定位变量......如果没有,那么你需要将一个新变量设置为&3作为变通方法)

它在the documentation,但是眨眼,你会想念它:

  

如果您希望在替换后立即附加字符   变量,使用句点将变量与字符分开。


您可能需要牢记未来的相关影响。如果替换变量之后的下一个字符无论如何都是. - 在模式和表之间,或者在表和列之间 - 例如 - 那么它将被解释为替换终止符。假设您将模式单独传递为&4,值为'scott';这样:

FROM &4.&3._TABLE

看起来很合理但会被替换为scottdev_TABLE,这将无法识别。所以在这种情况下你需要额外的一个:

FROM &4..&3._TABLE

将被替换为scott.dev_TABLE