Это на самом деле не очень хороший вариант использования для курсора - вы просто делаете простой поиск в таблице.Я собираюсь использовать цикл for
, потому что он похож на тот, который у вас есть, хотя цикл будет выполняться только один раз.Я опишу более понятный способ написать это внизу.
create or replace function FULLNAME(code in varchar2)
return varchar2 is
begin
for t in (select AIRPORT from airports2017
where CODE_IATA = code)
loop
return t.AIRPORT;
end loop;
return 'Invalid code';
end;
/
declare
name1 varchar2(80);
name2 varchar2(80);
name3 varchar2(80);
name4 varchar2(80);
name5 varchar2(80);
begin
name1 := fullname('ORD');
dbms_output.put_line('IATA_CODE: ORD' ||' '|| name1);
name2 := fullname('CDG');
dbms_output.put_line('IATA_CODE: CDG' ||' '|| name2);
name3 := fullname('AMS');
dbms_output.put_line('IATA_CODE: AMS' ||' '|| name3);
name4 := fullname('IST');
dbms_output.put_line('IATA_CODE: IST' ||' '|| name4);
name5 := fullname('DEL');
dbms_output.put_line('IATA_CODE: DEL' ||' '|| name5);
end;
/
Я часто вижу людей, использующих циклы с одним прогоном (как я делал выше с FULLNAME), потому что они предпочитают его обработке исключений,но это может сбить с толку.Вот еще один способ написать эту функцию поиска.
create or replace function FULLNAME(code in varchar2)
return varchar2 is
v_airport airports2017.airport%TYPE;
begin
select AIRPORT into v_airport
from airports2017
where CODE_IATA = code;
return v_airport;
exception when NO_DATA_FOUND then
return 'Invalid code';
end;
/
Редактировать: О, и если вы пытаетесь сделать автоматический цикл над таблицей airport2017, поместите курсор в свой анонимный блок.
declare
cursor t1 is
select CODE_IATA,AIRPORT from airports2017
where CODE_IATA in ('CDG','AMS','IST','ORD','DEL') ;
begin
for t in t1
loop
dbms_output.put_line('IATA_CODE: ' || t.code_iata ||' '|| FULLNAME(t.code_iata));
end loop;
end;
/