#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. Как выглядит спецификация / заголовок вашего пакета?