使用2个游标,一个用于获取另一个游标的参数

时间:2013-10-17 23:41:17

标签: mysql sql oracle

我正在做一项需要我使用2个显式游标的练习。一个光标是获取第二个参数。最终目标是根据注册情况找到每辆车的最新“租赁日期”。例如,注册345JKL是在2010年6月6日,07/09/2011和08/09/2013租用的。我希望这只返回最近的日期,即08/09/2013,我希望它为表格中的每次注册提供最新日期。

我知道有更好的方法可以做到这一点,例如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 

我想而不是继续把我的头撞在桌子上,我会请求指导。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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的初始化移到了循环之外。

相关问题