PLS-00306:从PL / SQL块调用函数时

时间:2013-10-18 06:17:34

标签: sql oracle plsql

当我尝试运行调用包括函数在内的各种事物的PL / SQL块时,我收到PLS-00306错误。该功能的工作是计算属于某种型号的汽车数量。如果我在一个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;

这是Block:

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块的样式之前,请记住它是写入需求的,除了函数之外,一切都运行良好。

如果有人能指出我正确的方向调用此功能而没有错误,我将非常感激。

2 个答案:

答案 0 :(得分:1)

看起来您错过了将IN参数传递给函数。

试试这个,

v_totalcars := findtotalcarmodels('<model_name_in>');

答案 1 :(得分:0)

好吧,当我看到正确的事情时,你不会填充参数model_name。当你没有覆盖函数时,你需要填充它。

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