0Pricing
SQL Academy · 课时

DO 块与匿名代码

使用 DO 块运行临时 PL/pgSQL,管理美元引用,并用 DO 块执行一次性迁移

DO 块与匿名代码 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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 块在单个隐式事务中运行。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。

  • 单次匿名运行
  • 非常适合条件 DDL 和迁移
  • 注意美元引用
  • 需要进行事务控制时,请使用 PROCEDURE

快速检查

您希望在迁移期间运行一次 PL/pgSQL,但不创建命名函数。应使用哪种结构?

常见问题解答

「DO 块与匿名代码」课时是免费的吗?

是的 — 「DO 块与匿名代码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「DO 块与匿名代码」这节课中我会学到什么?

使用 DO 块运行临时 PL/pgSQL,管理美元引用,并用 DO 块执行一次性迁移 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 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