执行函数时 PL/SQL Oracle Package 错误

Posted

技术标签:

【中文标题】执行函数时 PL/SQL Oracle Package 错误【英文标题】:PL/SQL Oracle Package error when executing functions 【发布时间】:2020-10-28 21:38:14 【问题描述】:

包编译良好,但在执行函数时,出现以下错误“'SEARCH FOR_EMP_NO' is not a procedure or has not been defined”是什么问题?我想我在 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, apellido, oficio, salario, 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');

【问题讨论】:

谁知道?没有任何东西 - 在您发布的代码中 - 表明 SEARCH FOR_EMP_NO 曾经被使用过,所以这真的是一个谜。 我认为错误消息是通过翻译器传递的,busca_por_emp_no = searchfor emp no 【参考方案1】:

您共享的输出是所需的输出,而不是您获得的实际输出。通过翻译器运行错误消息很好,但请注意,如果您翻译尚未在实际代码中翻译的事物的名称,其中一些将没有任何意义。


编辑-第二次尝试从您翻译的错误中猜测。 您已将 busca_por_emp_no 定义为 FUNCTION 而不是过程。为了执行它,您必须将其返回到某些东西中。您已经定义了它,以便它返回一个自定义类型。您可以将其定义更改为一个过程(没有返回子句)或像调用函数一样调用它:

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, apellido, oficio, salario, 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

是在收到编译错误时获取错误的命令。我不会创建自己的表格来检查您的代码中是否有其他拼写错误。

【讨论】:

代码编译正常,问题是当我运行包函数时:EXECUTE buscar_emple2.busca_por_emp_no(7839); 我再次阅读了您的整个问题并发现了另一个大问题,错误消息使它有点明显-您还没有创建过程,而是创建了一个函数。我已经编辑了我的答案以包括这个以及你将如何调用你的函数。把它变成一个程序会更容易 代码中还有一个错误。这两个函数都包括对过程ver_emple 的调用。然而,在这两种情况下,调用都在 RETURN 子句之后,因此该过程永远不会执行。 RETURN 调用后的任何代码都无法访问。 好地方,我的眼睛一直忽略它。启用 pl/sql 编译器警告会提醒您此类无法访问的代码,非常值得额外的垃圾邮件 IMO。

以上是关于执行函数时 PL/SQL Oracle Package 错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g 代码上的 PL/SQL 是在执行存储过程时

Oracle_PL/SQL 动态sql

oracle SQL语句中怎么样调用存储过程

oracle数据库之PL/SQL 块结构和组成元素

oracle怎样查询数据库函数是不是被执行

oracle pl sql函数重载的语法是啥?