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

GOTO 语句

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

嘿,我们不评判任何人。 您有使用此语句的理由。

在前一节中,我们介绍了 标签。 现在我们使用它们。 例如,有条件地跳过一组语句。 或者为了简化示例,无条件地跳过它们

-- PL/SQL
BEGIN
  INSERT INTO t (col) VALUES (1);
  GOTO l1;
  INSERT INTO t (col) VALUES (2);

  <<l1>>
  INSERT INTO t (col) VALUES (3);
END;
// All dialects
Label l1 = label("l1");

begin(
  insertInto(T).columns(T.COL).values(1),
  goto_(l1),
  insertInto(T).columns(T.COL).values(2),
  l1.label(insertInto(T).columns(T.COL).values(3))
)

某些方言(例如 T-SQL)可能会以通常对代码的可读性或可维护性没有真正帮助的方式实现“完整 GOTO”,即 GOTO 可用于跳转到任何任意范围,这些范围不应通过普通控制流访问。 这在其他语言(如 PL/SQL)中是不可能的,并且目前 jOOQ 无法模拟。

请注意,goto 是 Java 语言中的保留关键字,因此 jOOQ API 无法将其用作方法名称。 我们在这些冲突后添加了一个下划线:goto_()

方言支持

此示例使用 jOOQ

begin(l.label(insertInto(BOOK).columns(BOOK.ID).values(1)), goto_(l))

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

DB2

BEGIN
  l:
  INSERT INTO BOOK (ID)
  VALUES (1);
  GOTO l;
END

Informix, Oracle

BEGIN
  <<l>>
  INSERT INTO BOOK (ID)
  VALUES (1);
  GOTO l;
END;

SQLDataWarehouse, SQLServer

BEGIN
  l:
  INSERT INTO BOOK (ID)
  VALUES (1);
  GOTO l;
END;

ASE, Access, Aurora MySQL, Aurora Postgres, BigQuery, ClickHouse, CockroachDB, Databricks, Derby, DuckDB, Exasol, Firebird, H2, HSQLDB, Hana, MariaDB, MemSQL, MySQL, Postgres, Redshift, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica, YugabyteDB

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

反馈

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

The jOOQ Logo