2016-10-22 32 views
0

我編寫了函數,並調用了以下過程。兩種編碼都可以執行,但是當我執行ProdDetails(10010)時,它顯示錯誤。任何人都可以知道有什麼問題嗎?通過過程調用函數的錯誤

 create or replace function ProdCheck(
    f_product_id in number) 
    return varchar IS 
    f_product_name varchar(30); 
    f_product_price number; 
    begin 
    select product_name, price into f_product_name, f_product_price 
    from product 
    where product_id = f_product_id; 
    return f_product_name; 
    end; 

create or replace procedure ProdDetails(
sp_product_id in number 
)IS 
f_product_id number; 
sp_name varchar(30); 
sp_price number; 

begin 
f_product_id := ProdCheck(sp_product_id); 
if f_product_id > 0 then 
dbms_output.put_line('Product Name : '||sp_name); 
dbms_output.put_line('Product Price : '||sp_price); 
else 
dbms_output.put_line('Product not in the database!'); 
end if; 
end; 

enter image description here

+0

也許提及什麼錯誤是? –

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –

回答

1

你的功能prodcheck需要product_id並返回product_name。然後在調用該函數的過程中,您提供函數a product_id(迄今爲止的所有內容),但是將該函數的返回值(產品名稱)分配給您聲明爲number的變量f_product_id。顯然這是行不通的。事實上,功能和程序在句法上都是正確的;只有將它們放在一起纔會失敗,並且只有在運行時纔會執行,因爲Oracle不會嚴格執行數據類型(如果產品名稱爲'1000',則函數可能會執行OK並生成垃圾結果,因爲它會解釋此產品名稱改爲產品ID)。

您在函數中查詢您的表以檢查產品ID是否有效,並返回名稱。在該過程中,您可以將該函數的返回值分配給sp_name。該函數並不返回價格(它不能 - 一個函數不能返回多個值),所以你不能在過程中顯示價格。你可以在過程中再次查詢表格,但這似乎很無意義;將所有內容組合成單一程序會更好。 (您可能根本不需要檢查 - 如果表中不存在產品ID,您將得到一個「無行」異常,您可以使用它來代替prodcheck。)