首页 > 解决方案 > 从包(oracle、sql)调用函数时参数的数量或类型错误

问题描述

所以,我在一个包中得到了两个同名的函数。

create or replace package body employee_pkg
as
    function fullname(
        last_in employees.last_name%type,
        first_in employees.first_name%type
    )
        return fullname_t
    is
    begin
        return last_in || ', ' || first_in;
    end;
    
    function fullname(employee_id_in in employees.employee_id%type)
        return fullname_t
    is
        l_fullname fullname_t;
    begin
        select fullname(last_name, first_name) into l_fullname
          from employees
         where employee_id = employee_id_in;
    
        return l_fullname;
    end;
end employee_pkg;
/

Fun1:获取姓氏和名字(参数)并返回全名
Fun2:获取 ID -> 从 ID 所在的表中获取姓氏和名字并返回全名

,并且每次我尝试调用该函数时都会收到错误消息:

PLS-00306:调用“全名”时参数的数量或类型错误

我尝试像这样调用函数:(使用姓氏和名字的方法)

declare
    last_in employees.last_name%type;
    first_in employees.first_name%type;

begin
    last_in := 'Lastname';
    first_in := 'Firstname';
    
    employee_pkg.fullname(last_in, first_in);
end;
/

也像这样:(带有ID的方法)

declare
    eID employees.employee_id%type;
begin
    eID := 1;
    
    employee_pkg.fullname(eID);
end;
/

为了测试它,我使用 HR 用户。

在我看来,一切都应该按预期工作,但显然有些地方是错误的,我试图弄清楚问题是什么,一段时间就知道了。

提前感谢您帮助我找到解决问题的方法。

PS:代码片段来自 Steven Feuerstein 撰写的甲骨文杂志的一篇文章。 关联

标签: sqloracleplsql

解决方案


在你的包体中,这两个定义fullname都是FUNCTIONS所以返回的值在被调用时需要存储在一个变量中。

当您调用这些过程时,请尝试像这样调用它们:

DECLARE
    last_in       employees.last_name%TYPE;
    first_in      employees.first_name%TYPE;

    eID           employees.employee_id%TYPE;

    l_full_name   fullname_t;
BEGIN
    last_in := 'Lastname';
    first_in := 'Firstname';

    l_full_name := employee_pkg.fullname (last_in, first_in);

    eID := 1;

    l_full_name := employee_pkg.fullname (eID);
END;
/

推荐阅读