从Oracle函数返回多个值

时间:2013-11-23 16:16:41

标签: 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, 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;

1 个答案:

答案 0 :(得分:1)

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

  1. 填充并返回VARCHAR2数组而不是单个VARCHAR2

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

  3. 请改用视图。这需要将程序逻辑从函数转换为SQL谓词。

  4. 旁注:如果函数被更改为返回一个数组,那么你可以将它改为一个流水线函数,这意味着如果你从一个SQL查询中调用它,它将立即开始消耗行函数返回它们,而不是等待函数完成。这可能有助于提高性能(速度和内存使用率)。