问题描述
该软件包编译良好,但是在执行功能时,出现以下错误“'SEARCH FOR_EMP_NO'不是过程或尚未定义”是什么问题?我认为我在ver_emple过程中犯了一些问题。我必须将记录传递给它以显示示例中的输出文本,但我不知道该怎么做。
/* Cabecera o especificación del paquete */
CREATE OR REPLACE PACKAGE buscar_emple2
AS
TYPE t_reg_emple IS RECORD(emp_no emple.emp_no%TYPE,apellido emple.apellido%TYPE,oficio emple.oficio%TYPE,salario emple.salario%TYPE,dept_no emple.dept_no%TYPE
);
FUNCTION busca_por_emp_no(v_num_emple emple.emp_no%TYPE)
RETURN t_reg_emple;
FUNCTION busca_por_ape(v_apellido emple.apellido%TYPE)
RETURN t_reg_emple;
PROCEDURE ver_emple;
END buscar_emple2;
/* Cuerpo del paquete */
CREATE OR REPLACE PACKAGE BODY buscar_emple2
AS
vg_emple t_reg_emple;
FUNCTION busca_por_emp_no(v_num_emple emple.emp_no%TYPE)
RETURN t_reg_emple
IS
BEGIN
SELECT emp_no,apellido,oficio,salario,dept_no
INTO vg_emple
FROM emple
WHERE emp_no = v_num_emple;
RETURN vg_emple;
ver_emple;
END busca_por_emp_no;
FUNCTION busca_por_ape(v_apellido emple.apellido%TYPE)
RETURN t_reg_emple
IS
BEGIN
SELECT emp_no,dept_no
INTO vg_emple
FROM emple
WHERE apellido = v_apellido;
RETURN vg_emple;
ver_emple;
END busca_por_ape;
PROCEDURE ver_emple
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(vg_emple.emp_no|| '=======' ||vg_emple.apellido|| '=======' ||
vg_emple.oficio|| '=======' ||vg_emple.salario|| '=======' ||vg_emple.dept_no);
END ver_emple;
END buscar_emple2;
EXECUTE buscar_emple2.busca_por_emp_no(7839);
EXECUTE buscar_emple2.busca_por_ape('SALA');
解决方法
您共享的输出是所需的输出,而不是您实际获得的输出。通过翻译器运行错误消息是可以的,但是请注意,如果您翻译未在实际代码中翻译过的事物的名称,则其中的某些错误将毫无意义。
编辑-从翻译后的错误中进行猜测的第二次尝试。
您已将busca_por_emp_no
定义为FUNCTION而不是过程。为了执行它,您必须将其返回到某种东西中。您已经定义了它,以便它返回自定义类型。您可以将其定义更改为过程(没有return子句),也可以像调用函数一样调用它:
declare
myVar buscar_emple2.t_reg_emple;
begin
myVar := buscar_emple2.busca_por_emp_no(7839);
end;
/
(这是我的第一个猜测,因为这对您的代码影响最大)
您的问题是,您实际上并未将PL / SQL软件包发送到数据库进行编译,因此必须使用/
结束软件包规范和软件包主体定义。
例如
CREATE OR REPLACE PACKAGE buscar_emple2
AS
TYPE t_reg_emple IS RECORD(emp_no emple.emp_no%TYPE,apellido emple.apellido%TYPE,oficio emple.oficio%TYPE,salario emple.salario%TYPE,dept_no emple.dept_no%TYPE
);
FUNCTION busca_por_emp_no(v_num_emple emple.emp_no%TYPE)
RETURN t_reg_emple;
FUNCTION busca_por_ape(v_apellido emple.apellido%TYPE)
RETURN t_reg_emple;
PROCEDURE ver_emple;
END buscar_emple2;
/
/* Cuerpo del paquete */
CREATE OR REPLACE PACKAGE BODY buscar_emple2
AS
vg_emple t_reg_emple;
FUNCTION busca_por_emp_no(v_num_emple emple.emp_no%TYPE)
RETURN t_reg_emple
IS
BEGIN
SELECT emp_no,apellido,oficio,salario,dept_no
INTO vg_emple
FROM emple
WHERE emp_no = v_num_emple;
RETURN vg_emple;
ver_emple;
END busca_por_emp_no;
FUNCTION busca_por_ape(v_apellido emple.apellido%TYPE)
RETURN t_reg_emple
IS
BEGIN
SELECT emp_no,dept_no
INTO vg_emple
FROM emple
WHERE apellido = v_apellido;
RETURN vg_emple;
ver_emple;
END busca_por_ape;
PROCEDURE ver_emple
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(vg_emple.emp_no|| '=======' ||vg_emple.apellido|| '=======' ||
vg_emple.oficio|| '=======' ||vg_emple.salario|| '=======' ||vg_emple.dept_no);
END ver_emple;
END buscar_emple2;
/
如果能够成功编译它们,您应该会收到一条消息,如果出错,请检查编译错误并予以解决。
show errors
如果收到编译错误,该命令是获取错误的命令。我不会创建自己的表只是为了检查代码中是否没有其他错别字。