1

sqlplusとOracleスプール機能を使用していくつかのデータをエクスポートしようとしています。問題は、エクスポートを定義しているSQL入力ファイルで、データのエクスポート元のテーブル名をパラメーター化できないことです。リテラルが必要です:(

シェルスクリプトで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'に設定されている場合、

Enter value for 3_TABLE 

一方、dev_TABLEを使用したいのですが。SQLファイルのテーブル名のパラメーターを解除すると、出力は正常に実行されます。また、シェルからの$ SOME_VARであるparam&2があり、正常に評価されて表示されることにも注意してください。唯一の問題はFROMステートメントにあります。

SQLを実行する前にパラメータ化されたテーブル名を置き換えるようにSQL入力ファイルに指示する方法はありますか?

ありがとう

4

1 に答える 1

5

問題は、SQL*Plus が . の後の文字列全体&を次の空白または simlar までを置換変数名として扱っていることです。明らかに、それはあなたがここで望んでいるものではありません。

幸いなことに、彼らはこれを考えており、変数名の末尾を.:で示すことができます。

FROM &3._TABLE

(少なくとも、それは名前付き変数では機能しますが、位置変数でも機能すると確信しています...そうでない場合は&3、回避策としてに設定された新しい変数を定義する必要があります)。

それはドキュメンテーションにありますが、点滅すると見逃してしまいます:

置換変数の直後に文字を追加する場合は、ピリオドを使用して変数と文字を区切ります。


将来のために心に留めておきたい関連する影響があります。置換変数の後の次の文字が.とにかくである場合 (たとえば、スキーマとテーブルの間、またはテーブルと列の間)、それは置換ターミネータとして解釈されます。スキーマを個別に as &4, with value 'scott';として渡していたとします。これ:

FROM &4.&3._TABLE

合理的に見えますがscottdev_TABLE、認識されない として置き換えられます。したがって、その場合、追加のものが必要です。

FROM &4..&3._TABLE

として置き換えられscott.dev_TABLEます。

于 2012-10-23T23:16:31.167 に答える