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
?
答案 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
上的任何值传递给您的函数,这意味着它将对函数无效。正如评论中所述。
即使您已经传递了值并且错误消失了,您应该添加对该查询的检查,因为一旦传递了数据库中没有的值,您将会遇到相同的错误。