0Pricing
SQL Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. トリガーの構造:BEFORE/AFTER、FOR EACH ROW
  2. PL/pgSQL関数の基礎
  3. DOブロックと匿名コード
  4. トリガーによるテーブル監査
← SQL Academyに戻る