2013-10-17 35 views
0

我正在做一個操作,需要我使用2個顯式遊標。一個遊標是獲取第二個參數。最終目標是根據註冊查找每輛車的最近「租賃日期」。例如,註冊345JKL在01/06/2010,07/09/2011和08/09/2013出租。我希望這隻返回最新的日期,即08/09/2013,我希望它爲表中的每個註冊提供最近的日期。使用2個遊標,一個獲取另一個的參數

我知道有更好的方法來做到這一點,比如MAX,子查詢等(我都不允許使用這兩種方法),但作爲一種「橫向思維練習」,我需要這樣做,而不需要內置函數,子查詢和其他讓生活變得輕鬆的事情。

我有點卡住了這個。

這是我到目前爲止這讓我無處:

declare 
v_maxdate DATE; 
v_reg VARCHAR2(20); 

cursor reg_cur IS 
SELECT * FROM i_car; 
v_car reg_cur%ROWTYPE; 

cursor c_reg (reg i_booking.registration%TYPE) IS 
SELECT date_reserved from i_booking 
WHERE registration = reg; 
v_date c_reg%ROWTYPE; 

begin 
FOR v_date IN c_reg (v_car.registration) LOOP 
v_maxdate := '01/JAN/90'; 
If v_date > v_maxdate THEN 
v_maxdate := v_date; 
end if; 
end loop; 
end; 

它扔我這個錯誤:

If v_date > v_maxdate THEN 
      * 
ERROR at line 17: 
ORA-06550: line 17, column 11: 
PLS-00306: wrong number or types of arguments in call to '>' 
ORA-06550: line 17, column 1: 
PL/SQL: Statement ignored 

我想通,而不是繼續一聲我的頭在桌子上我會尋求指導。

您的幫助表示讚賞。

+0

你不需要遊標。你可以愉快地加入這兩張桌子。 – wildplasser

+0

正如我所說,練習的一部分就是這樣做,這是一個肛交,但它是這樣。 – Splunk

+0

是的,如果你還沒有開始,遊標就像吸菸一樣。我工作過的大多數公司都使用遊標,通常會導致嚴重的熱水。去看看RBAR並瞭解爲什麼我們不在現實世界中使用遊標。 – Namphibian

回答

0

v_date變量是創紀錄的,所以你必須使用點實際訪問它的一些領域 - date_reserved你的情況:

begin 
    v_maxdate := '01/JAN/90'; 
    FOR v_date IN c_reg (v_car.registration) LOOP 
    If v_date.date_reserved > v_maxdate THEN 
     v_maxdate := v_date; 
    end if; 
    end loop; 
end; 

我也紛紛初始化v_maxdate外循環的。

相關問題