CREATE
TABLE
AREAS
(
RADIUS
NUMBER
(
5
),
AREA
NUMBER
(
14
,
2
)
);
方法一:使用 goto
DECLARE
pi
CONSTANT
NUMBER
(
9
,
7
) :
=
3.1415927
;
radius
INTEGER
(
5
);
area
NUMBER
(
14
,
2
);
BEGIN
radius :
=
0
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
LOOP
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
<<
here
>>
radius :
=
radius
+
1
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
IF
radius
=
4
THEN
GOTO
here;
ELSE
area :
=
pi
*
POWER
(radius,
2
);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
INSERT
INTO
areas
VALUES
(radius, area);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
EXIT
WHEN
area
>
100
;
END
IF
;
END
LOOP;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
COMMIT
;
EXCEPTION
WHEN
OTHERS
THEN
ROLLBACK
;
RAISE;
END
;
-- 方法二:使用 exception
--
利用系统 exception
DECLARE
pi CONSTANT NUMBER (
9
,
7
) :
=
3.1415927
;
radius INTEGER (
5
);
area NUMBER (
14
,
2
);
some_variable NUMBER (
14
,
2
);
BEGIN
radius :
=
0
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
LOOP
BEGIN
radius :
=
radius
+
1
;
some_variable :
=
1
/
(radius
-
4
);
area :
=
pi
*
POWER (radius,
2
);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
INSERT INTO areas
VALUES (radius, area);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
EXIT WHEN area
>
100
;
EXCEPTION
WHEN ZERO_DIVIDE
THEN
NULL;
END;
END LOOP;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
RAISE;
END;
--
自定义 exception
DECLARE
pi
CONSTANT
NUMBER
(
9
,
7
) :
=
3.1415927
;
radius
INTEGER
(
5
);
area
NUMBER
(
14
,
2
);
e_userdefinedexception EXCEPTION;
PRAGMA EXCEPTION_INIT (e_userdefinedexception,
-
1401
);
BEGIN
radius :
=
0
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
LOOP
radius :
=
radius
+
1
;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
BEGIN
IF
radius
=
4
THEN
RAISE e_userdefinedexception;
ELSE
area :
=
pi
*
POWER
(radius,
2
);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
INSERT
INTO
areas
VALUES
(radius, area);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
EXIT
WHEN
area
>
100
;
END
IF
;
EXCEPTION
WHEN
e_userdefinedexception
THEN
NULL
;
END
;
END
LOOP;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
COMMIT
;
EXCEPTION
WHEN
OTHERS
THEN
ROLLBACK
;
RAISE;
END
;
如果CONTINUE只有一两处,而且可以轻易变成IF..ELSE.., 那么就用IF ELSE, 这也是TOM推荐的方法。
但有时候CONTINUE藏在其他复杂的控制结构里面,IF ELSE 就不容易搞定了。我会用这种方法:
FOR 或者 WHILE 主循环 LOOP
FOR v_foo IN 1..1 LOOP ---- 第二层假循环
……代码……
IF …… THEN
EXIT; ---- 退出假循环,等效于CONTINUE主循环
END IF;
……代码……
IF …… THEN
EXIT main_loop; ---- 如果需要退出主循环,用这个写法
END IF;
……代码……
END LOOP v_foo; ---- 第二层假循环结束
END LOOP main_loop; ---- 主循环结束
初看有些古怪,因为用EXIT代替了CONTINUE. 但习惯了就会发现很灵活。