急!Oracle 异常处理问题,用多个Exception

落曦 2012-07-11 01:26:48
PROCEDURE PROC_CORE_MANAGER
(P_LOTNO VARCHAR2,
P_RESULT OUT VARCHAR2)
IS
V_LOTORG VARCHAR(25);
V_COUNT NUMBER;
V_LOTNO VARCHAR(25);
V_LIKE VARCHAR(15);
v_xxx VARCHAR(20);
BEGIN
SELECT COUNT(1) INTO V_COUNT FROM CORELIST WHERE LOTNO = P_LOTNO;
IF (V_COUNT < 1) THEN
BEGIN
SELECT GLOTORG INTO V_LOTORG FROM GLOTINFO WHERE GLOTNO = P_LOTNO;
EXCEPTION --上面一句出现异常就走,不出现就直接跳走了,不接着执行下面的语句了 ,怎么解决
WHEN NO_DATA_FOUND THEN
BEGIN
V_LOTORG := 'no data found';
END;
IF (V_LOTORG = 'no data found') THEN
BEGIN
--判断是否是伪码,判断方法:把批号的最后两位替换为01
V_LIKE := SUBSTR(P_LOTNO, 1, 8) || '01';
SELECT GLOTORG
INTO V_LOTORG
FROM GLOTINFO
WHERE GLOTNO = V_LIKE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
V_LOTORG := 'no data found';
END;

IF (V_LOTORG = 'no data found') THEN
BEGIN
P_RESULT := -1;
END;
ELSE
BEGIN
SELECT LOTNO
INTO V_LOTNO
FROM CORELIST
WHERE LOTNO IN (SELECT GLOTNO
FROM GLOTINFO
WHERE GLOTORG = V_LOTORG);
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
V_LOTNO := 'no data found';
END;
IF (V_LOTNO = 'no data found') THEN
BEGIN
P_RESULT := -1;
END;
ELSE
BEGIN
P_RESULT := V_LOTNO;
END;
END IF;
END;
END IF;
END;
ELSE
BEGIN
SELECT LOTNO
INTO V_LOTNO
FROM CORELIST
WHERE LOTNO IN
(SELECT GLOTNO FROM GLOTINFO WHERE GLOTORG = V_LOTORG);
EXCEPTION
WHEN NO_DATA_FOUND THEN
BEGIN
V_LOTNO := 'no data found';
END;
IF (V_LOTNO = 'no data found') THEN
BEGIN
P_RESULT := -1;
END;
ELSE
BEGIN
UPDATE CORELIST
SET LOTNO = P_LOTNO
WHERE LOTNO = V_LOTNO;
P_RESULT := 2; --更新信息成功
EXCEPTION
WHEN OTHERS THEN
BEGIN
P_RESULT := -2; --数据操作异常
ROLLBACK;
END;
COMMIT;
END;
END IF;
END;
END IF;

END;
ELSE
BEGIN
P_RESULT := 1; --正常记录
COMMIT;
END;

END IF;
END PROC_CORE_MANAGER;

当出现异常的时候Exception会捕捉,然后接着往下走,可是一旦不出现异常就会直接跳出IF,
...全文
251 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
落曦 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
写的看起来好多begin-end..
你试下这样写呢:

SQL code

BEGIN
SELECT COUNT(1) INTO V_COUNT FROM CORELIST WHERE LOTNO = P_LOTNO;
IF (V_COUNT < 1) THEN
BEGIN
--这一块用一个begin-end包起来
BEGIN
……
[/Quote]
谢谢了,已经解决了。就是用你的这个方法,不过是我的头头跟我说的 。嘻嘻
小德 2012-07-11
  • 打赏
  • 举报
回复
写的看起来好多begin-end..
你试下这样写呢:
BEGIN
SELECT COUNT(1) INTO V_COUNT FROM CORELIST WHERE LOTNO = P_LOTNO;
IF (V_COUNT < 1) THEN
BEGIN
--这一块用一个begin-end包起来
BEGIN
SELECT GLOTORG INTO V_LOTORG FROM GLOTINFO WHERE GLOTNO = P_LOTNO;
EXCEPTION --上面一句出现异常就走,不出现就直接跳走了,不接着执行下面的语句了 ,怎么解决
WHEN NO_DATA_FOUND THEN
V_LOTORG := 'no data found';
END;

IF (V_LOTORG = 'no data found') THEN

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