2013-09-25 78 views
0

我被委託(作爲任務的一部分)在Oracle PL/SQL中編寫存儲過程。有3個要求必須得到滿足。Oracle存儲過程'學習'問題

  1. 必須有2個參數,1個IN和1個OUT。

  2. 我必須使用隱式遊標和SQL函數來計算相同類型字段數的計數(在這種情況下,類型是汽車模型,所以每個模型有多少輛汽車)。

  3. 我必須使用另一個隱式遊標來顯示模型的描述。

說實話,我很茫然。到目前爲止,存儲過程我有:

CREATE OR REPLACE Procedure model_details_sp 
(p_model IN VARCHAR2, 
p_noofcars OUT NUMBER) 
IS 
BEGIN 
SELECT COUNT(Model_Name) INTO p_noofcars 
FROM i_car 
GROUP BY Model_Name; 
END; 

我真的不知道從哪裏去。任何建議或方向將不勝感激。

非常感謝。

嗨,大家好,我欣賞所有的評論。我對最終要求並不十分清楚。我希望能夠通過匿名塊調用此過程,以便用戶輸入模型類型(& vairalbe),並且該過程將顯示數據庫中有多少個模型類型。

+0

恐怕你可能需要澄清第3步。你是什麼意思「顯示」?你只是在尋找「DBMS_OUTPUT.put_line」?另外,你確定req 3不是一個「顯式」遊標,因爲它返回多於一行,並且會失敗一個典型的隱式遊標。 –

+0

感謝您的回覆Rob。通過顯示,我的意思是通過DBMS_Output.Putline使用PL/SQL塊調用proc。 – Splunk

回答

1

在處理這類問題時,首先考慮一下您要捕獲的數據。

處理PL/SQL中的隱式遊標需要1行,所以您需要確保您瞭解數據。

在這種情況下,您傳入的變量不會用於任何查詢,因此我建議您重新評估。

我手頭沒有數據庫來執行此操作,但您應該能夠解決這個問題,並希望能讓您更靠近一點。我把它放在一個匿名塊中,這樣我可以很快寫出它。

DECLARE 
    PROCEDURE model_details_sp (p_model IN VARCHAR2, p_noofcars OUT NUMBER) 
    IS 
     p_description VARCHAR2 (200); 
    BEGIN 
     --2 
     SELECT COUNT (model_name) 
      INTO p_noofcars 
      FROM i_car 
     WHERE model_name = p_model; 

     DBMS_OUTPUT.put_line ('No of Cars for model: ' || p_noofcars); 

     --3 
     SELECT model_description 
      INTO p_description 
      FROM i_car --the table should be the car_model table so that only one record is returned 
     WHERE model_name = p_model; 

     DBMS_OUTPUT.put_line ('Model Desc' || p_description); 
    END model_details_sp; 
BEGIN 
    dbms_output.put_line(''); 
END; 

要@大衛阿爾德里奇評論:

嘗試運行這 - 結果應是失敗的 - 因爲你cannont使用到CLAUS選擇多行,除非你彙總數據:

DECLARE 
    p_num NUMBER; 
BEGIN 
    SELECT LEVEL INTO p_num FROM DUAL CONNECT BY LEVEL <= 10; 
    dbms_output.put(p_num); 
END; 

,你應該看到的錯誤是這樣的:

錯誤報告:

ORA-01422:精確獲取回報超過行 ORA-06512的請求數量:4行 01422. 00000 - 「精確獲取回報超過行請求數量」 *原因 :在指定的數精確提取小於返回的行。 *行動:重寫行的查詢或更改號碼請

+0

非常感謝。這使我成爲一個好方向。 – Splunk

+0

讓我知道如果它不是很清楚 - 我把它放在一起真的很快,讓'創意'流動:) –

+0

我認爲這裏不需要'GROUP BY'子句,'INTO'只存儲一個值最後。 – ajmalmhd04

0

從說明書和隨後的評論,這是解決方案,我將提供:我創建了過程中

DECLARE 
    PROCEDURE model_details_sp 
     (p_model IN VARCHAR2, 
     p_noofcars OUT NUMBER) 
    IS 
    BEGIN 
     SELECT COUNT(*) 
     INTO p_noofcars 
     FROM i_car 
     WHERE model_name = p_model; 
    END; 

    no_of_cars NUMBER := 0; 
BEGIN 
    model_details_sp(:model_name, no_of_cars); 
    dbms_output.put_line('no of cars for ' || :model_name || ' = ' || no_of_cars); 
END; 

但是您可以通過將其從聲明部分中刪除並通過CREATE OR REPLACE執行它來輕鬆地將其提取到數據庫。

本示例假定使用支持匿名塊執行的綁定變量替換(:model_name)的IDE。例如,在TOAD中,系統會提示「用戶」提供:model_name的值。