неправильные номера или типы аргументов при вызове функции из пакета (oracle, sql)

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Итак, я получил две функции с одинаковым именем в пакете.

 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;
/
 

Функция 1: получить фамилию и имя (параметр) и вернуть полное имя
Функция 2: получить идентификатор -> получить фамилию и имя из таблицы, где ИДЕНТИФИКАТОР и возвращает полное имя

и каждый раз, когда я пытаюсь вызвать функцию, я получаю сообщение об ошибке:

PLS-00306: неправильное количество или типы аргументов при вызове ‘FULLNAME’

Я попытался вызвать функцию следующим образом: (метод с фамилией и именем)

 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;
/
 

а также вот так: (метод с идентификатором)

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

Чтобы проверить это, я использую пользователя HR.

На мой взгляд, все должно работать так, как задумано, но что-то явно не так, и я некоторое время пытался выяснить, в чем проблема, знаю.

Заранее благодарю вас за помощь в поиске решения моей проблемы.

PS: Фрагмент кода взят из статьи из журнала oracle, написанной Стивеном Фойерштейном. Ссылка

Ответ №1:

В теле вашего пакета оба определения fullname являются ФУНКЦИЯМИ, поэтому возвращаемое значение должно быть сохранено в переменной при ее вызове.

Когда вы вызываете процедуры, попробуйте вызвать их следующим образом:

 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;
/
 

Комментарии:

1. Как выглядит спецификация / заголовок вашего пакета?