为什么我在这个匿名块中得到NO_DATA_FOUND?

时间:2015-10-15 23:36:47

标签: sql oracle ora-01403

CREATE OR replace FUNCTION Ord_ship_se (p_basketid IN bb_basket.idbasket%TYPE)
RETURN VARCHAR2
IS
  lv_stat    VARCHAR2(10);
  lv_numdays CHAR;
  lv_ordered bb_basket.dtordered%TYPE;
  lv_created bb_basket.dtcreated%TYPE;
BEGIN
    SELECT dtcreated,
           dtordered
    INTO   lv_created, lv_ordered
    FROM   bb_basket
    WHERE  p_basketid = idbasket;

    lv_numdays := To_char(lv_created - lv_ordered);

    IF lv_numdays = 1 THEN
      lv_stat := 'OK';
    ELSE
      lv_stat := 'CHECK';
    END IF;

    RETURN lv_stat;
END;

上述代码计算创建日期和发货日期之间的天数。我试图创建一个匿名块来测试结果。

idstage表的BB_BASKETSTATUS列表示已装运的商品,其值为5,DTSTAGE列是发货日期。 dtordered表的BB_BASKET列是订单日期。

这是我到目前为止所拥有的

DECLARE
  lv_numDays CHAR;
  lv_stat VARCHAR2(12);
BEGIN
  lv_stat := ORD_SHIP_SE(lv_numDays);
  DBMS_OUTPUT.PUT_LINE(lv_stat);
END;

为什么我一直收到错误ORA-01403: no data found at line 10 in ord_ship_se

1 个答案:

答案 0 :(得分:0)

您需要检查您的查询是否返回了某些内容。由于您使用的是select into,因此您的功能应该是:

create or replace 
   FUNCTION ORD_SHIP_SE (p_basketid IN bb_basket.idbasket%type)
     RETURN VARCHAR2
   IS
    lv_stat VARCHAR2(10);
    lv_numDays CHAR;
    lv_ordered    bb_basket.dtordered%type;
    lv_created    bb_basket.dtcreated%type;
BEGIN
  BEGIN
    SELECT dtcreated, dtordered
      INTO lv_created, lv_ordered
      FROM bb_basket
     WHERE idbasket = p_basketid;
  EXCEPTION
      WHEN NO_DATA_FOUND THEN
         lv_stat := 'CHECK';
         RETURN lv_stat;
  END;

     lv_numDays := TO_CHAR(lv_created-lv_ordered);
     IF lv_numDays = 1 THEN
         lv_stat:='OK';
     ELSE 
         lv_stat := 'CHECK';
     END IF;

RETURN lv_stat;

END; 

您必须检查您的查询是否返回了某些内容才能继续执行您的功能。我已将begin exception when no_data_found块添加到支票中,以便您可以随意更改。

此外,您没有将lv_numDays上的任何值传递给您的函数,这意味着它将对函数无效。正如评论中所述。

即使您已经传递了值并且错误消失了,您应该添加对该查询的检查,因为一旦传递了数据库中没有的值,您将会遇到相同的错误。