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 回答
0

好吧,当我看到正确时,您不会填写参数 model_name。当您没有带参数的覆盖函数时,您需要将其填充。

正如您还可以看到 PLS-00306 告诉您有关错误数量的参数。

于 2013-10-18T06:25:17.687 回答