web-dev-qa-db-ja.com

Oracle 10g PL / SQLの「CONTINUE」キーワード

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

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

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

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

goto and 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;
56
jop

それは少し複雑で単なる偽物ですが、この方法で例外を使用できます:

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;
10
Eric

実際、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;
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.
6
eric.itzhak

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

5

IFを関数にリファクタリングして、適切なポイントで(必要に応じて早期に)返すことができますか。次に、制御フローが適切な場所のループで取得されます。

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

4
cagcowboy

正確ではありませんが、シンプルです:

DECLARE
   done  BOOLEAN;
BEGIN
   FOR i IN 1..50 LOOP
      IF done THEN
         NULL;
      ELSE
         <do loop stuff>;
      END IF;
   END LOOP; 
END;
2
David Oneill

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

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

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

ネストされたループとロジックの深いところから抜けたい場合、これは十分ではないかもしれませんが、GOTOとNULLのカップルよりもずっと明確です。

1
Thorsten