※ ChatGPTを利用し、要約された質問です(原文:SQLスクリプト内で、${変数}と記述しても値を認識できない?)
SQLスクリプト内で、変数と記述しても値を認識できない?
このQ&Aのポイント
SQLスクリプト内で変数と記述すると値が認識されず、コンパイルに失敗します。
トリガ作成スクリプトで変数を使用すると値が文字列として解釈されます。
変数の値を直接記述すると正常にコンパイルできます。
SQLスクリプト内で、${変数}と記述しても値を認識できない?
USER.TABLE_LNK_TRG.shにて、トリガ作成スクリプトUSER.TABLE_LNK_TRG.sqlをコンパイルしようとしています。
USER.TABLE_LNK_TRG.shとUSER.TABLE_LNK_TRG.sqlともに
変数ORACLE_SID_1の値としてdb1、
変数ORACLE_SID_2の値としてdb2
が入っているはずなのですが、USER.TABLE_LNK_TRG.sql内では
${ORACLE_SID_1}と${ORACLE_SID_2}がそのまま文字列として解釈され
(変数の値であるdb1、db2にはならない)、コンパイルに失敗します。
逆にUSER.TABLE_LNK_TRG.sql内で、${ORACLE_SID_1}と${ORACLE_SID_2}
を使わず、直接db1、db2と記述すると成功します。
トリガ作成スクリプトUSER.TABLE_LNK_TRG.sql内で、${変数}は使えないのでしょうか?
環境はOSはSolaris、DBはOracle9i、シェルはBシェルです。
_______________________________________________________________
~USER.TABLE_LNK_TRG.sh~
#!/bin/sh
ORACLE_SID_1="db1"
ORACLE_SID_2="db2"
#トリガコンパイル
sqlplus aaa/aaa <<-EOF
@USER.TABLE_LNK_TRG.sql
quit
EOF
exit
______________________________________________________________
~USER.TABLE_LNK_TRG.sql~
CREATE OR REPLACE TRIGGER USER.TABLE_LNK_TRG
BEFORE UPDATE
ON USER.TABLE FOR EACH ROW
declare
begin
update TABLE@${ORACLE_SID_1}_lnk
set col = :new.col;
update TABLE@${ORACLE_SID_2}_lnk
set col = :new.col;
exception
when others then
null;
end;
/
_______________________________________________________________
※${ORACLE_SID_1}、${ORACLE_SID_2}のままコンパイルされるので、
${ORACLE_SID_1}_lnkのDB環境、${ORACLE_SID_2}_lnkのDB環境が存在せずコンパイルエラー。
逆に直接db1、db2と記述するとdb1_lnkのDB環境、db2_lnkのDB環境が存在するので正常にコンパイル。