0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQLでユーザー定義関数、ユーザー定義プロシージャーを作成する

Last updated at Posted at 2024-09-12

ユーザー定義関数の作成

PostgreSQLは4種類の関数を作成することが出来ます。

  • 問い合わせ言語関数(SQLで作成された関数)
  • 手続型言語関数(PL/pgSQLやPL/Tclなどで作成された関数)
  • 内部関数
  • C言語関数

関数は CREATE [OR REPLACE] FUNCTION SQLコマンドで作成します。 

書式

CREATE [OR REPLACE] FUNCTION 関数

関数
関数名 ([引数][,引数, ...]) [RETURNS 戻り値型 | RETURNS TABLE ] AS '関数定義文字列' LANGUAGE 言語名

引数
[引数モード] [引数名] 引数型 [ { DEFAULT | = } デフォルト値]

言語名
関数を実装している言語の名前を指定します。 このパラメータには、sql、c、internal、もしくはユーザ定義手続き言語(例:plpgsql)の名前を指定可能です。

関数定義文字列
関数の本体の定義を記述した文字列定数です。言語名で指定した言語で記述します。
定義を記述する際は、通常の単一引用符ではなく、ドル引用符 を使用するほうが便利に記載できます。

関数の作成例

CREATE OR REPLACE FUNCTION HelloWorld() RETURNS text AS $$
 SELECT 'Hello World' AS result;
$$ LANGUAGE SQL;

関数の実行

SELECT 文で実行することが出来ます

SELECT 関数名(引数);
SELECT * FROM 関数名(引数);

実施例1 SELECT 関数名

testdb=# SELECT echo('Hello World');
    echo     
-------------
 Hello World
(1 row)

実施例2 SELECT * FROM 関数名

testdb=# select * from echo('Hello World');
    echo     
-------------
 Hello World
(1 row)

実施例3 引数に列名を指定

testdb=# select *, echo(prod_name) from prod;
 prod_id | prod_name  | price |    echo    
---------+------------+-------+------------
       1 | みかん     |   100 | みかん
       2 | りんご     |   100 | りんご
       3 | メロン     |   100 | メロン
       4 | バナナ     |   100 | バナナ
       5 | もも       |   100 | もも
       6 | なし       |   100 | なし
       7 | さくらんぼ |   100 | さくらんぼ
       8 | スイカ     |   100 | スイカ
       9 | 夏みかん   |   100 | 夏みかん
       1 | みかん     |    10 | みかん
       1 | みかん     |    10 | みかん
       1 | みかん     |    10 | みかん
       1 | みかん     |    10 | みかん
(13 rows)

関数の削除

DROP FUNCTION SQLコマンドで、関数を削除します。

書式

DROP FUNCTION [ IF EXISTS ] 関数名 [(引数)] 

関数の削除の実施例

testdb=# \df
                           List of functions
 Schema |     Name     | Result data type | Argument data types | Type 
--------+--------------+------------------+---------------------+------
 public | echo         | text             | name text           | func
 public | echosql      | text             | name text           | func
 public | helloworld   | text             |                     | func
 public | prod_name    | text             |                     | func
 public | testdataprod | void             |                     | func
(5 rows)

testdb=# DROP FUNCTION echo;
DROP FUNCTION

testdb=# \df
                           List of functions
 Schema |     Name     | Result data type | Argument data types | Type 
--------+--------------+------------------+---------------------+------
 public | echosql      | text             | name text           | func
 public | helloworld   | text             |                     | func
 public | prod_name    | text             |                     | func
 public | testdataprod | void             |                     | func
(4 rows)
 

プロシージャの作成

CREATE PROCEDURE SQLコマンドでプロシージャを作成します

書式

CREATE [OR REPLACE] PROCEDURE プロシージャ

プロシージャ
プロシージャ名 ([引数][,引数, ...]) LANGUAGE 言語名 AS '定義文字列' 

引数
[引数モード] [引数名] 引数型 [ { DEFAULT | = } デフォルト値]

言語名
プロシージャを実装している言語の名前を指定します。 このパラメータには、sql、c、internal、もしくはユーザー定義手続き言語(例:plpgsql)の名前を指定可能です。

定義文字列
プロシージャの本体の定義を記述した文字列定数です。言語名で指定した言語で記述します。
定義を記述する際は、通常の単一引用符ではなく、ドル引用符 を使用するほうが便利に記載できます。

プロシージャ作成の実施例

CREATE PROCEDURE delete_prod()
LANGUAGE SQL
AS $$
DELETE FROM prod WHERE price = 10;
$$;

プロシージャの実行

CALL コマンドでプロシージャを実行します

書式

CALL プロシージャ([引数])

プロシージャ実行の実施例

testdb=# select * from prod;
 prod_id | prod_name  | price 
---------+------------+-------
       1 | みかん     |   100
       2 | りんご     |   100
       3 | メロン     |   100
       4 | バナナ     |   100
       5 | もも       |   100
       6 | なし       |   100
       7 | さくらんぼ |   100
       8 | スイカ     |   100
       9 | 夏みかん   |   100
       1 | みかん     |    10
       1 | みかん     |    10
       1 | みかん     |    10
       1 | みかん     |    10
(13 rows)

testdb=# call delete_prod();
CALL

testdb=# select * from prod;
 prod_id | prod_name  | price 
---------+------------+-------
       1 | みかん     |   100
       2 | りんご     |   100
       3 | メロン     |   100
       4 | バナナ     |   100
       5 | もも       |   100
       6 | なし       |   100
       7 | さくらんぼ |   100
       8 | スイカ     |   100
       9 | 夏みかん   |   100
