未找到记录时引发异常

时间:2016-03-26 18:39:07

标签: plsql oracle11g exception-handling procedure

我的表格中包含customer IDorder 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;

我没有得到任何东西(甚至没有错误),因为该客户没有订单。

Table Data

1 个答案:

答案 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;

问候