質問の要件は次のとおりです。
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 番目の明示カーソルを取得して、最新のレンタル日を返すことです。これは私が困惑している主要な部分です。