1

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

在 shell 脚本中调用 sqlplus:

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

@export.sql $OUT_FILE $SOME_VAR $ENV

exit
!

导出.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 文件中的表名时,输出运行良好。另请注意,有参数 &2,它是来自 shell 的 $SOME_VAR,它显示得很好。唯一的问题是在 FROM 语句中。

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

谢谢

4

1 回答 1

5

问题是 SQL*Plus 将 之后的整个字符串&,直到下一个空格或类似符号,作为替换变量名。显然这不是你想要的。

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

FROM &3._TABLE

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

它在文档中,但眨眼你就会错过它:

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


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

FROM &4.&3._TABLE

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

FROM &4..&3._TABLE

这将被替换为scott.dev_TABLE.

于 2012-10-23T23:16:31.167 回答