PL/pgSQLとは? †PostgreSQLを使用している環境で、PL/pgSQLを使った方が良いのにという場面があります。 PL/pgSQLは、データベースを操作するプログラム言語になります。 よく、「スドアド」とか「ストアドプロシージャ」と言われるものになります。 関連サイト †お約束 †当サイトに記載されている会社名、製品名などは一般に各社または団体の商標または登録商標です。 PL/pgSQLで Hello world! †PL/pgSQLでHello worldを作成してみます。 以下のPL/pgSQLファンクションは、ターミナル上にHello world!と表示し、クエリー結果としてHello World!を表示するサンプルです。 -- helloworld.sql CREATE OR REPLACE FUNCTION helloworld() RETURNS TEXT AS $$ DECLARE msg text := 'Hello world!'; BEGIN RAISE INFO '%', msg; RETURN msg; END $$ LANGUAGE plpgsql ; helloworldファンクションの登録 †上記の cut&pasteで張り付ける †今回、サンプルソースも小さいのでcut&pasteで張り付けてもよいと思います。
psqlコマンドでファンクションを登録する †psqlコマンドを使用してファンクションを登録します。 sakura@cygwin ~/PLpgSQL$ psql -U sakura -h localhost sakuradb -f helloworld.sql Password for user sakura: CREATE FUNCTION helloworldファンクションを実行 †上記の操作でhelloworldファンクションの登録が完了しました。
ファンクション一覧の確認 †登録されているファンクションの一覧を確認する場合は、以下のSQLを実行します。 ファンクション名のみ †以下のSQLでファンクション名のみ表示されます。 SELECT p.proname FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid WHERE n.nspname = 'public' ; 実行例 †sakuradb=> SELECT p.proname FROM pg_catalog.pg_namespace n sakuradb-> JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid sakuradb-> WHERE n.nspname = 'public' sakuradb-> ; proname ------------ helloworld (1 row) ファンクション名とスクリプト内容 †以下のSQLでファンクション名およびスクリプトが表示されます。 SELECT proname, prosrc FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname = 'public' ; 実行例 †sakuradb=> SELECT proname, prosrc FROM pg_catalog.pg_namespace n sakuradb-> JOIN pg_catalog.pg_proc p ON pronamespace = n.oid sakuradb-> WHERE nspname = 'public'; proname | prosrc ------------+----------------------------------- helloworld | \r + | DECLARE\r + | msg text := 'Hello world!';\r+ | BEGIN\r + | RAISE INFO '%', msg;\r + | RETURN msg;\r + | END\r + | (1 row) ファンクションを削除(DROP)する †作成したhelloworldファンクションを削除(DROP)する方法を以下に記します。 DROP FUNCTION ファンクション名 今回作成した、helloworld()ファンクションを削除(DROP)してみます。 sakuradb=> DROP FUNCTION helloworld(); DROP FUNCTION 削除されたのが確認できます。 sakuradb=> SELECT helloworld(); ERROR: 関数helloworld()は存在しません LINE 1: SELECT helloworld(); ^ HINT: 指定名称、指定引数型に合う関数がありません。明示的な型キャストが必要かもしれません sakuradb=> まとめ †
|