Azure Database for PostgreSQL でストアド プロシージャを作成する

完了

特定のタスクのためにストアド プロシージャを作成することは、Azure for PostgreSQL データベースの機能を拡張するなど、多くの利点があります。 ストアド プロシージャは、次のような場合に使います。

  • 複雑なコードを 1 か所で開発およびテストし、必要に応じて呼び出す。
  • コードを効率的に実行する。 同じ結果を返すストアド プロシージャは、事前にコンパイルされ、Azure Database PostgreSQL サーバーに格納されているので、より効率的です。
  • コードを読みやすくする。
  • トランザクション内にエラー処理を含める。
  • ユーザーに複雑さを隠す。

Azure Database for PostgreSQL は複数のプログラミング言語をサポートしていますが、SQL は PostgreSQL のネイティブ言語であり、オプティマイザーに使うことをお勧めします。

ストアド プロシージャは、CREATE PROCEDURE というキーワードを使って作成します。 または、CREATE OR REPLACE PROCEDURE を使って、新しいプロシージャを作成するか、同じ名前のプロシージャを置き換えます。

特定のスキーマでプロシージャを作成する場合は、スキーマ名を指定します。 そうしないと、現在のスキーマで作成されます。 プロシージャ名は、入力引数の型を含めて、スキーマ内で一意である必要があります。 ただし、引数の型が "異なる" プロシージャまたは関数に同じ名前を付けることで、プロシージャ名をオーバーロードすることができます。

プロシージャを作成したユーザーがそのプロシージャ所有者になります。 言語も指定する必要があります。

プロシージャは次のパラメーターを受け取ります。

  • name - 必要に応じてスキーマ名を含めます。
  • argmode - 引数のモード。 IN、INOUT、または VARIADIC を指定できます。 既定値は IN です。 OUT はサポートされていません。代わりに INOUT を使います。 VARDIADIC は、数が定義されていない、同じ型の入力引数です。最後の入力引数にする必要があります。
  • argname - 引数名。
  • argtype - 引数のデータ型。
  • default_expr - パラメーターが指定されていない場合に使われる既定の式 (同じ型)。 既定値を持つパラメーターに続く入力パラメーターにも、既定値が必要です。
  • lang_name - プロシージャの記述に使われる言語。 sql、c、internal、またはユーザー定義の手続き型言語の名前 (plpgsql など) を指定できます。

次の例では、入力パラメーター a と b を受け取る myprocedure というストアド プロシージャを作成しています。 IN はパラメーターの既定値なので、入力パラメーターとして明示的に指定する必要はありません。 ストアド プロシージャが呼び出されると、これらのパラメーターに割り当てられている値が mytable に挿入されます。

CREATE PROCEDURE myprocedure (a integer, b integer)
    LANGUAGE SQL
    AS $$
        INSERT INTO mytable VALUES (a, b);
    $$;

$$ 記号は、文字列の先頭と末尾を示すために使います。 一重引用符も使えますが、他のプログラミング言語で問題が発生する可能性があるため、$$ を使うことをお勧めします。