为啥存储过程不能判断借阅流水号不存在呢
测试发现可以判断是否有可借书目,如果有则抛出异常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;
测试发现可以判断是否有可借书目,如果有则抛出异常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;
WHERE READER.RE_NUM = borrow_id;
查不到记录就抛异常了,不会走下面的IF判断
你可以修改为count(*)来判断,=0
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20007,'ERROR:借书证号不存在');
if reader_num = 0
then reader_num_exist:=FALSE;
end if;
这么改后还是不走IF。
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直接想把错误数据往表里插,可关联表里没有这个数据所以插不进去报了错
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,肯定是你的当前逻辑不符合条件