使用函数时“必须声明标识符”

Posted

技术标签:

【中文标题】使用函数时“必须声明标识符”【英文标题】:"Identifier must be declared" when using a function 【发布时间】:2014-10-16 15:33:11 【问题描述】:

我在一个包体中有以下函数:

    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: Statement ignored and 
PLS-00201: the identifier 'P_SALARY' must be declared

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

【问题讨论】:

正如它所说的那样......您使用p_salary,但您没有在任何地方定义它。它来自哪里? 好吧,将 p_salary 添加到方法中不再显示问题。谢谢 【参考方案1】:

您需要将 p_salary 传递给您的 crea_empleado() 过程。 p_department_id 存在,但没有 p_salary。

【讨论】:

以上是关于使用函数时“必须声明标识符”的主要内容,如果未能解决你的问题,请参考以下文章

错误(357,1):PLS-00201:必须声明标识符“DBMS_OUTPUT.PUT_LINE”

必须声明 SQL 标识符,即使已经声明

Oracle TYPE 声明抛出错误 PLS-00201 - 必须声明标识符

PLS-00201:必须声明标识符“TYPE”

更新过程中的 Oracle 游标。必须声明标识符

PLS-00201:必须声明标识符“ISDATE”