はじめに
1回しか実行できないSQL関数なんてものがあると面白いかな、と思ってPL/pgSQL関数を作って試してみた。
検証環境
PostgreSQL 12-develで確認。
定義
例えば、以下のようなsuicide()
というPL/pgSQL関数をCREATE FUNCTION
を使って作成してみる。
testdb=# CREATE OR REPLACE FUNCTION suicide( )
RETURNS INTEGER
LANGUAGE plpgsql
AS $function$
DECLARE
sql TEXT;
BEGIN
--
-- なにか処理を書く
--
sql := 'DROP FUNCTION suicide()';
EXECUTE sql;
RETURN 0;
END
$function$
;
CREATE FUNCTION
testdb=#
実行してみる
まず、さきほど作成したSQL関数が存在するか\d
メタコマンドで確認してみる。
testdb=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+---------+------------------+---------------------+------
public | suicide | integer | | func
(1 row)
testdb=#
SELECT文を使って、sucide()を実行する。
testdb=# SELECT suicide();
suicide
---------
0
(1 row)
testdb=#
とくに何もエラーにもならず、関数は実行された。
再び、\df
メタコマンドで確認する。
testdb=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------+------------------+---------------------+------
(0 rows)
testdb=#
suicide()関数は消えてしまった。消えてしまったので、再度実行しようとしてもエラーになる。
testdb=# SELECT suicide();
psql: ERROR: function suicide() does not exist
LINE 1: SELECT suicide();
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
testdb=#
おわりに
一度しか実行できない、SQL関数ができた。
これが何の役に立つのかは、作った自分にもわからない。
つか、実行中の関数だから削除できないと思ったのに・・・