すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:ストアドプロシージャ

最終更新日:Sep 29, 2024

SQLストアドプロシージャは、プリコンパイルされたSQLステートメントのセットです。 ストアドプロシージャ名と関連するパラメーターを指定して、定義された操作を実行することで、ストアドプロシージャを呼び出すことができます。 このトピックでは、ストアドプロシージャの使用方法について説明します。

背景情報

AnalyticDB for PostgreSQL V6.0は、関数を使用してストアドプロシージャのほとんどの機能を実装できます。 ただし、関数は追加のワークロードを生成し、トランザクション制御をサポートしません。 これにより、関数はストアドプロシージャに適さなくなります。 これらの問題を解決するために、AnalyticDB for PostgreSQL V7.0にはストアドプロシージャ機能があります。

V7.0では、ストアドプロシージャでトランザクションを直接制御できます。 ストアドプロシージャは、SQL文を変更することなく、Oracleなどの従来のデータウェアハウスからAnalyticDB for PostgreSQLにデータを移行するのに役立ちます。

メリット

AnalyticDB for PostgreSQL V7.0のエンジンバージョンがPostgreSQL 12にアップグレードされました。 これにより、ストアドプロシージャの実装が容易になります。 ストアドプロシージャには、次の利点があります。

  • ストアドプロシージャは、特定のビジネスロジックを定義する一連のSQL文を統合します。 これにより、ストアドプロシージャの保守が容易になり、データベース開発者の効率が大幅に向上します。

  • ストアドプロシージャを呼び出すプロセスは簡単です。 データベース開発者は、さまざまなビジネスシナリオでストアドプロシージャを効率的に再利用できます。

  • データベースのセキュリティを向上させるために、異なるストアドプロシージャに異なるユーザー権限を付与できます。

使用上の注意

ストアドプロシージャは、データ管理 (DMS) コンソールでは使用できません。 psqlクライアントでストアドプロシージャを使用することを推奨します。

構文とパラメータ

詳細については、「CREATE PROCEDURE」をご参照ください。

ストアドプロシージャと関数の違い

AnalyticDB for PostgreSQL V6.0は、関数を使用してストアドプロシージャのほとんどの機能を実装できます。 関数の使用を推奨します。 ただし、AnalyticDB for PostgreSQLユーザーとPostgreSQL開発者は、次のようなストアドプロシージャと関数の違いにより、ストアドプロシージャを必要とします。

  • ストアドプロシージャは、CREATE PROCEDUREステートメントと、SQL構文に準拠するcall() 関数をサポートします。 ストアドプロシージャをサポートするデータベースからAnalyticDB for PostgreSQLにデータを簡単に移行できます。

  • ストアドプロシージャを使用すると、内部トランザクションブロックに基づいてトランザクションをコミットまたはロールバックできます。 関数を使用すると、トランザクション全体のみをコミットまたはロールバックできます。

  • 関数には戻り値がありますが、ストアドプロシージャにはありません。 出力パラメーターを使用して、ストアドプロシージャの結果を取得できます。

例 1

この例では、ストアドプロシージャを作成して2つのトランザクションを制御します。 1つはコミットされ、もう1つはロールバックされます。

  1. ストアドプロシージャを作成し、ストアドプロシージャ内のさまざまなトランザクションを制御します。

    CREATE PROCEDURE proc() LANGUAGE plpgsql
    AS $$
      BEGIN
        CREATE TABLE table_a (id int);
        INSERT INTO table_a VALUES(1);
        COMMIT;
    
        CREATE TABLE table_b (cid int);
        INSERT INTO table_b VALUES(1);
        ROLLBACK;
      END;
    $$;
  2. ストアドプロシージャを呼び出します。

     CALL proc();
  3. ストアドプロシージャの実行結果を照会します。

    psqlで \dコマンドを実行して、現在のデータベース内のすべてのテーブルを照会します。 サンプル結果:

                    List of relations
     Schema |  Name   | Type  |   Owner    | Storage
    --------+---------+-------+------------+---------
     public | table_a | table | adbpgadmin | heap
    (1 row)

    次の文を実行して、table_aテーブルのデータを照会します。

    SELECT * FROM table_a;

    サンプル結果:

     id
    ----
      1
    (1 row)

    上記のストアドプロシージャの実行結果は、table_aテーブルのトランザクションがコミットされ、table_bテーブルのトランザクションがロールバックされたことを示しています。

例 2

この例では、ループタスクはストアドプロシージャと関数の両方で実行され、その間にシステムは関連するテーブルのストレージを再利用しようとします。 この例では、トランザクションをコミットする際のストアドプロシージャと関数の違いを示します。

  • ストアドプロシージャを使用すると、トランザクションをコミットできます。 次のコードは、ループタスクの実行中にストアドプロシージャがテーブルスペースを再利用できることを示しています。

    CREATE PROCEDURE run_procedure()  LANGUAGE plpgsql
    AS $$
     BEGIN
        FOR i in 1..10 LOOP
            INSERT INTO t VALUES(i);-- Execute multiple INSERT tasks on the t table. 
            TRUNCATE t;
            COMMIT;  -- Commit a TRUNCATE task within the loop to reclaim the physical storage of the t table. 
        END LOOP;
      END;
    $$;
  • 関数は実行中にトランザクションをコミットできません。 これらは、関数の実行が完了した後にのみコミットできます。 次のコードは、ループタスクの実行中に関数がテーブルスペースを再利用できないことを示しています。

    CREATE FUNCTION run_function() RETURNS void LANGUAGE plpgsql
    AS $$
     BEGIN
        FOR i in 1..10 LOOP
            INSERT INTO t VALUES(i);-- Execute multiple INSERT tasks on the t table. 
            TRUNCATE t;
            -- COMMIT; Transactions cannot be committed. 
        END LOOP;
      END;
    $$;

関連ドキュメント

AnalyticDB for PostgreSQLを使用してColourDataがフルテキスト検索、データ処理、およびデータ分析を実装できるようにします