CREATE
TABLE
AREAS
(
RADIUS NUMBER ( 5 ),
AREA NUMBER ( 14 , 2 )
);
(
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 ;
LOOP
<< here >>
radius : = radius + 1 ;
IF radius = 4
THEN
GOTO here;
ELSE
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
END IF ;
END LOOP;
COMMIT ;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK ;
RAISE;
END ;
pi CONSTANT NUMBER ( 9 , 7 ) : = 3.1415927 ;
radius INTEGER ( 5 );
area NUMBER ( 14 , 2 );
BEGIN
radius : = 0 ;
LOOP
<< here >>
radius : = radius + 1 ;
IF radius = 4
THEN
GOTO here;
ELSE
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
END IF ;
END LOOP;
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 ;
LOOP
BEGIN
radius : = radius + 1 ;
some_variable : = 1 / (radius - 4 );
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
EXCEPTION
WHEN ZERO_DIVIDE
THEN
NULL;
END;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
RAISE;
END;
DECLARE
pi CONSTANT NUMBER ( 9 , 7 ) : = 3.1415927 ;
radius INTEGER ( 5 );
area NUMBER ( 14 , 2 );
some_variable NUMBER ( 14 , 2 );
BEGIN
radius : = 0 ;
LOOP
BEGIN
radius : = radius + 1 ;
some_variable : = 1 / (radius - 4 );
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
EXCEPTION
WHEN ZERO_DIVIDE
THEN
NULL;
END;
END LOOP;
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 ;
LOOP
radius : = radius + 1 ;
BEGIN
IF radius = 4
THEN
RAISE e_userdefinedexception;
ELSE
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
END IF ;
EXCEPTION
WHEN e_userdefinedexception
THEN
NULL ;
END ;
END LOOP;
COMMIT ;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK ;
RAISE;
END ;
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 ;
LOOP
radius : = radius + 1 ;
BEGIN
IF radius = 4
THEN
RAISE e_userdefinedexception;
ELSE
area : = pi * POWER (radius, 2 );
INSERT INTO areas
VALUES (radius, area);
EXIT WHEN area > 100 ;
END IF ;
EXCEPTION
WHEN e_userdefinedexception
THEN
NULL ;
END ;
END LOOP;
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. 但习惯了就会发现很灵活。
但有时候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. 但习惯了就会发现很灵活。