PostgreSQL GOTO喜欢关键字跳转到一个块

时间:2012-11-22 08:03:36

标签: 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;

在这个函数中,我必须GOTO到label1,但是GOTO关键字不起作用,请你帮助我找到从特定代码跳转到标签的方式。

4 个答案:

答案 0 :(得分:4)

解决方法:

<<label>>
LOOP
   ...
   EXIT label WHEN i > 0;
   ...
   EXIT;
 END LOOP label;
 some;

但我十年都没用 - 所以通常你做错了

答案 1 :(得分:1)

PL / PgSQL没有GOTO操作符。

但是,你为什么需要转到?在您的情况下,您可以简单地删除ELSE并获取您正在寻找的行为。

答案 2 :(得分:1)

您不需要GOTO

DECLARE一个布尔变量。根据您是否要执行下一个块来设置其值。在测试变量的IF中包裹该块。魔术,它被跳过了!

我假设您的代码已被删减和简化,因为否则它没有任何意义。这是一种方法,假设你不能只删除“ELSE ... GOTO”并让控制流动。

CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
DECLARE
    run_condition boolean = 't';
BEGIN
  IF i<0 THEN
    RETURN i + 1;
  ELSE
    run_condition = 'f';
  END IF;
  IF run_condition THEN
    -- Do the optional thing
  END;
  RETURN null;
END;
$$ LANGUAGE plpgsql;

答案 3 :(得分:0)

另一个嵌套的Begin块?

BEGIN
  <<label1>>
  BEGIN 
      IF i<0 THEN 
          RETURN i + 1;
      ELSE
          EXIT label1;
      END IF;
  END;
  RETURN null;
END;