为啥存储过程不能判断借阅流水号不存在呢
测试发现可以判断是否有可借书目,如果有则抛出异常20010
但是异常20007无法判断求救CREATE OR REPLACE PROCEDURE yuyue  --预约PROCEDURE
(yy_id READER_RESERVATION.RESERVATION_NUM%TYPE,  --预约流水号
borrow_id READER.RE_NUM%TYPE, --借书证号
yy_ISBN BOOKS_INFO.BK_ISBN%TYPE) --图书ISBN号
Asnowdate varchar2(12); --记录当前预约时间
borrowed integer;  --检查该ISBN下的图书借出入状态
reader_num READER.RE_NUM%TYPE; --借书证号临时变量
reader_num_exist BOOLEAN:=TRUE; --借阅证号存在判断
reservation_error EXCEPTION; --预约出现错误(该书有未借),异常处理
BEGIN
SELECT RE_NUM INTO reader_num FROM READER --判断借书证号是否存在
WHERE READER.RE_NUM = borrow_id;
if reader_num IS NULL
then reader_num_exist:=FALSE;
end if;
SELECT to_char(sysdate,'yyyy-mm-dd') INTO nowdate FROM dual; --获取时间
SELECT count(*) INTO borrowed FROM BOOKS_INFO WHERE BK_ISBN = yy_ISBN AND BOOK_BORROWED = '否'; --判断该书是否都已被借出
IF borrowed = 0 THEN --如果都已被借出则进行预约插入操作
INSERT INTO READER_RESERVATION
VALUES(yy_id,borrow_id,yy_ISBN,to_date(nowdate,'yyyy-mm-dd'));
dbms_output.put_line('预约成功');
ELSE
RAISE reservation_error;--抛出预约异常
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN ROLLBACK;
IF(reader_num_exist=FALSE) THEN RAISE_APPLICATION_ERROR(-20007,'ERROR:借书证号不存在');
END IF;
WHEN reservation_error THEN RAISE_APPLICATION_ERROR(-20010,'ERROR:该书目有可借图书,请查找');
end;

解决方案 »

  1.   

    SELECT RE_NUM INTO reader_num FROM READER --判断借书证号是否存在
    WHERE READER.RE_NUM = borrow_id;
    查不到记录就抛异常了,不会走下面的IF判断
    你可以修改为count(*)来判断,=0 
      

  2.   

    去掉false的判断EXCEPTION
        WHEN NO_DATA_FOUND THEN 
        RAISE_APPLICATION_ERROR(-20007,'ERROR:借书证号不存在');
      

  3.   

    SELECT count(*) INTO reader_num FROM READER WHERE READER.RE_NUM = borrow_id;--判断借书证号是否存在
    if reader_num = 0
    then reader_num_exist:=FALSE;
    end if;
    这么改后还是不走IF。
      

  4.   

    BEGIN
    SELECT count(*) INTO reader_num FROM READER WHERE READER.RE_NUM = borrow_id;--判断借书证号是否存在
    上面
    下面
    EXCEPTION
    WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20007,'ERROR:借书证号不存在');
    这样还是不走IF。。错误ORA-02291。应该是没走IF直接想把错误数据往表里插,可关联表里没有这个数据所以插不进去报了错
      

  5.   

    BEGIN
    SELECT count(*) INTO reader_num FROM READER WHERE READER.RE_NUM = borrow_id;--判断借书证号是否存在
    上面
    下面
    EXCEPTION
    WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20007,'ERROR:借书证号不存在');
    这样还是不走IF。。错误ORA-02291。应该是没走IF直接想把错误数据往表里插,可关联表里没有这个数据所以插不进去报了错
    你可以用PL/DEV test功能,跟踪定位一下,不走IF,肯定是你的当前逻辑不符合条件