在 sqlplus 输入文件中参数化表名
Posted
技术标签:
【中文标题】在 sqlplus 输入文件中参数化表名【英文标题】:Parameterizing table name in sqlplus input file 【发布时间】:2012-10-23 23:06:54 【问题描述】:我正在尝试使用 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' 时,我得到 p>
Enter value for 3_TABLE
而我希望它使用 dev_TABLE。当我取消参数化 sql 文件中的表名时,输出运行良好。另请注意,有参数 &2,它是来自 shell 的 $SOME_VAR,它显示得很好。唯一的问题在于 FROM 语句。
有没有办法告诉sql输入文件在运行SQL之前替换参数化的表名?
谢谢
【问题讨论】:
【参考方案1】:问题在于 SQL*Plus 将 &
之后的整个字符串,直到下一个空格或类似符号,作为替换变量名。显然这不是你想要的。
幸运的是他们已经想到了这一点,你可以用.
来表示变量名的结尾:
FROM &3._TABLE
(至少,这适用于命名变量,我几乎可以肯定它适用于位置变量......如果不是,那么您需要定义一个设置为 &3
的新变量作为解决方法)。
它在the documentation,但眨眼你就会错过它:
如果您希望在替换后立即附加字符 变量,使用句点将变量与字符分开。
您可能需要记住一个相关的影响,以备将来使用。如果替换变量之后的下一个字符无论如何都是.
- 例如在模式和表之间,或者在表和列之间 - 那么这将被解释为替换终止符。假设您将架构单独传递为&4
,值为'scott'
;这个:
FROM &4.&3._TABLE
看起来很合理,但会被替换为scottdev_TABLE
,这不会被识别。所以在那种情况下,你需要有一个额外的:
FROM &4..&3._TABLE
将被替换为scott.dev_TABLE
。
【讨论】:
老兄,你太棒了!!我现在要下班了,回家后会标记为答案(需要 10 分钟左右)以上是关于在 sqlplus 输入文件中参数化表名的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 动态行转列(参数化表名分组列行转列字段字段值)