找不到记录时引发异常

Raise Exception when record not found

我有一个 table,其中包括 customer IDorder ID 以及一些其他数据。

我想创建一个 procedurecustomer 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;

我没有收到任何信息(甚至没有收到错误消息),因为该客户没有订单。

Table Data

您必须使用 "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;

此致