(9 rows)

プロシージャの削除

DROP PROCEDURE SQLコマンドを使用して、プロシージャを削除します

書式

DROP PROCEDURE [ IF EXISTS ] プロシージャ名 [ (引数) ]

実施例

testdb=# SELECT nspname,proname,rolname,lanname,prokind FROM pg_proc, pg_namespace, pg_language,pg_authid  where nspname = 'public' and pg_namespace.oid = pronamespace and pg_language.oid = prolang and pg_authid.oid = proowner;
 nspname |   proname    | rolname  | lanname | prokind 
---------+--------------+----------+---------+---------
 public  | echosql      | postgres | sql     | f
 public  | helloworld   | postgres | sql     | f
 public  | testdataprod | postgres | sql     | f
 public  | prod_name    | postgres | sql     | f
 public  | delete_prod  | postgres | sql     | p
(5 rows)

testdb=# DROP PROCEDURE delete_prod;
DROP PROCEDURE
testdb=# SELECT nspname,proname,rolname,lanname,prokind FROM pg_proc, pg_namespace, pg_language,pg_authid  where nspname = 'public' and pg_namespace.oid = pronamespace and pg_language.oid = prolang and pg_authid.oid = proowner;
 nspname |   proname    | rolname  | lanname | prokind 
---------+--------------+----------+---------+---------
 public  | echosql      | postgres | sql     | f
 public  | helloworld   | postgres | sql     | f
 public  | testdataprod | postgres | sql     | f
 public  | prod_name    | postgres | sql     | f
(4 rows)

ユーザー定義関数、ユーザー定義プロジージャの一覧を表示

psql   \df メタコマンド

psqlの \df メタコマンドで作成した関数、プロシージャの一覧を表示させることが出来ます

testdb=# \df
                           List of functions
 Schema |     Name     | Result data type | Argument data types | Type 
--------+--------------+------------------+---------------------+------
 public | delete_prod  |                  |                     | proc
 public | echosql      | text             | name text           | func
 public | helloworld   | text             |                     | func
 public | prod_name    | text             |                     | func
 public | testdataprod | void             |                     | func
(5 rows)

psql \df+ 関数名またはプロシージャ名 メタコマンドで関数、プロシージャのソースコードを含む詳細を表示できます。

testdb-# \df+ echosql
                                                                                   List of functions
 Schema |  Name   | Result data type | Argument data types | Type | Volatility | Parallel |  Owner   | Security | Access privileges | Language |       Source code        | Description 
--------+---------+------------------+---------------------+------+------------+----------+----------+----------+-------------------+----------+--------------------------+-------------
 public | echosql | text             | name text           | func | volatile   | unsafe   | postgres | invoker  |                   | sql      |                         +| 
        |         |                  |                     |      |            |          |          |          |                   |          |   SELECT name AS result;+| 
        |         |                  |                     |      |            |          |          |          |                   |          |                          | 
(1 row)

pg_proc カタログ

pg_procカタログは関数、プロシージャ、集約関数あるいはWINDOW関数に関する情報が格納されています。

自身が定義した関数は、名前空間が'public'に格納されています。

pg_procカタログから作成した関数・プロシージャの名前、作成した言語、所有者、関数・プロシージャの種類を表示するSQL文

SELECT nspname, proname, rolname, lanname, prokind FROM pg_proc, pg_namespace, pg_language, pg_authid  where nspname = 'public' and pg_namespace.oid = pronamespace and pg_language.oid = prolang and pg_authid.oid = proowner;

実施例

testdb=# SELECT nspname,proname,rolname,lanname,prokind FROM pg_proc, pg_namespace, pg_language, pg_authid  where nspname = 'public' and pg_namespace.oid = pronamespace and pg_language.oid = prolang and pg_authid.oid = proowner;
 nspname |   proname    | rolname  | lanname | prokind 
---------+--------------+----------+---------+---------
 public  | echosql      | postgres | sql     | f
 public  | helloworld   | postgres | sql     | f
 public  | testdataprod | postgres | sql     | f
 public  | prod_name   | postgres | sql     | f
 public  | delete_prod  | postgres | sql     | p
(5 rows)

関数・プロシージャのソースコードは、pg_procカタログのprosrcに格納されています。

testdb=# SELECT nspname,proname,prosrc,rolname,lanname, prokind FROM pg_proc, pg_namespace, pg_language,pg_authid  where nspname = 'public' and pg_namespace.oid = pronamespace and pg_language.oid = prolang and pg_authid.oid = proowner;
 nspname |   proname    |                   prosrc                   | rolname  | lanname | prokind 
---------+--------------+--------------------------------------------+----------+---------+---------
 public  | echosql      |                                           +| postgres | sql     | f
         |              |   SELECT name AS result;                  +|          |         | 
         |              |                                            |          |         | 
 public  | helloworld   |                                           +| postgres | sql     | f
         |              |  SELECT 'Hello World' AS result;          +|          |         | 
         |              |                                            |          |         | 
 public  | testdataprod |                                           +| postgres | sql     | f
         |              |  INSERT INTO prod VALUES(1, 'みかん', 10);+|          |         | 
         |              |                                            |          |         | 
 public  | prod_name    |                                           +| postgres | sql     | f
         |              |  SELECT prod_name FROM prod AS result;    +|          |         | 
         |              |                                            |          |         | 
 public  | delete_prod  |                                           +| postgres | sql     | p
         |              | DELETE FROM prod WHERE price = 10;        +|          |         | 
         |              |                                            |          |         | 
(5 rows)

参照情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?