PL/pgSQL
Hello World
Hello World と表示するだけ
DO $$
BEGIN
RAISE NOTICE 'Hello World';
END
$$;
postgres=# DO $$
postgres$# BEGIN
postgres$# RAISE NOTICE 'Hello World';
postgres$# END
postgres$# $$;
NOTICE: Hello World
DO
サンプル: usersテーブルのnameをloopで表示
このテーブルを使用する
id | name | email | birthday
----+---------+---------------------+------------
1 | Alice | alice@example.com | 1990-01-01
2 | Bob | bob@example.com | 1985-02-15
3 | Charlie | charlie@example.com | 1980-03-20
DO $$
DECLARE
v_name TEXT;
BEGIN
-- users テーブルの name 列を全件ループ
FOR v_name IN
SELECT name FROM users
LOOP
RAISE NOTICE 'Name: %', v_name;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
-- 例外発生時のメッセージ出力
RAISE NOTICE 'An error occurred: %', SQLERRM;
END
$$;
実行結果
NOTICE: Name: Alice
NOTICE: Name: Bob
NOTICE: Name: Charlie
DO
サンプル: usersテーブルを元にDBユーザーを作成
DO $$
DECLARE
rec RECORD;
pwd TEXT;
dbname TEXT := current_database();
BEGIN
FOR rec IN
SELECT name, email
FROM users
LOOP
-- メールアドレスの「@」前部分+'123' をパスワードに
pwd := substring(rec.email FROM '^[^@]+') || '123';
-- ユーザー(ロール)を作成
EXECUTE format(
'CREATE ROLE %I WITH LOGIN PASSWORD %L',
rec.name, pwd
);
-- データベース接続権限を付与
EXECUTE format(
'GRANT CONNECT ON DATABASE %I TO %I',
dbname, rec.name
);
-- 作成結果を表示
RAISE NOTICE 'Created user: % with password: %', rec.name, pwd;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'An error occurred: %', SQLERRM;
END
$$;
結果
NOTICE: Created user: Alice with password: alice123
NOTICE: Created user: Bob with password: bob123
NOTICE: Created user: Charlie with password: charlie123
DO