2014-10-16 38 views
-1

当我在一个封装体有以下功能:“标识符必须声明”使用功能

FUNCTION valida_salario(p_salary IN employees.salary%TYPE, 
         p_department_id IN employees.department_id%TYPE) 
RETURN BOOLEAN IS 
    v_prom_depto NUMBER; 
    v_var_depto NUMBER; 
BEGIN 
    SELECT AVG(salary), VARIANCE(SALARY) INTO v_prom_depto, v_var_depto 
    FROM employees 
    WHERE department_id=p_department_id; 
    -- GROUP BY department_id; 

    IF p_salary < v_prom_depto + 3* sqrt(v_var_depto) THEN 
     RETURN TRUE; 
    ELSE 
     RETURN FALSE; 
    END IF; 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line(SQLERRM); 
END valida_salario; 

,当我使用一个存储过程中的功能(此过程中体内过多) ,它显示错误:

PROCEDURE crea_empleado(p_last_name IN employees.last_name%TYPE, 
         p_first_name IN employees.first_name%TYPE, 
         p_email IN employees.email%TYPE, 
         p_hire_date IN employees.hire_date%TYPE, 
         p_job_id IN employees.job_id%TYPE, 
         p_department_id IN employees.department_id%TYPE 
            DEFAULT 80, 
         p_resultado OUT NUMBER) AS 
e_salario_no_valido EXCEPTION; 
BEGIN 

    IF valida_salario(p_salary, p_department_id) THEN // Here is located the errors 
     NULL; 
    ELSE 
     RAISE e_salario_no_valido; 
    END IF; 

    INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id) 
    VALUES (emp_seq.NEXTVAL, p_last_name, p_first_name, p_email, p_hire_date, p_job_id); 

EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     p_resultado := 2; 
     dbms_output.put_line('Datos duplicados'); 
    WHEN e_salario_no_valido THEN 
     p_resultado := 1; 
    WHEN OTHERS THEN 
     dbms_output.put_line(SQLERRM); 
    ROLLBACK; 
END crea_empleado; 

以下错误:

PL/SQL:语句被忽略和 PLS-00201:标识符 'P_SALARY' 必须声明为

但我看不到我的函数中的错误,所以我不明白它为什么会显示这些错误。 在此先感谢您的帮助

+1

就像它说的那样..你使用'p_salary',但是你没有在任何地方定义它。它从何而来? – 2014-10-16 15:37:58

+0

那么,在方法中添加p_salary不会再显示问题。谢谢 – KPavezC 2014-10-23 05:34:55

回答

1

您需要将p_salary传递到您的crea_empleado()过程中。 p_department_id在那里,但没有p_salary。

相关问题