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