执行函数时 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 错误的主要内容,如果未能解决你的问题,请参考以下文章