Помимо двойного into
, которое @Lukasz указал в комментариях, ваш запрос курсора делает следующее:
select p_cid from customers where c_name = p_cname;
p_cid
- это только что объявленное вами число, которое не имеетбыло назначено значение еще.Таким образом, вы фактически делаете:
select null from customers where c_name = p_cname;
, поэтому ваш тестовый запрос получает нулевые значения от вызовов функций.Вам нужно изменить p_cid
в этом запросе на имя столбца в таблице, которое, как я предполагаю, будет либо id
, либо c_id
:
create or replace function get_cust_id(p_cname IN varchar2)
RETURN number
IS
p_cid number;
cursor c1 is
select c_id from customers where c_name = p_cname;
BEGIN
OPEN c1;
FETCH c1 INTO p_cid;
...
Можем ли мы получить значенияот и закрыть курсор в части определения?
Нет.
Каково значение c1% не найденного блока и присвоения высокого значения 9999 для p_cid?
Если вы передадите имя, которое не существует (что не может произойти так, как вы его называете, но в любом случае оно очень надумано), тогда запрос курсора не найдет данных для этого имени.fetch
не выдаст ошибку, но на самом деле ничего не получит. Атрибут курсора% notfound` имеет значение true, поскольку ни одна строка не была выбрана.
В этой ситуации if c1%notfound
имеет значение true, поэтому выполняется оператор p_cid:=9999;
, и это значение равнопозже возвращается к вызывающей стороне.
Фактически он возвращает 9999 как «магическое число», указывающее, что не было найдено действительного идентификатора.(Возможно, было бы безопаснее либо возвратить ноль, либо выдать исключение, если это произошло - магические числа могут вызвать проблемы позже, например, - вполне очевидно, - если у вас также есть реальный клиент с идентификатором 9999 ...)
Существуют более простые способы добиться того, что выполняет эта функция, но, вероятно, она пытается научить вас конкретным вещам в ее придуманном виде.