Skip to content

Instantly share code, notes, and snippets.

@yukikim
Created March 17, 2025 23:46
Show Gist options
  • Save yukikim/9a623d6f40c48763ede28f63f85e17fa to your computer and use it in GitHub Desktop.
Save yukikim/9a623d6f40c48763ede28f63f85e17fa to your computer and use it in GitHub Desktop.
ストアードパッケージ例

Oracleでストアードパッケージを作成し、任意のテーブルのデータを別のテーブルにコピーする方法について説明します。以下は、基本的な手順とサンプルコードです。

ステップ1: ストアードパッケージの作成

  1. パッケージの定義:パッケージのインターフェース部分を定義します。
  2. パッケージの本体:パッケージの実装部分を作成します。

サンプルコード

以下は、source_tableからtarget_tableにデータをコピーするパッケージの例です。

-- パッケージの定義
CREATE OR REPLACE PACKAGE data_transfer_pkg AS
    PROCEDURE copy_data(p_source_table IN VARCHAR2, p_target_table IN VARCHAR2);
END data_transfer_pkg;
/

-- パッケージの本体
CREATE OR REPLACE PACKAGE BODY data_transfer_pkg AS
    PROCEDURE copy_data(p_source_table IN VARCHAR2, p_target_table IN VARCHAR2) IS
        v_sql VARCHAR2(4000);
    BEGIN
        -- 動的SQLを使用してデータをコピー
        v_sql := 'INSERT INTO ' || p_target_table || ' SELECT * FROM ' || p_source_table;
        
        EXECUTE IMMEDIATE v_sql;
    EXCEPTION
        WHEN OTHERS THEN
            -- エラーハンドリング
            RAISE_APPLICATION_ERROR(-20001, 'Error occurred: ' || SQLERRM);
    END copy_data;
END data_transfer_pkg;
/

説明

  1. copy_dataプロシージャ:このプロシージャは、ソーステーブル名とターゲットテーブル名を引数として受け取り、動的SQLを使用してデータをコピーします。
  2. 動的SQLEXECUTE IMMEDIATEを使用して、形成したSQL文を実行します。INSERT INTO target_table SELECT * FROM source_tableが生成されます。
  3. エラーハンドリングWHEN OTHERS THENを使ってエラーハンドリングを行い、問題が発生した場合トラブルシューティングのためのエラーメッセージを出力します。

ステップ2: プロシージャの呼び出し

パッケージを作成したら、以下のようにプロシージャを呼び出してデータをコピーできます。

BEGIN
    data_transfer_pkg.copy_data('source_table', 'target_table');
END;
/

注意事項

  • テーブルのスキーマ(列のデータ型や制約)が両方のテーブルで一致している必要があります。
  • 適切な権限(INSERT権限)を持っていることを確認してください。
  • 大量のデータをコピーする場合は、パフォーマンスに注意し、トランザクションを分けて処理することも検討してください。

これで、任意のテーブルのデータを別のテーブルにコピーするためのストアードパッケージの作成方法がわかりました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment