0
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;

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

表中的idstageBB_BASKETSTATUS表示一个发货项目,值为 5,该DTSTAGE列是发货日期。表格的dtorderedBB_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

4

1 回答 1

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给您的函数,这意味着该函数将为 null。如评论中所述。

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

于 2015-10-15T23:53:39.060 回答