2013-10-17 84 views
1

我需要使用顯式光標,該參數接受汽車註冊才能找到汽車上的最新預訂。我不能使用MAX功能 。我必須比較所有相關日期以找到最新的日期。光標選擇不帶MAX功能或子查詢的最大日期

這是我迄今爲止」

Declare 
    v_rec_date DATE; 
    Cursor date_cur (v_reg VARCHAR2) IS 
    SELECT * FROM i_booking 
    WHERE registration = v_reg; 
    v_date date_cur%ROWTYPE; 
    Begin 
    FOR v_date IN date_cur LOOP 
    DBMS_OUTPUT.PUT_LINE('Recent Rental Date:'|| ' '||v_rec_date); 
    END LOOP; 
    End; 

然而,這是給我的錯誤:

FOR v_date IN date_cur LOOP 
       * 
ERROR at line 8: 
ORA-06550: line 8, column 15: 
PLS-00306: wrong number or types of arguments in call to 'DATE_CUR' 
ORA-06550: line 8, column 1: 
PL/SQL: Statement ignored 

我要去哪裏錯在這裏

回答

1

你已經創建了一個參數化的光標,但是您沒有傳入任何參數

當該行執行時: FOR v_date IN date_cur LOOP

您需要傳遞v_reg的值,因爲這就是您設計光標的方式。

查看Oracle文檔here的示例。

特別看看標題爲「示例6-20將參數傳遞給顯式遊標FOR LOOP語句」的鏈接部分,它們幾乎完全符合您在此嘗試的內容。

在聲明光標就像你在這裏:光標date_cur(v_reg VARCHAR2)你說,當你打開這個遊標,你會傳遞作爲v_reg光標引用的參數和v_reg將是一個VARCHAR2類型。

當您然後嘗試在這裏使用光標:FOR v_date IN date_cur LOOP基本上你收到的錯誤說,「你答應過要包括一個參數,當你打開遊標date_cur但是你沒有給我一。」

下面是你有什麼,但有一個參數現在被傳遞給遊標。

Declare 
    v_rec_date DATE; 
    Cursor date_cur (v_reg VARCHAR2) IS 
    SELECT * FROM i_booking 
    WHERE registration = v_reg; 
    v_date date_cur%ROWTYPE; 
    Begin 
    FOR v_date IN date_cur("SOME VALUE HERE") LOOP 
    DBMS_OUTPUT.PUT_LINE('Recent Rental Date:'|| ' '||v_rec_date); 
    END LOOP; 
    End; 
+0

可悲的是我不確定你的意思......這超出了我的頭。 – Splunk

+0

@Splunk - 我用一些額外的細節更新了答案。如果你看看這個例子,不明白它在做什麼,我會建議閱讀Oracle對遊標的介紹。 http://www.oracle.com/technetwork/issue-archive/2013/13-mar/o23plsql-1906474.html – Carth

+0

非常感謝Carth,感謝您的回覆。我已經看過這些文檔並試過聲明 cursor c1(v_reg VARCHAR2)IS Select * from i_booking WHERE registration = v_reg; Begin FOR c1 LOOP DBMS_OUTPUT.PUT_LINE(registration); END LOOP; END;不過,我仍然得到相同的錯誤。 – Splunk