执行功能时PL / SQL Oracle Package错误

问题描述

该软件包编译良好,但是在执行功能时,出现以下错误“'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');

enter image description here

解决方法

您共享的输出是所需的输出,而不是您实际获得的输出。通过翻译器运行错误消息是可以的,但是请注意,如果您翻译未在实际代码中翻译过的事物的名称,则其中的某些错误将毫无意义。


编辑-从翻译后的错误中进行猜测的第二次尝试。 您已将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

如果收到编译错误,该命令是获取错误的命令。我不会创建自己的表只是为了检查代码中是否没有其他错别字。