0

次のSQLコードをプロシージャに変換するのを手伝ってくれる人はいますか? 私はいくつかのwwwソースを読んで、それがパッケージであるべきだという結論を出しました(そうかもしれません)?

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)

どうもありがとう!

4

2 に答える 2

2

最終的な要件に応じて、 aPROCEDUREまたは a のいずれかを使用できます。FUNCTION

手順で作業を完了できますが、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;この手順の外でトランザクションをコミットする場合を除き、そこにもa をCOMMIT;入れたいと思うかもしれませんROLLBACK;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

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

于 2012-04-27T12:46:09.487 に答える
0

パッケージには、複数のプロシージャ、関数、変数、および定義を含めることができます。パッケージに含まれる関数ではなく、パッケージに対して許可を発行します。主な違いは、パッケージ内の関数のコードを変更する必要がある場合、パッケージ本体を置き換える (構文を作成または置き換える) ことができ、これによって依存コードが無効化されないことです。パッケージ外の関数を変更すると、常に依存コードが無効になります。

その場合は手続きが必要です

于 2012-04-27T08:53:47.983 に答える