PostgreSQL GOTO like关键字跳转到一个块

Sat*_*rma 3 postgresql plpgsql

我有一个 PostgreSQL 函数

CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
IF i<0 THEN 
RETURN i + 1;
ELSE
  GOTO label1;
END IF
<<label1>>
RETURN null;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

在此函数中,我必须转到 label1,但 GOTO 关键字不起作用,请您帮我了解如何从特定代码跳转到标签。

小智 7

另一个嵌套的 Begin 块?

BEGIN
  <<label1>>
  BEGIN 
      IF i<0 THEN 
          RETURN i + 1;
      ELSE
          EXIT label1;
      END IF;
  END;
  RETURN null;
END;
Run Code Online (Sandbox Code Playgroud)


Pav*_*ule 5

解决方法:

<<label>>
LOOP
   ...
   EXIT label WHEN i > 0;
   ...
   EXIT;
 END LOOP label;
 some;
Run Code Online (Sandbox Code Playgroud)

但我十年没用过——所以通常你做错了

  • @Nulik - 对 GOTO 的厌恶让计算机科学家盯着程序编程,以应对 Fortran、Cobol、Basic 中的问题。出于宗教原因,在 Postgres 中没有实现 GOTO - 基于 AST 的解释的设计不允许它。PL/pgSQL 基于快速 AST 解释(不需要 JIT),但 GOTO 很难实现。PCode 解释允许简单的 GOTO 实现(就像可移植的汇编程序),但需要 JIT,并且代码很多,复杂度更高。 (2认同)