2014-05-18 38 views
-2

我有一個示例數據庫,我需要編寫一個存儲過程來打印給定的配方(其中包含的數據庫,包括成分和數量 - 所以我需要聯接表)PL SQL對象無效錯誤 - 無法找到源

CREATE OR REPLACE PROCEDURE proc_printrecipe (RecipeName IN Recipe.RecipeTitle%TYPE) 
IS 
    TYPE rec_printrecipe IS RECORD 
    (
    rec_IngName Ingredients.IngredientName%TYPE, 
    rec_Amount Recipe_Ingredients.Amount%TYPE, 
    rec_MeasureDesc Measurements.MeasurementDescription%TYPE, 
) 
    CURSOR cur_printrecipe IS 
    SELECT i.ingredientName, ri.Amount, m.MeasurementDescription FROM Recipes r 
    JOIN Recipe_Ingredients ri ON r.RecipeID = ri.RecipeID 
    JOIN Ingredients i ON ri.IngredientID = i.IngredientID 
    JOIN Measurements m ON ri.MeasureAmountID = m.MeasurementDescription 
    WHERE r.RecipeTitle = RecipeName; 
BEGIN 
    IF NOT cur_printrecipe%ISOPEN THEN 
    OPEN cur_printrecipe; 
    END IF; 

    LOOP 
    FETCH cur_printrecipe INTO rec_printrecipe; 
    EXIT WHEN cur_printrecipe%NOTFOUND; 
    dbms_output.put_line(rec_Amount || ' ' 
          rec_MeasureDesc || ' of ' 
          rec_IngName 
         ); 
    END LOOP; 
END; 
/

-- CALLING THE STORED PROCEDURE 
DECLARE 
recipe recipes.RecipeTitle%TYPE := 'Irish Stew'; 
BEGIN 
    proc_printrecipe(recipe); 
END; 

但腳本輸出(帶的Oracle SQL Developer 1.1.3)工作給了我: 警告:執行與警告

PROCEDURE proc_printrecipe Compiled. 

Error starting at line 33 in command: 
DECLARE 
recipe recipes.RecipeTitle%TYPE := 'Irish Stew'; 
BEGIN 
    proc_printrecipe(recipe); 
END; 
Error report: 
ORA-06550: Line 4, Column 3: 
PLS-00905: Object COOK.PROC_PRINTRECIPE is invalid 
ORA-06550: Line 4, Column 3: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

我缺少的是完成?

+0

不要忘記在退出程序之前關閉打開的光標。否則,在將來的某個時刻,你的代碼會在內存不足的情況下將數據庫取出。 –

回答

1

您可以在過程編譯後添加show errors以查看問題,至少在SQL * Plus和SQL Developer中是這樣的;或查詢user_errors觀點:

select * from user_errors 
where type = 'PROCEDURE' 
and name = 'PROC_PRINTRECIPE'; 

但一些明顯的錯誤,你必須在你的記錄宣告結束一個逗號;你錯過了一個分號;你需要聲明類型的實例:

  TYPE rec_printrecipe_type IS RECORD 
  (
    IngName Ingredients.IngredientName%TYPE,  
    Amount Recipe_Ingredients.Amount%TYPE, 
    MeasureDesc Measurements.MeasurementDescription%TYPE 
); 
    rec_printrecipe rec_printrecipe_type; 

你的光標開檢查是多餘的,因爲它不能在這一點上打開;但在程序結束時你應該明確地關閉它。

而你的dbms_output調用直接引用字段而不指定它們所屬的記錄,並且具有不完整的級聯;所以你需要做的:

dbms_output.put_line(rec_printrecipe.Amount || ' ' || 
          rec_printrecipe.MeasureDesc || ' of ' || 
          rec_printrecipe.IngName 
         ); 

你假設誰調用這個就能看到dbms_output緩衝區。希望你已經在做set serveroutput on

user_errors可能還存在其他問題。

SQL Developer現在已經升級到了第4版,因此您可以考慮升級。例如,Codo的答案可能指的是比1.1.3版更現代的東西。

+0

錯誤輸出幫助很大!謝謝你..我已經刪除了其他錯誤,你找到了。還是行不通。很遺憾,我在這裏混合使用了德語和英語的錯誤信息.. – apoc

+0

好..顯然這些錯誤在這三行 FETCH cur_printrecipe INTO rec_printrecipe; EXIT WHEN cur_printrecipe%NOTFOUND; dbms_output.put_line(rec_printrecipe.Amount ||''|| 它表示** rec_printrecipe **不能用於放置的左側.. 它說兩次「Statement ignored」.. 並且cur_printrecipe%NOTFOUND似乎也不工作.. – apoc

+0

@apoc - 你需要一個變量來選擇,這是你的類型的一個實例,你不能直接使用類型。名字發生變化... –

1

錯誤消息表明您的存儲過程無效,即由於代碼中的錯誤而未成功編譯。

  • 連接 SQL Developer的視圖中,展開您的連接。
  • 展開該項目程序
  • 點擊PROC_PRINTRECIPE
  • 在打開的視圖,單擊編譯按鈕。

然後,SQL Developer將顯示您的過程中的錯誤位置。

+0

我無法在那裏找到Compile按鈕,但是我收到了錯誤消息,以及Alex Poole的select語句給了我。 – apoc