0

要件は次のとおりです。

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

これまでに思いついたコードは次のとおりです。

CREATE OR REPLACE Function findtotalcarmodels
(model_name IN varchar2)
RETURN NUMBER
IS
CURSOR car_count_cur IS
SELECT model_name FROM i_car;
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;
END LOOP;
CLOSE car_count_cur;
RETURN Rec_car_details;
END;

次のエラーが表示されます。

Errors for FUNCTION FINDTOTALCARMODELS:
LINE/COL     ERROR
15/1     PL/SQL: Statement ignored
15/8     PLS-00382: expression is of wrong type

ここで何が間違っていますか?

4

2 に答える 2

1

インライン関数からカーソルを返そうとしていますが、関数は整数を返そうとしています。

カーソルを反復するたびにインクリメントする(整数)カウンターが必要です...そしてそれを返すことができます。私はこれをテストしませんでしたが、これはうまくいくはずです:

CREATE OR REPLACE Function findtotalcarmodels
(model_name_in IN varchar2)
RETURN NUMBER
IS

DECLARE 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;
于 2013-10-09T01:50:16.153 に答える
1
CREATE OR REPLACE FUNCTION findtotalcarmodels (vc_model_name IN VARCHAR2)
   RETURN NUMBER
AS
   CURSOR c1
   IS
      SELECT *
        FROM i_car
       WHERE UPPER (model_name) = UPPER (vc_model_name);

   cnt   NUMBER;
BEGIN
   cnt := 0;

   FOR i IN c1 LOOP
      cnt := cnt + 1;
   END LOOP;

   RETURN cnt;
END;

などのデュアルテーブルでチェックインできます。

SELECT findtotalcarmodels('SUV1') FROM DUAL;  -- here suv1 is your modelname
于 2013-10-09T04:18:15.813 に答える