函数和光标在一起,并将光标指针向下移动到 pl/sql 中的表行? 可能吗?



我希望通过调用函数 FULLNAME 来显示条件匹配的信息,但在输出中我只得到第一行。如何根据条件将光标指针移动到光标区域中的其他行?

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

我在输出中得到这个 - 我的输出

预期输出 - 预期

对于游标来说,这实际上不是一个很好的用例 - 你只是在做一个简单的表查找。我将在这里使用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;
/

编辑:哦,如果你试图在airports2017表上进行自动循环,请将光标放在你的匿名块中。

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

最新更新