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;

この関数では、label1 に GOTO する必要がありますが、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;

しかし、私はそれを10年間使用しませんでした-したがって、通常、あなたはいくつかの間違ったことをします

于 2012-11-22T08:18:27.363 に答える
2

必要ありませんGOTO

DECLAREブール変数。次のブロックを実行するかどうかに基づいて値を設定します。IF変数をテストする でそのブロックをラップします。魔法、飛ばした!

そうでなければ意味がないので、あなたのコードは削減され単純化されていると思います。「ELSE ... GOTO」を削除して制御フローをオンにすることはできないと仮定して、これを行う1つの方法を次に示します。

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 に答える
2

PL/PgSQL には GOTO 演算子がありません。

しかし、なぜgotoが必要なのですか?あなたの場合、単に ELSE を削除して、探している動作を得ることができます。

于 2012-11-22T08:08:50.997 に答える