2

这些是问题的要求:

创建一个调用findtotalcarmodels来返回属于特定模型的汽车总数的 PL/SQL 函数。该函数应该有一个IN 参数作为 model_name. 然后,您应该使用显式游标来计算属于该车型的汽车数量并返回最终数量。您不得使用 任何隐式游标、表连接、子查询、集合运算符、组函数或 SQL 函数(例如 COUNT)来创建此函数。

现在,编写一个提供汽车详细信息报告的 PL/SQL 匿名块。创建 PL/SQL 匿名块的完整规范如下:

• 使用显式游标,从I_CAR表中检索所有汽车注册、成本和型号名称详细信息(注册、成本和型号名称)。

• 如果汽车的成本小于或等于50,000 美元,我们将汽车成本类别确定为“经济型汽车”。如果汽车成本在 50,000 美元到 100,000 美元之间,则汽车成本类别为“标准汽车”。对于所有其他价格超过 100,000 美元的汽车;汽车成本类别是“Premium Car”。声明一个局部变量 v_carcategory as VARCHAR2(40)来存储汽车成本类别。

• 调用该函数findtotalcarmodels以获取属于汽车型号名称的汽车总数,并将它们存储在名为 的局部变量中v_totalcars

• 使用带有接受汽车注册参数的显式光标来查找最近在汽车上进行的预订。您将不得不在此处查看表格中的 date_reservedI_BOOKING。您不能使用该 MAX功能。比较所有相关日期以找到最近的日期。

• 显示一份报告,显示汽车注册、汽车成本类别、汽车型号名称、属于该型号的汽车总数以及对该汽车的最近预订。

• 最后,创建一个异常处理程序,当没有找到行时触发。异常处理程序应向屏幕输出以下消息:“No rows found”。

重要笔记:

• 不得使用任何隐式游标、表连接、子查询、集合运算符、组函数或 SQL 函数(例如 COUNT)来创建 PL/SQL 函数或 PL/SQL 匿名块。

• PL/SQL 匿名块只能是一个块。不要编写块来执行上述规范的每个任务。

这是我到目前为止所拥有的,我知道这与正确相去甚远,甚至都不好笑:

功能:

CREATE OR REPLACE Function findtotalcarmodels
    (model_name_in IN varchar2)
RETURN NUMBER
IS
    counter INTEGER := 0;
    CURSOR car_count_cur IS
      SELECT model_name FROM i_car WHERE model_name = model_name_in;
        Rec_car_details car_count_cur%ROWTYPE;
BEGIN
    OPEN car_count_cur;
    LOOP
        FETCH car_count_cur INTO Rec_car_details;
        EXIT WHEN car_count_cur%NOTFOUND;
        counter := counter + 1;
    END LOOP;

    CLOSE car_count_cur;
    RETURN counter;
END;

PL/SQL:

SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000 
Declare 
v_model VARCHAR2(40);
v_cost NUMBER;
v_reg VARCHAR2(10);
v_carcategory VARCHAR2(40);
v_totalcars NUMBER;
cursor carcur IS 
SELECT * FROM i_car;
v_car carcur%ROWTYPE;
Begin 
FOR v_car IN carcur LOOP
Select Registration, cost, model_name, findtotalcarmodels(model_name)
INTO v_reg, v_cost, v_model,v_totalcars
from i_car
WHERE registration = v_car.registration;
If v_cost <=50000 THEN v_carcategory := 'Budget Car';
End IF;
If v_cost BETWEEN 50000 AND 100000 THEN v_carcategory := 'Standard Car';
End IF;
If v_cost >100000 THEN v_carcategory := 'Premium Car';
End If;
DBMS_OUTPUT.PUT_LINE('Registration:'|| ' '|| v_car.registration); 
DBMS_OUTPUT.PUT_LINE('Cost:'|| '$' ||v_car.Cost); 
DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '||v_car.model_name); 
DBMS_OUTPUT.PUT_LINE('Car Category:'|| ' '||v_carcategory);
DBMS_OUTPUT.PUT_LINE('Total number of Cars:'|| ' '||v_totalcars);
DBMS_OUTPUT.NEW_LINE; 
END LOOP; 
End;

编辑:上面的代码是我现在的位置。剩下的唯一问题是在其中获取第二个显式光标以返回最近的租赁日期。这是让我难过的主要部分。

4

1 回答 1

3

您可以使用下面的显式光标来获取最近的租赁日期,只需比较不存在大于最近的 data_reserved 的 data_reserved

CURSOR c1(v_car_registration VARCHAR2) IS 
  SELECT * from i_booking a
  WHERE a.registration=v_car_registration
  and not exists(select 1 from i_booking b 
  where b.registration=v_car_registration
  and b.date_reserved > a.date_reserved);

您可以调用显式游标,其中 l_car_registration 是传递给游标的变量,如下所示

FOR rec in c1(l_car_registration)
LOOP
--code here 
END LOOP;

EDIT1:-使用 PLSQL 查找最近的日期

DECLARE
l_max_date DATE:=TO_DATE(1, 'J');--minimum date that can be entered in oracle database
cursor carcur IS 
SELECT * FROM i_car;
CURSOR c1(v_car_registration VARCHAR2) IS 
  SELECT * from i_booking a
  WHERE a.registration=v_car_registration;
 BEGIN
 For car_rec in carcur 
 LOOP
 l_max_date:=TO_DATE(1, 'J');
  for rec in c1(car_rec.registration)
  loop
   IF rec.date_reserved > l_max_date 
   then
    l_max_date:=rec.date_reserved ;
   end IF;
  end loop;
 dbms_output.put_line('car_registration--'||car_rec.registration||'the recent date--'||l_max_date);
 END LOOP;
 end;
于 2013-10-16T04:29:21.120 回答