我正在尝试使用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输入文件替换参数化表名?
由于
答案 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
。