Plsql 未找到记录时引发异常
我有一个表,其中包括Plsql 未找到记录时引发异常,plsql,oracle11g,exception-handling,procedure,Plsql,Oracle11g,Exception Handling,Procedure,我有一个表,其中包括客户ID和订单ID以及一些其他数据 我想创建一个过程,将客户ID作为输入并查看表内部 如果该客户存在,则打印该客户的订单详细信息,并 如果客户不存在,则引发异常“找不到客户。” 我有这个代码,但它不能正常工作,或者我对这个问题有错误的方法 CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) IS CURSOR order_cursor IS SELECT ORDER_ID, ORDER_DATE
客户ID
和订单ID
以及一些其他数据
我想创建一个过程
,将客户ID
作为输入并查看表内部
如果该客户存在,则打印该客户的订单
详细信息,并
如果客户不存在,则引发异常
“找不到客户。”
我有这个代码,但它不能正常工作,或者我对这个问题有错误的方法
CREATE OR REPLACE PROCEDURE order_details(customer NUMBER)
IS
CURSOR order_cursor IS
SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID
FROM PRODUCT_ORDER
WHERE CUSTOMER_ID = customer ;
order_row order_cursor%ROWTYPE ;
customer_error EXCEPTION ;
BEGIN
FOR order_row IN order_cursor
LOOP
IF order_cursor%FOUND THEN
dbms_output.put_line ('order id = ' || order_row.ORDER_ID) ;
ELSE
RAISE customer_error ;
END IF;
END LOOP;
EXCEPTION
WHEN customer_error THEN
dbms_output.put_line ('no customer' ) ;
END;
所以如果我用这行代码运行这个过程
BEGIN
order_details(103);
END;
BEGIN
order_details(101);
END;
我得到两个结果,因为该客户存在订单
如果我用这行代码运行程序
BEGIN
order_details(103);
END;
BEGIN
order_details(101);
END;
我没有得到任何东西(甚至没有错误),因为没有针对该客户的订单
必须使用“显式游标”而不是“循环游标”。因为当查询返回多个记录时,后者只需输入循环和结束循环之间的代码
CREATE OR REPLACE PROCEDURE order_details(customer NUMBER)
IS
CURSOR order_cursor IS
SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID
FROM PRODUCT_ORDER
WHERE CUSTOMER_ID = customer ;
order_row order_cursor%ROWTYPE ;
customer_error EXCEPTION ;
BEGIN
OPEN order_cursor;
LOOP
FETCH order_cursor INTO order_row;
EXIT WHEN order_cursor%NOTFOUND;
dbms_output.put_line ('order id = ' || order_row.ORDER_ID);
END LOOP;
IF order_cursor%rowcount = 0 THEN
RAISE customer_error;
END IF;
CLOSE order_cursor;
EXCEPTION
WHEN customer_error THEN
dbms_output.put_line ('no customer' ) ;
END;
关于我也试过了,问题是,当我没有客户时,它工作得很好,但是当我有客户时,如果该客户有多个订单,它只会在输出中显示该客户的一个订单,而不会显示其他任何内容。我上传了表内数据的图像,如您所见,我有两组数据,例如客户id=104,但如果我使用您建议的代码,我只会得到其中一个数据,而不会得到另一个。在这种情况下,我修改了代码,使用循环结束循环和属性%rowcount和%notfound,从而显示所有订单id或“无客户”(如果没有)。