0

次の要件から生じる 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 ループを使用することは可能ですか?

  1. また、INSERT ステートメントの RETURNING INTO オプションが機能していません。UNIX(sqlplus) で実行した場合、これに相当するものは何でしょうか?

3.次のようなスクリプト内からアドホック ストアド プロシージャを呼び出すことは可能ですか?

execute SP_RTB_UPDATES('DECLARE v_var1....');

または、監査テーブルを処理するためにクエリと書き込み追加クエリを分離する必要がありますか? しかし、これはストアド プロシージャと同じくらい安全でしょうか?

お知らせ下さい。前もって感謝します!

4

1 に答える 1

0

これは部分的な回答です。シェル コマンドと sqplus コマンドを混在させています。ヒア ドキュメントを作成しました。これは、sqlplus に直接入力するのと非常によく似ています。

if [ $? -eq 0 ]

sqlplus ではなくシェル コマンドです。sqlplus が失敗した場合、ヒア ドキュメント内に入ることはありません。そのように機能するかどうかをテストしないでください。

sqlplus usr/pwsd@instance <<-EOF

-- sqlplus DML and PL/SQL only commands in here: SELECt, UPDATE, etc.    
EOF
[ $? -ne 0 ] && echo 'failure'

同様read RMSに、ヒアドキュメントの前。

「全体コマンド アドホック」の作成に関しては、EXEC IMMEDIATE - 動的 SQL を使用します。

RMS=13
USER=foo
PSWD=foo
mycommand=$(printf "EXEC immediate 'select blah from table where blah = %s';"  "$RMS" )

sqlplus @USER/$PWSD/@instance <<-EOF
    $mycommand
EOF

上記は単なる例です。ここでこれを行う方法を学び、動的 SQL のページの下部にあるリンクに従ってください。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm

于 2013-05-22T00:16:03.227 に答える