Функция и курсор вместе и перемещение указателя курсора вниз к строкам таблицы в pl / sql ?.возможный? - PullRequest
0 голосов
/ 09 октября 2018

Я ищу информацию о том, где условия совпадают, вызывая функцию FULLNAME, но в выводе я получаю только 1-ю строку. Как я могу переместить указатель курсора в зависимости от условия в другие строки в области курсора?

 create or replace function FULLNAME(code in varchar2)
return varchar2 is

    cursor t1 is
    select CODE_IATA,AIRPORT from airports2017
    where CODE_IATA in ('CDG','AMS','IST','ORD','DEL') ;
    --iata_code airports2017.code_iata%type;
    --airport_name airports2017.airport%type;

begin
      for t in t1
      loop
         if code = t.code_iata then
          return t.airport;
        elsif code = 'CDG' then
          return t.airport;
        elsif code = t.code_iata then
          return t.airport;
        elsif code = t.code_iata then
          return t.airport;
        elsif code = t.code_iata then
          return t.airport;

      else
        return 'Invalid code';
      end if;
    end loop;
    --close t1;
end;
/
declare
    name1 varchar2(80);
    name2 varchar2(80);
    name3 varchar2(80);
    name4 varchar2(80);
    name5 varchar2(80);
    --cursor t2 is select code_iata,airport from airports2017;
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;
/

Я получаю это в выводе - myOutput

Ожидаемый вывод - Ожидаемый

1 Ответ

0 голосов
/ 09 октября 2018

Это на самом деле не очень хороший вариант использования для курсора - вы просто делаете простой поиск в таблице.Я собираюсь использовать цикл 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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...