【问题标题】:Raise Exception when record not found找不到记录时引发异常
【发布时间】:2016-07-14 08:25:10
【问题描述】:

我有一个包含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

【问题讨论】:

    标签: plsql oracle11g exception-handling procedure


    【解决方案1】:

    您必须使用“显式光标”而不是“光标 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;
    

    问候

    【讨论】:

    • 我也已经尝试过这个问题,当我没有客户时它运行良好,但是当我有客户并且如果该客户有多个订单时,它只会显示为该客户输出 1 个订单,仅此而已。
    • 我为表格内的数据上传了一张图片,如您所见,我有 2 组数据,例如客户 id = 104 但如果我使用您建议的代码,我只会得到一个数据,而不是另一个。
    猜你喜欢
    • 2019-03-11
    • 2013-11-11
    • 2015-11-18
    • 1970-01-01
    • 2021-08-16
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多