找不到记录时引发异常
Raise Exception when record not found
我有一个 table,其中包括 customer ID
和 order ID
以及一些其他数据。
我想创建一个 procedure
以 customer ID
作为输入并查看 table.
如果该客户存在,则打印该客户的 order
详细信息,并且
如果客户不存在则提出 exception
"Customer not found."
我有这段代码,但它不能正常工作,或者我对这个问题的处理方式有误。
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;
我没有收到任何信息(甚至没有收到错误消息),因为该客户没有订单。
您必须使用 "Explicit Cursor" 而不是 "Cursor FOR LOOP"。因为后者在查询returns多条记录时只是在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;
此致
我有一个 table,其中包括 customer ID
和 order ID
以及一些其他数据。
我想创建一个 procedure
以 customer ID
作为输入并查看 table.
如果该客户存在,则打印该客户的 order
详细信息,并且
如果客户不存在则提出 exception
"Customer not found."
我有这段代码,但它不能正常工作,或者我对这个问题的处理方式有误。
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;
我没有收到任何信息(甚至没有收到错误消息),因为该客户没有订单。
您必须使用 "Explicit Cursor" 而不是 "Cursor FOR LOOP"。因为后者在查询returns多条记录时只是在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;
此致