次の要件から生じる 3 つの部分からなる質問があります。シェル スクリプトを使用していくつかのストアド プロシージャを自動化するように依頼されました。以前は、ストアド プロシージャの性質 (定義ではなく、PL/SQL での実行方法) は次のようでした。
begin
SP_RTB_UPDATE('DECLARE v_var1;
begin
INSERT INTO TRADINGACCOUNT(TAEXTREFSEQID, TRADINGACCOUNTID,
LASTUPDATEDBY, LASTUPDATEDATE,
EXTERNALSYSTEMREFERENCEVALUE)
VALUES (SEQ_TA_EXT_REF_ID.NEXTVAL,12345,
9999,sysdate,
v_var1)
RETURNING TAEXTREFSEQID INTO V_PK;
INSERT INTO EXTREFSTATUS( TAEXTREFSEQID, SINCEDATETIME,
STATUSID, LASTUPDATEDBY )
VALUES ( V_PK, SYSDATE, 54, 9999 );');
end;
基本的に、ストアド プロシージャは、クエリ全体を最初のパラメータとして受け入れるアドホック プロシージャです。内部的には、proc はいくつかの監査テーブルを (クエリと共に) 実行して、履歴/変更を保存します。今、私がやりたいことは、手動の介入なしでストアド プロシージャを自動化できるシェル スクリプトを設計することです。
私はこのようなことをしました
#!/bin/bash
echo "Please enter your username"
read DBUSER
echo "Please enter your password"
read DBUSERPASSWORD
echo "Please enter the Database name"
read DBSID
sqlplus -S $DBUSER/$DBUSERPASSWORD@$DBSID <<EOF
if [ $? -eq 0 ]
then
echo "Connection OK"
echo "Please insert the RMS code to be added"
read RMS
INSERT INTO TRADINGACCOUNT(TAEXTREFSEQID,TRADINGACCOUNTID,
LASTUPDATEDBY, LASTUPDATEDATE,
EXTERNALSYSTEMREFERENCEVALUE )
VALUES (SEQ_TA_EXT_REF_ID.NEXTVAL,12345,
9999,sysdate,
'$RMS')
RETURNING TAEXTREFSEQID INTO V_PK;
INSERT INTO EXTREFSTATUS( TAEXTREFSEQID, SINCEDATETIME,
STATUSID, LASTUPDATEDBY )
VALUES ( V_PK, SYSDATE, 54, 9999 );
COMMIT;
ECHO "Done Successfully"
else
echo "Connection NOT OK"
fi
現在、このコードには多くの問題があります。以下は私の疑問です。
1. if [ $? eq 0 ]..
「不明なコマンド、残りの行は無視されました」としてエラーをスローしています。したがって、sqlplus(unix) ステートメントで IF-ELSE/WHILE ループを使用することは可能ですか?
- また、INSERT ステートメントの RETURNING INTO オプションが機能していません。UNIX(sqlplus) で実行した場合、これに相当するものは何でしょうか?
3.次のようなスクリプト内からアドホック ストアド プロシージャを呼び出すことは可能ですか?
execute SP_RTB_UPDATES('DECLARE v_var1....');
または、監査テーブルを処理するためにクエリと書き込み追加クエリを分離する必要がありますか? しかし、これはストアド プロシージャと同じくらい安全でしょうか?
お知らせ下さい。前もって感謝します!