40

TSQL ストアド プロシージャを PL/SQL に移行していますが、Oracle 10g に CONTINUE キーワードがないという問題が発生しました。

Oracle 11g にはこれが新機能として含まれていると読みましたが、残念ながらアップグレードはオプションではありません。

10g で CONTINUE に代わるものはありますか? 外部ループ、IF、ネストされた IF、その IF 内のステートメント ブロックの最後に CONTINUE があるため、回避策として SP のロジックを再構築することは現実的ではないと思います。

どんな助けでも大歓迎です、乾杯。

4

9 に答える 9

58

goto と labelsを使用して続行をシミュレートできます。

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         GOTO end_loop;
      END IF;
   <<end_loop>>  -- not allowed unless an executable statement follows
   NULL; -- add NULL statement to avoid error
   END LOOP;  -- raises an error without the previous NULL
END;
于 2008-10-07T09:44:26.477 に答える
10

少し複雑で偽物ですが、次のように例外を使用できます。

DECLARE
  i NUMBER :=0;
  my_ex exception;
BEGIN
  FOR i IN 1..10
  LOOP
      BEGIN
         IF i = 5 THEN
            raise my_ex;
         END IF;
         DBMS_OUTPUT.PUT_LINE (i);
      EXCEPTION WHEN my_ex THEN
         NULL;
      END;
  END LOOP;

END;
于 2009-03-12T05:11:08.503 に答える
7

実際、PL SQL には CONTINUE を置き換えるものがあります。ループにラベル (名前) を追加するだけです。

declare
   i integer;
begin
   i := 0;

   <<My_Small_Loop>>loop

      i := i + 1;
      if i <= 3 then goto My_Small_Loop; end if; -- => means continue

      exit;

   end loop;
end;
于 2011-08-22T15:12:55.623 に答える
6

将来の検索のために、Oracle 11g では次のcontinueように使用できるステートメントを追加しました。

    SQL> BEGIN
  2     FOR i IN 1 .. 5 LOOP
  3        IF i IN (2,4) THEN
  4           CONTINUE;
  5        END IF;
  6        DBMS_OUTPUT.PUT_LINE('Reached on line ' || TO_CHAR(i));
  7     END LOOP;
  8  END;
  9  /
Reached on line 1
Reached on line 3
Reached on line 5

PL/SQL procedure successfully completed.
于 2013-07-11T08:25:30.317 に答える
5

10g では利用できませんが、11Gの新機能です。

于 2008-10-28T08:51:26.553 に答える
4

IF を関数にリファクタリングして、適切な時点で (必要に応じて早期に) 返すことができますか? 次に、制御フローがループ内の適切な場所で取り上げられます。

それは理にかなっていますか?

于 2008-10-07T09:37:43.433 に答える
2

正確にはエレガントではありませんが、シンプルです。

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;
于 2009-09-04T16:37:36.407 に答える
1

Oracle には、ループまたは関数/プロシージャ (終了するループがない場合) を終了する EXIT と呼ばれる同様のステートメントがあります。WHEN を追加して、いくつかの条件を確認できます。

上記の例を次のように書き換えることができます。

DECLARE
   done  BOOLEAN;
BEGIN
    FOR i IN 1..50 LOOP
     EXIT WHEN done;
   END LOOP;
END;

入れ子になったループやロジックの奥深くから抜け出したい場合、これでは不十分かもしれませんが、2 つの GOTO や NULL よりははるかに明確です。

于 2008-10-07T10:23:55.070 に答える