0

2 つの明示カーソルを使用する必要がある演習を行っています。1 つのカーソルは、2 番目のパラメーターを取得することです。最終的な目標は、登録に基づいて各車の最新の「レンタル日」を見つけることです。たとえば、登録 345JKL は 2010 年 1 月 6 日、2011 年 7 月 9 日、および 2013 年 8 月 9 日にレンタルされました。2013 年 8 月 9 日の最新の日付のみを返し、テーブル内のすべての登録に対して最新の日付を提供するようにします。

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 

机に頭をぶつけ続けるのではなく、指導を求めることにしました。

あなたの助けに感謝します。

4

1 に答える 1

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ループ外の初期化も移動しました。

于 2013-10-18T07:44:32.703 に答える