PL / SQL函数错误消息

时间:2014-03-13 15:18:02

标签: sql oracle plsql

我编写了一个简单的函数,可以在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

4 个答案:

答案 0 :(得分:2)

如果SELECT ... INTO语句返回除1行以外的任何内容,则SELECT语句将引发异常。您获得的错误表示SELECT语句返回0行。

如果不知道表格中的内容,很难确切知道问题的解决方案是什么。不过,我的猜测是,您希望将参数p_idbasketidbasket表中的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是我所看到的可接受的值。)

相关问题