可用版本: Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12

EXIT 语句

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

一种比通过 GOTO 跳转到标签更安全的方式是使用 EXIT(跳出 LOOP或其他语句)或 CONTINUE(跳过 LOOP 迭代)。

例如,在缺少更复杂的 LOOP 语法的情况下,您可以选择使用 EXIT 退出循环(在某些方言中,这会转换为 LEAVEBREAK,并且工作方式与 Java 的 break 相同)

没有标签

-- PL/SQL
LOOP
  i := i + 1;
  EXIT WHEN i > 10;
END LOOP;
// All dialects
loop(
  i.set(i.plus(1)),
  exitWhen(i.gt(10))
)

带有标签

-- PL/SQL
<<label>>
LOOP
  i := i + 1;
  EXIT label WHEN i > 10;
END LOOP;
// All dialects
Label label = label("label");
label.label(loop(
  i.set(i.plus(1)),
  exit(label).when(i.gt(10))
))

方言支持

此示例使用 jOOQ

loop(i.set(i.plus(1)), exitWhen(i.gt(10)))

翻译成以下特定方言的表达式

Aurora Postgres, CockroachDB, Oracle, Postgres, YugabyteDB

LOOP
  i := (i + 1);
  EXIT WHEN i > 10;
END LOOP

BigQuery

LOOP
  SET i = (i + 1);
  IF i > 10 THEN
    BREAK;
  END IF;
END LOOP

DB2, HSQLDB, MariaDB, MySQL, Trino

alias_1:
LOOP
  SET i = (i + 1);
  IF i > 10 THEN
    LEAVE alias_1;
  END IF;
END LOOP

Firebird

WHILE (1 = 1) DO BEGIN
  :i = (:i + 1);
  IF (:i > 10) THEN
    LEAVE;
END

H2

for (;;) {
  i = (i + 1);
  if (i > 10) {
    break;
  }
}

Hana

WHILE 1 = 1 DO
  i = (i + 1);
  IF i > 10 THEN
    BREAK;
  END IF;
END WHILE

Informix

LOOP
  LET i = (i + 1);
  EXIT WHEN i > 10;
END LOOP

Snowflake

LOOP
  i := (:i + 1);
  IF (:i > 10) THEN
    BREAK;
  END IF;
END LOOP

SQLDataWarehouse, SQLServer

WHILE 1 = 1 BEGIN
  SET @i = (@i + 1);
  IF @i > 10
    BREAK;
END

ASE, Access, Aurora MySQL, ClickHouse, Databricks, Derby, DuckDB, Exasol, MemSQL, Redshift, SQLite, Sybase, Teradata, Vertica

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意倾听!

The jOOQ Logo