0

我正在做一个需要我使用 2 个显式游标的练习。一个光标是获取第二个的参数。最终目标是根据注册找到每辆车的最新“租赁日期”。例如,注册号 345JKL 在 01/06/2010、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 

我想,与其继续把头撞在桌子上,不如寻求指导。

感谢您的帮助。

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 回答