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;
それは少し複雑で単なる偽物ですが、この方法で例外を使用できます:
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;
実際、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;
将来の検索のために、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.
10gでは使用できませんが、11Gでは 新機能 です
IFを関数にリファクタリングして、適切なポイントで(必要に応じて早期に)返すことができますか。次に、制御フローが適切な場所のループで取得されます。
それは理にかなっていますか?
正確ではありませんが、シンプルです:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
IF done THEN
NULL;
ELSE
<do loop stuff>;
END IF;
END LOOP;
END;
Oracleには、ループまたは関数/プロシージャを終了する(終了するループがない場合)EXITという同様のステートメントがあります。 WHENを追加して、何らかの条件を確認できます。
上記の例を次のように書き換えることができます。
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
EXIT WHEN done;
END LOOP;
END;
ネストされたループとロジックの深いところから抜けたい場合、これは十分ではないかもしれませんが、GOTOとNULLのカップルよりもずっと明確です。