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

amp*_*ent 1 oracle plsql sqlplus

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

在shell脚本中调用sqlplus:

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

@export.sql $OUT_FILE $SOME_VAR $ENV

exit
!
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当$ ENV设置为'dev'时,我明白了

Enter value for 3_TABLE 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Ale*_*ole 5

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

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

FROM &3._TABLE
Run Code Online (Sandbox Code Playgroud)

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

它在文档中,但闪烁,你会想念它:

如果要在替换变量之后立即追加字符,请使用句点将变量与字符分开.


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

FROM &4.&3._TABLE
Run Code Online (Sandbox Code Playgroud)

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

FROM &4..&3._TABLE
Run Code Online (Sandbox Code Playgroud)

将被替换为scott.dev_TABLE.