使用函数时“必须声明标识符”
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”