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之前替换参数化表名?
谢谢
问题是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.
| 归档时间: |
|
| 查看次数: |
2333 次 |
| 最近记录: |