0

PLS-00306関数を含むさまざまなものを呼び出す PL/SQL ブロックを実行しようとすると、エラーが発生します。この関数の役割は、特定のモデル タイプに属する車の数を数えることです。関数は、SQL ステートメントまたは独自のブロックで呼び出すと機能しますが、ここでは機能しないようです。

これは機能です:

CREATE OR REPLACE Function findtotalcarmodels(
  model_name_in IN varchar2)
RETURN NUMBER
IS
  counter NUMBER := 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;

これはブロックです:

SET SERVEROUTPUT ON FORMAT WRAP SIZE 12000 
Declare 
  v_model VARCHAR2(40);
  v_carcategory VARCHAR2(40);
  v_totalcars NUMBER;
  v_maxdate DATE:=TO_DATE(1, 'J');
  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
    v_maxdate:=TO_DATE(1, 'J');
    for rec in c1(car_rec.registration)
    loop
      IF rec.date_reserved > v_maxdate 
      then
        v_maxdate:=rec.date_reserved ;
        If car_rec.Cost <=50000 
        THEN 
          v_carcategory := 'Budget Car';
        End IF;
        If car_rec.Cost BETWEEN 50000 AND 100000 
        THEN 
          v_carcategory := 'Standard Car';
        End IF;
        If car_rec.Cost >100000 
        THEN 
          v_carcategory := 'Premium Car';
        End If;
      end IF;
      v_totalcars := findtotalcarmodels;
    end loop;
    DBMS_OUTPUT.PUT_LINE('Registration:'|| ' '|| car_rec.registration); 
    DBMS_OUTPUT.PUT_LINE('Cost:'|| ' $' || car_rec.Cost); 
    DBMS_OUTPUT.PUT_LINE('Model Name:'|| ' '|| car_rec.model_name); 
    DBMS_OUTPUT.PUT_LINE('Car Category:'|| ' '||v_carcategory);
    DBMS_OUTPUT.PUT_LINE('Total number of Cars:'|| ' '||v_totalcars);
    DBMS_OUTPUT.PUT_LINE('Most Recent Rental Date: '|| ' '||v_maxdate);
    DBMS_OUTPUT.NEW_LINE; 
  END LOOP; 
END;
/

PL/SQL ブロックのスタイルに非難される前に、それが要件に従って書かれており、関数を除いてすべてがうまく機能することを覚えておいてください。

誰かがエラーなしでこの関数を呼び出す正しい方向に私を向けることができれば、私は非常に感謝しています.

4

2 に答える 2

1

IN パラメータを関数に渡し忘れたようです。

このようにしてみて、

v_totalcars := findtotalcarmodels('<model_name_in>');
于 2013-10-18T06:26:48.950 に答える