DOブロックと匿名コード
DOブロックでその場限りのPL/pgSQLを実行し、ドルクォートを扱い、単発のマイグレーションにDOブロックを活用します。
「DOブロックと匿名コード」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
DO ブロックとは
DO ブロックを使うと、名前付き関数を定義せずに PL/pgSQL を実行できます。一度きりのマイグレーションやアドホックなスクリプトに最適です。
基本的な DO ブロック
最小限の構文:
DO $$
BEGIN
RAISE NOTICE 'Hello from PL/pgSQL';
END;
$$ LANGUAGE plpgsql;
-- The language defaults to plpgsql, so you can omit it:
DO $$ BEGIN RAISE NOTICE 'Hi'; END $$;ドルクォート
$$ 区切り文字を使うと、単一引用符をエスケープせずに済みます。入れ子になったコードにはタグを使用できます。
DO $outer$
BEGIN
EXECUTE $inner$ SELECT 'embedded \'quotes\'' $inner$;
END;
$outer$;条件付き DDL
存在しない場合にのみ列を追加します。
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='users' AND column_name='last_login'
) THEN
ALTER TABLE users ADD COLUMN last_login TIMESTAMPTZ;
END IF;
END $$;一括マイグレーション用のループ
非常に大きなテーブルをバッチ更新します。
DO $$
DECLARE
rows_updated INT;
BEGIN
LOOP
UPDATE users SET tier = compute_tier(...)
WHERE id IN (
SELECT id FROM users WHERE tier IS NULL LIMIT 10000
);
GET DIAGNOSTICS rows_updated = ROW_COUNT;
EXIT WHEN rows_updated = 0;
COMMIT;
END LOOP;
END $$;EXECUTE による動的 SQL
format() と EXECUTE を使って、安全に SQL 文字列を構築します。
DO $$
DECLARE
tbl TEXT;
BEGIN
FOR tbl IN SELECT tablename FROM pg_tables WHERE schemaname='public' LOOP
EXECUTE format('ANALYZE %I;', tbl);
END LOOP;
END $$;DO 内でのトランザクション制御
古い PG では、DO ブロックは 1 つの暗黙的なトランザクション内で実行されます。PG 11 以降では、プロシージャ(CALL)内で COMMIT/ROLLBACK が使用できますが、DO 内では使用できません。コミットを伴うバッチマイグレーションには、プロシージャを使用してください。
プロシージャと DO の比較
- DO — 無名で、一度だけ実行され、現在のトランザクション内で動作します
- PROCEDURE — 名前付きで、COMMIT/ROLLBACK をサポートし、CALL 経由で呼び出します
CREATE PROCEDURE migrate_users() LANGUAGE plpgsql AS $$
BEGIN
-- can COMMIT here
END $$;
CALL migrate_users();エラー処理
EXCEPTION ブロックは、名前付き関数の場合と同じように動作します。
DO $$
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'failed: %', SQLERRM;
END $$;繰り返し実行するタスクに DO を使わない
同じロジックを複数回実行する場合は、関数またはプロシージャを定義してください。DO は一度きりの処理に使用します。
マイグレーションで DO を使う
ほとんどのマイグレーションツール(Flyway、Sqitch)は通常の SQL を実行します。DO ブロックを使うと、別個の関数を作成せずに制御フローを組み込めます。
まとめ
DO ブロックはアドホックな PL/pgSQL です。
- 1 回だけ実行する無名ブロック
- 条件付き DDL やマイグレーションに最適
- ドルクォートに注意
- トランザクション制御には PROCEDURE を使用
クイックチェック
名前付き関数を作成せずに、マイグレーション中に PL/pgSQL を 1 回だけ実行したい場合、どの構文を使用しますか。
よくある質問
「DOブロックと匿名コード」レッスンは無料ですか?
はい。「DOブロックと匿名コード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「DOブロックと匿名コード」で何を学びますか?
DOブロックでその場限りのPL/pgSQLを実行し、ドルクォートを扱い、単発のマイグレーションにDOブロックを活用します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「DOブロックと匿名コード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。