我的表格中包含customer ID
和order ID
以及其他一些数据。
我想创建一个procedure
,将customer ID
作为输入并查看表格。
如果该客户存在,则打印该客户的order
详细信息
如果客户不存在,则提出exception
"未找到客户。"
我有这段代码,但它工作不正常,或者我对这个问题采取了错误的方法。
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;
我没有得到任何东西(甚至没有错误),因为该客户没有订单。
答案 0 :(得分:0)
您必须使用“Explicit Cursor”而不是“Cursor FOR LOOP”。因为后者只是在查询返回多条记录时输入LOOP和END LOOP之间的代码。
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;
问候