2014-03-13 57 views
0

我寫了一個簡單的函數,它在SQL Developer中編譯時沒有錯誤。我嘗試調用該函數,並得到一個我不明白如何解決的錯誤。PL/SQL函數錯誤信息

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。任何援助非常感謝。如果SELECT語句返回超過1行以外的任何其他

EH

+0

您需要添加一個異常處理程序來找出問題。您正遇到在編譯時不能發現的RUNTIME錯誤。所以你的函數在編譯時不會引發任何錯誤。 – abhi

+0

您需要研究描述PL/SQL中異常處理的Oracle文檔:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm#LNPLS007 –

回答

2

一個SELECT ... INTO聲明拋出異常。您收到的錯誤表示SELECT語句返回0行。

不知道你的表中有什麼,很難確切地知道你的問題的解決方案是什麼。不過,我的猜測是,您想要將參數p_idbasketbb_basket表中的idbasket值進行比較。我不清楚在本代碼中局部變量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; 
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是我所看到的一個可接受的值。)

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表的笛卡爾連接問題,因爲 這些表之間沒有任何連接。小心你的where子句

2

看:

where p_idbasket = lv_idbasket; 

p_idbasket - 是一個函數參數
lv_idbasket - 是不是在代碼的任何地方初始化一個局部變量 - 它總是NULL


因此where條件總是計算爲NULL,並且查詢返回空集。
這是ORA-01403: no data found的原因。