在 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 将 &amp; 之后的整个字符串,直到下一个空格或类似符号,作为替换变量名。显然这不是你想要的。

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

FROM &3._TABLE

(至少,这适用于命名变量,我几乎可以肯定它适用于位置变量......如果不是,那么您需要定义一个设置为 &amp;3 的新变量作为解决方法)。

它在the documentation,但眨眼你就会错过它:

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


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

FROM &4.&3._TABLE

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

FROM &4..&3._TABLE

将被替换为scott.dev_TABLE

【讨论】:

老兄,你太棒了!!我现在要下班了,回家后会标记为答案(需要 10 分钟左右)

以上是关于在 sqlplus 输入文件中参数化表名的主要内容,如果未能解决你的问题,请参考以下文章

我可以在准备好的语句中参数化表名吗?

我可以在准备好的语句中参数化表名吗?

如何保护带有参数化表名的查询不被注入

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)