Como criar uma FUNCTION que por sua vez retorne um RECORD?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
prsantos
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Qui, 21 Fev 2008 4:08 pm
Localização: RJ
Paulo Roberto - Desenvolvedor/Analista
(21) 9-7018-4747

Boa tarde,


Segundo o tópico, é exatamente o que preciso.

Selecionar tudo

function getPartnerAddress(strIN VARCHAR2) return RECORD
is

strAN8 VARCHAR(10);

TYPE PartnerAddressType IS RECORD (ALADD1 F0116.ALADD1%TYPE,
                                   ALADD2 F0116.ALADD2%TYPE,
                                   ALADD3 F0116.ALADD3%TYPE,
                                   ALADD4 F0116.ALADD4%TYPE,
                                   ALADDZ F0116.ALADDZ%TYPE,
                                   ALCOUN F0116.ALCOUN%TYPE,
                                   ALADDS F0116.ALADDS%TYPE,
                                   ALCTR  F0116.ALCTR %TYPE);
PartnerAddressRecord PartnerAddressType;
   
begin
   /*select \*+ index(f6 f0116_1)*\
          F6.ALADD1, --ENDERECO
          F6.ALADD2, -- NUM_END_CLIFOR
          F6.ALADD3, -- COMPLEMENTO
          F6.ALADD4, --BAIRRO
          F6.ALADDZ, --CEP
          F6.ALCOUN, --MUNICIPIO
          F6.ALADDS, --COD_UF
          F6.ALCTR --COD_PAIS
   into v_ALADD1, --ENDERECO
        v_ALADD2, --NUM_END_CLIFOR
        v_ALADD3, --COMPLEMENTO
        v_ALADD4, --BAIRRO
        v_ALADDZ, --CEP
        v_ALCOUN, --MUNICIPIO
        v_ALADDS, --COD_UF
        v_ALCTR   --COD_PAIS
   FROM F0116 F6
   WHERE trim(F6.ALAN8) = SAP_Entrada.COD_CLIFOR AND
         F6.ALEFTB IN (SELECT MAX(F.ALEFTB)
                       FROM F0116 F
                       WHERE F.ALAN8 = trim(F6.ALAN8));   strOUT := strOUT || strIN;*/
   
   return PartnerAddressType;
end;

Desde já agradeço.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Paulo, beleza brother?

Então cara, crie na SPEC da tua package, ou no banco mesmo, um type.

Explicando melhor:

1) Criar Record;
2) Criar Table deste Record;
3) Referenciar o retorno da tua função do tipo desta Table.

Aqui no fórum existem vários exemplos de PL/SQL Table, inclusive funções e procedures que trabalham desta forma.

Dá uma olhada aqui mesmo e, caso não localize, manda pra gente.
prsantos
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Qui, 21 Fev 2008 4:08 pm
Localização: RJ
Paulo Roberto - Desenvolvedor/Analista
(21) 9-7018-4747

Valeu moleque!

Abraços.
prsantos
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Qui, 21 Fev 2008 4:08 pm
Localização: RJ
Paulo Roberto - Desenvolvedor/Analista
(21) 9-7018-4747

Não querendo me aproveitar, será que daria para enviar um exemplo simples disso que preciso?

Deem uma olhada no código acima por favor.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brow, segue abaixo um exemplo simples de retorno de um objeto ( PL/SQL Table ) pela função.

Selecionar tudo



DECLARE  
  -- Record 
   TYPE rteste IS RECORD (ID    number(10),
                          valor NUMBER(10,2));
   -- Table 
   TYPE tteste IS TABLE OF rteste INDEX BY BINARY_INTEGER;
   -- Recupera retorno
   vretornofunc tteste;
   -- Função que retorna Objeto
   FUNCTION fretornatable
   RETURN tteste
   IS
     vretorno tteste;
     vindice  PLS_INTEGER := 0;
   BEGIN
     --Popula Type
     FOR x IN (SELECT *
                  FROM teste)
     LOOP
       vindice := vindice + 1;
       vretorno(vindice).id    := x.id;
       vretorno(vindice).valor := x.valor;
     END LOOP;
     --
     RETURN vretorno;
     --
   END fretornatable;    
   --
BEGIN
 -- Chama função
 vretornofunc := fretornatable;
 -- Lê retorno
 FOR z IN vretornofunc.first .. vretornofunc.last
 LOOP
   dbms_output.put_line('ID:    '||vretornofunc(z).id||
                        'Valor: '||vretornofunc(z).valor); 
 END LOOP;
END;   
/*
TABELA TESTE: ID NUMBER(10)
              VALOR NUMBER(10,2)
*/

Qualquer coisa, manda pra gente.
Editado pela última vez por Trevisolli em Qui, 05 Mar 2009 8:35 am, em um total de 1 vez.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Também conhecidas como table functions.
Isso quer dizer que você pode usar um glorioso SELECT * FROM TABLE(minha_function(parametros)), pode criar uma view em cima dela, fazer joins e transformações incluindo dml, pode deixar a imaginação voar. Viva Oracle! :-o

http://download.oracle.com/docs/cd/B193 ... sthref2345
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes