我编写了一个简单的函数,可以在SQL Developer中无错误地编译。我试着调用该函数并得到一个错误,我不明白如何修复。
CREATE OR REPLACE FUNCTION POUNDS_SF
(p_idbasket in number)
RETURN NUMBER
AS
lv_lbs bb_basketitem.option1%type;
lv_qty bb_basketitem.quantity%type;
lv_idbasket bb_basket.idbasket%type;
lv_total_lbs_num number;
BEGIN
select bi.option1, bi.quantity, b.idbasket
into lv_lbs, lv_qty, lv_idbasket
from bb_basketitem bi, bb_basket b
where p_idbasket = lv_idbasket;
lv_total_lbs_num := lv_lbs * lv_qty;
RETURN
lv_total_lbs_num;
END POUNDS_SF;
我用这个匿名块调用该函数:
declare
lv_basket_id_num number(1) :=3;
lv_total_num number(5,2);
begin
lv_total_num := pounds_sf(lv_basket_id_num);
dbms_output.put_line(lv_total_num);
end;
我得到的错误是:
Error report:
ORA-01403: no data found
ORA-06512: at "STUDENT22.POUNDS_SF", line 10
ORA-06512: at line 5
01403. 00000 - "no data found"
*Cause:
*Action:
如果这个问题太基础或错误的地方等,我道歉。显然,我是一名学生,正在尝试学习PL / SQL。非常感谢任何帮助。
EH
答案 0 :(得分:2)
如果SELECT ... INTO
语句返回除1行以外的任何内容,则SELECT
语句将引发异常。您获得的错误表示SELECT
语句返回0行。
如果不知道表格中的内容,很难确切知道问题的解决方案是什么。不过,我的猜测是,您希望将参数p_idbasket
与idbasket
表中的bb_basket
值进行比较。我不清楚局部变量lv_idbasket
在这段代码中扮演的角色,我的猜测是它应该被删除。
您显然也错过了两个表之间的连接条件。假设两个表都有一个idbasket
列
select bi.option1, bi.quantity
into lv_lbs, lv_qty
from bb_basketitem bi
join bb_basket b
on( bi.idbasket = b.idbasket )
where b.idbasket = p_idbasket;
答案 1 :(得分:2)
除了没有数据发现您的查询问题
select bi.option1, bi.quantity, b.idbasket
into lv_lbs, lv_qty, lv_idbasket
from bb_basketitem bi, bb_basket b
where p_idbasket = lv_idbasket;
会导致bb_basketitem和bb_basket表的笛卡尔连接问题,因为有 这些表之间没有任何连接。
答案 2 :(得分:2)
仔细查看你的where子句:
where p_idbasket = lv_idbasket;
p_idbasket - 是一个函数参数
lv_idbasket - 是一个未在代码中的任何位置初始化的局部变量 - 它始终为NULL
因此where条件总是求值为NULL,查询返回空集
这是ORA-01403: no data found
。
答案 3 :(得分:0)
错误信息非常清楚:没有符合您条件的数据,即bb_basketitem或bb_basket中没有行,p_idbasket = 3。
你应该像这样重写你的程序:
CREATE OR REPLACE FUNCTION POUNDS_SF
(p_idbasket in number)
RETURN NUMBER
AS
lv_lbs bb_basketitem.option1%type;
lv_qty bb_basketitem.quantity%type;
lv_idbasket bb_basket.idbasket%type;
lv_total_lbs_num number;
BEGIN
select bi.option1, bi.quantity, b.idbasket
into lv_lbs, lv_qty, lv_idbasket
from bb_basketitem bi, bb_basket b
where p_idbasket = lv_idbasket;
lv_total_lbs_num := lv_lbs * lv_qty;
RETURN
lv_total_lbs_num;
EXCEPTION WHEN NO_DATA_FOUND THEN
RETURN 0;
END POUNDS_SF;
(我认为0是我所看到的可接受的值。)