2012-04-27 5 views
0

誰でも次のSQLコードをプロシージャーに変換できますか?私はいくつかのwwwのソースを読んで、それがパッケージ化されるべきであるという結論を下したでしょうか?selectとinsert文を使用したsqlコードのプロシージャーへの変換

TRUNCATE TABLE MY_SCHEME.MAYA; 

INSERT INTO MY_SCHEME.MAYA (ID_TEST, 
            IQ, 
            DATE_, 
            COMMENT1) 
    SELECT ID_TEST, 
      IQ, 
      DATE_, 
      COMMENT1 
    FROM MY_SCHEME.STAGE_MAYA 
    where STAGE_MAYA.ID_TEST=(select max (ID_TEST) from MY_SCHEME.STAGE_MAYA) 

ありがとうございます!

+1

はPROCEDURE MAY12_PROCがあなたのTRUNCATE文の前に '」EXECUTE IMMEDIATEをBEGIN IS CREATE OR REPLACE'置きます。 'MAYA'と'; 'の間に' 'TRUNCATE'文の最後に' 'を入れてください。 'を追加します。 DBMS_OUTPUT.PUT_LINE( 'エラー:' || SQLCODE || '' || SQLERRM);それ以外の場合は例外です。 END MAY12_PROC; '最後の行の後。 –

+0

と記載されている。私はあなたが ";"という構文エラーを "修正"したのが好きです。 –

答えて

2

をする必要がありますあなたの場合は

手順を実行するとジョブが完了しますが、挿入したレコードの数を確認するにはMAYAテーブルを照会する必要があります。

すなわち

CREATE OR REPLACE 
PROCEDURE maya_insert 
IS 
BEGIN 
    -- Truncate the maya table 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA'; 
    -- 
    -- Insert records into maya 
    INSERT INTO MY_SCHEME.MAYA 
    (
    ID_TEST, 
    IQ, 
    DATE_, 
    COMMENT1 
    ) 
    SELECT ID_TEST, 
      IQ, 
      DATE_, 
      COMMENT1 
    FROM MY_SCHEME.STAGE_MAYA 
    WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST) 
            FROM MY_SCHEME.STAGE_MAYA); 
EXCEPTION 
    WHEN others 
    THEN 
     DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm); 
END maya_insert; 

あなたはCOMMIT;が、その後も例外セクションでROLLBACK;を追加する追加しない場合は、この手順の外のトランザクションのコミットされていない限り、あまりにもそこにCOMMIT;を置きたいと思うことがあります。 TRUNCATEステートメントをDDLとしてロールバックできないことに注意してください。ロールバックする機能が必要な場合は、遅いDELETEコマンド(DML)を使用する必要があります。

あなたはMAYAに挿入されたレコード数を知るために必要な場合、この関数を使用します。

CREATE OR REPLACE 
FUNCTION maya_insert 
    RETURN NUMBER 
IS 
BEGIN 
    -- Truncate the maya table 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA'; 
    -- 
    -- Insert records into maya 
    INSERT INTO MY_SCHEME.MAYA 
    (
    ID_TEST, 
    IQ, 
    DATE_, 
    COMMENT1 
    ) 
    SELECT ID_TEST, 
      IQ, 
      DATE_, 
      COMMENT1 
    FROM MY_SCHEME.STAGE_MAYA 
    WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST) 
            FROM MY_SCHEME.STAGE_MAYA); 

    -- Return the number of records inserted 
    RETURN SQL%ROWCOUNT; 
EXCEPTION 
    WHEN others 
    THEN 
     DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm); 
     RETURN -1; 
END maya_insert; 

すなわち

をここでは、挿入されたレコードの数を取得し、エラーがあなたがしてあった場合-1が返されます。あなたがそれらを必要とする場合は、COMMIT;ROLLBACK;のコメントが追加されています。

パッケージに関して。パッケージは、論理的に関連する関数プロシージャとその他の処理をデータベース内でグループ化するために使用されます。プロシージャまたは関数が1つしかないので、この段階でパッケージにラップする必要はありません。 を参照してください:http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/09_packs.htm#362

はそれが役に立てば幸い...

+0

それは多くの手助けをします。 – May12

+0

いつも大喜びです。 – Ollie

+0

もう一度質問してもよろしいですか?プロシージャを作成するというアイデアは、私がUNIXのバッチファイルからプロシージャを呼び出すことでした(今私は方法が分かりません)。私はバッチファイルの近くにmy_sql.sqlファイルを配置し、それから呼び出すことができますshファイル:sqlplusユーザーID = myscheme/0611 @ TEST_DB 10.33.19.13/test/DATA_UPLOAD/mysql_script.sql)。適切な方法は何ですか:ストアドプロシージャを呼び出すか、外部の.sqlファイルを呼び出しますか? – May12

0

パッケージには、複数のプロシージャ、関数、変数、定義を含めることができます。パッケージに含まれている関数ではなく、そのパッケージに対して許可を発行します。主な違いは、パッケージ内の関数のコードを変更する必要があるときに、パッケージ本体を置き換える(構文の作成または置換)ことができ、依存コードの無効化を引き起こさないことです。パッケージ外の関数を変更すると、常に従属コードが無効になります。あなたがあなたの究極の要件に応じてPROCEDUREまたはFUNCTIONのいずれかを使用することができます手順

関連する問題