3

我有一个 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

4 回答 4

8

另一个嵌套的 Begin 块?

BEGIN
  <<label1>>
  BEGIN 
      IF i<0 THEN 
          RETURN i + 1;
      ELSE
          EXIT label1;
      END IF;
  END;
  RETURN null;
END;
于 2015-07-23T20:24:56.647 回答
6

解决方法:

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

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

于 2012-11-22T08:18:27.363 回答
2

PL/PgSQL does not have GOTO operator.

But, why do you need goto? In your case you can simply remove ELSE and get behavior your are looking for.

于 2012-11-22T08:08:50.997 回答
2

你不需要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;
于 2012-11-22T10:50:55.867 回答