2

質問の要件は次のとおりです。

findtotalcarmodels特定のモデルに属する車の総数を返すために呼び出される PL/SQL 関数を作成します。関数には、単一の IN パラメータが model_name必要です。次に、明示カーソルを使用して、その自動車モデルに属する自動車の数をカウントし、最終的な数を返す必要があります。 この関数を作成するために、暗黙カーソル、テーブル結合、サブクエリ、セット演算子、グループ関数、または SQL 関数 (COUNT など) を使用してはなりません。

ここで、車の詳細に関するレポートを提供する 1 つの PL/SQL 匿名ブロックを記述します。PL/SQL無名ブロックを作成する完全な仕様は次のとおりです。

• 明示カーソルを使用して、すべての車の登録、コスト、およびモデル名の詳細 (registration、cost & model_name) をI_CARテーブルから取得します。

• 車の価格が 50,000 ドル以下の場合、車のコスト カテゴリを「低価格車」と決定します。車の価格が $50,000 ~ $100,000 の場合、車の価格カテゴリは「標準車」です。100,000ドルを超える他のすべての車の場合。車のコストカテゴリは「プレミアムカー」です。v_carcategory as VARCHAR2(40)車のコスト カテゴリを格納するローカル変数を宣言し ます。

• 関数を呼び出してfindtotalcarmodels、車のモデル名に属する車の総数を取得し、名前の付いたローカル変数に格納しますv_totalcars

• 車の登録を受け入れるパラメータで明示カーソルを使用して、車で行われた最新の予約を検索します。ここのテーブルのdate_reserved列を確認する必要があり ます。I_BOOKING機能を使用することはできません MAX。関連するすべての日付を比較して、最新のものを見つけます。

• 車の登録、車のコスト カテゴリ、車のモデル名、そのモデルに属する車の総数、およびその車で行われた最新の予約を示すレポートを表示します。

• 最後に、行が見つからない場合に起動する例外ハンドラを作成します。例外ハンドラーは、「行が見つかりません」というメッセージを画面に出力する必要があります。

重要事項:

• PL/SQL関数またはPL/SQL無名ブロックを作成するために、暗黙カーソル、テーブル結合、副問合せ、集合演算子、グループ関数またはSQL関数(COUNTなど)を使用しないでください。

• PL/SQL 無名ブロックは、1 つのブロックのみである必要があります。上記の仕様の各タスクを実行するブロックを作成しないでください。

これは私がこれまでに持っているものであり、正しいとはほど遠いことを知っています。

関数:

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;

編集:上記のコードは、私が今いる場所です。残っている唯一の問題は、そこに 2 番目の明示カーソルを取得して、最新のレンタル日を返すことです。これは私が困惑している主要な部分です。

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 に答える