从Oracle函数返回多个值

从Oracle函数返回多个值,oracle,function,Oracle,Function,我需要从Oracle函数返回几个varchar变量,但当它返回某个值时,函数立即退出。我有什么办法可以做到这一点吗 这里我返回与条件匹配的第一个值,但我想返回所有值 create or replace function f_pilotosContinentes return varchar as cursor cc(codigoPiloto int) is select count(*) as numero from( select distinct pi.codigo

我需要从Oracle函数返回几个varchar变量,但当它返回某个值时,函数立即退出。我有什么办法可以做到这一点吗

这里我返回与条件匹配的第一个值,但我想返回所有值

create or replace function f_pilotosContinentes return varchar as

cursor cc(codigoPiloto int) is
    select count(*) as numero from(
        select distinct pi.codigo, c.nome from Voo v
        join Rota r on r.codigo = v.rota
        join Aeroporto a on a.codigo = r.localDestino
        join Pais p on p.codigo = a.pais
        join Continente c on c.codigo = p.continente
        join PilotoVoo pv on pv.voo = v.codigo
        join Piloto pi on pi.codigo = pv.piloto
        where pi.codigo = codigoPiloto);
pilotos cc%rowtype;

cursor cc1 is
    select p.codigo from Piloto p;
codPilotos cc1%rowtype;

duracao int;
temp int;
piloto varchar(20);

begin

duracao := 0;

open cc1;
    loop
        fetch cc1 into codPilotos;
        exit when cc1%notfound;
        --Verificar para cada piloto
        open cc(codPilotos.codigo);
            loop
                fetch cc into pilotos;
                exit when cc%notfound;

                if pilotos.numero between 3 and 4 then
                    --Buscar a duração total dos voos dele
                    select sum(v.duracao) into temp from Voo v
                    join PilotoVoo pv on pv.voo = v.codigo
                    join Piloto p on p.codigo = pv.piloto
                    where p.codigo = codPilotos.codigo;

                    if temp > duracao or duracao = 0 then
                        duracao := temp;
                    end if;
                end if;

            end loop;
        close cc;               
    end loop;
close cc1;

open cc1;
    loop
        fetch cc1 into codPilotos;
        exit when cc1%notfound;
        --Verificar para cada piloto
        open cc(codPilotos.codigo);
            loop
                fetch cc into pilotos;
                exit when cc%notfound;

                if pilotos.numero >= 3 then
                    --Buscar a duração total dos voos dele
                    select sum(v.duracao) into temp from Voo v
                    join PilotoVoo pv on pv.voo = v.codigo
                    join Piloto p on p.codigo = pv.piloto
                    where p.codigo = codPilotos.codigo;

                    if temp = duracao then
                        select p.nome into piloto from Piloto p
                        where p.codigo = codPilotos.codigo;
                        return piloto;
                    end if;
                end if;

            end loop;
        close cc;               
    end loop;
close cc1;

dbms_output.put_line('Nenhum piloto viajou para todos os continentes.');
return null;

end;

有多种方法可以从PL/SQL方法返回多个字符串:

  • 填充并返回一个VARCHAR2数组,而不是一个VARCHAR2数组

  • 使用带有多个OUT参数的过程(如果有固定数量的返回值要返回,特别是如果它们具有不同的含义,例如名称、地址、状态等,则适用)

  • 改用视图。这需要将过程逻辑从函数转换为SQL谓词


  • 旁注:如果函数更改为返回数组,那么如果希望将其更改为流水线函数,则可以将其更改为流水线函数,这意味着如果从SQL查询调用它,它将在函数返回行时立即开始使用行,而不是等待函数完成。这可能有助于提高性能(速度和内存使用)。

    请发布您目前拥有的代码,这将帮助我们评估您的需求。您在这里尝试做什么还不清楚。RETURN语句被记录为在到达某个函数或过程时退出该函数或过程(这在编程语言中并不少见!)这里没有指示您试图返回什么或返回到哪里。通过返回数组、嵌套表等当然可以返回多个值,但如果我们不知道您想做什么,我看不出您会得到多少帮助…我只能从循环中的单个赋值中猜出来。也许您希望在每次循环执行时返回一个值。看一下?之后,我再次打开光标,查看哪些行与变量“duracao”匹配,然后返回它。问题是不是只有一行会匹配该变量?我说的清楚吗?所以你有一个游标,你可以在其中传递一个值。您正在循环该游标并返回第一个值,但要返回每个值吗?您如何使用这些值?您是否能够发布相关的代码而不是这个,这似乎不是…您可以给我一个如何返回varchar2数组的示例吗?您可以声明一个数组类型,并像任何其他数据类型一样从函数中返回该类型。