Plsql 未找到记录时引发异常

Plsql 未找到记录时引发异常,plsql,oracle11g,exception-handling,procedure,Plsql,Oracle11g,Exception Handling,Procedure,我有一个表,其中包括客户ID和订单ID以及一些其他数据 我想创建一个过程,将客户ID作为输入并查看表内部 如果该客户存在,则打印该客户的订单详细信息,并 如果客户不存在,则引发异常“找不到客户。” 我有这个代码,但它不能正常工作,或者我对这个问题有错误的方法 CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) IS CURSOR order_cursor IS SELECT ORDER_ID, ORDER_DATE

我有一个表,其中包括
客户ID
订单ID
以及一些其他数据

我想创建一个
过程
,将
客户ID
作为输入并查看表内部

如果该客户存在,则打印该客户的
订单
详细信息,并 如果客户不存在,则引发
异常
“找不到客户。”

我有这个代码,但它不能正常工作,或者我对这个问题有错误的方法

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;
我得到两个结果,因为该客户存在订单

如果我用这行代码运行程序

BEGIN
  order_details(103);
END;
BEGIN
  order_details(101);
END;
我没有得到任何东西(甚至没有错误),因为没有针对该客户的订单

必须使用“显式游标”而不是“循环游标”。因为当查询返回多个记录时,后者只需输入循环和结束循环之间的代码

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;

关于

我也试过了,问题是,当我没有客户时,它工作得很好,但是当我有客户时,如果该客户有多个订单,它只会在输出中显示该客户的一个订单,而不会显示其他任何内容。我上传了表内数据的图像,如您所见,我有两组数据,例如客户id=104,但如果我使用您建议的代码,我只会得到其中一个数据,而不会得到另一个。在这种情况下,我修改了代码,使用循环结束循环和属性%rowcount和%notfound,从而显示所有订单id或“无客户”(如果没有)。