[firebase-br] Cursor

Edson de Paulo epaulo2002 em yahoo.com.br
Qui Ago 30 18:25:35 -03 2007


Paulo, quase me ofendi com o abominável, mas entendi o que você quis 
dizer. hehehe
	O que realmente acontece é que assumi um software em andamento e estou 
utilizando Crystal reports para desenvolver os relatórios, tenho por 
prática criar uma procedure para cada relatório ao invés de fazer a 
vinculação das tabelas pelo Crystal, assim eu não preciso mexer no RPT 
sempre que preciso alterar a regra de negócio do relatório e o 
desenvolvimento fica mais limpo e prático, e muitas outras vantagens que 
eu vejo, já que utilizo apenas recursos do banco e a regra toda fica no 
banco.
	O que eu quero saber na verdade é como eu faço na declaração da 
procedure para retornar os campos do meu select sem ter que declarar um 
parâmetro para cada campo do select, veja como ficou minha procedure 
atualmente:

CREATE PROCEDURE prcRelDiversosVlr (  codComitente INTEGER
                                    , codLeilao    INTEGER
                                    , sLeilao      CHAR(1)
                                    , sGuarda      CHAR(1)
                                    , sDevolucao   CHAR(1))
RETURNS (  codDiverso    INTEGER
          , cod_com       INTEGER
          , descComitente VARCHAR(50)
          , cod_bco       INTEGER
          , descColigada  VARCHAR(50)
          , lei_cod       INTEGER
          , descLeilao    VARCHAR(40)
          , dtLeilao      DATE
          , horaLeilao    VARCHAR(4)
          , lot_num       INTEGER
          , dat_ent       DATE
          , dat_sai       DATE
          , div_met       NUMERIC(10, 2)
          , vlr_lei       NUMERIC(10, 2)
          , vlr_com       NUMERIC(10, 2)
          , vlr_mer       NUMERIC(10, 2)
          , vlr_ven       NUMERIC(10, 2)
          , cod_mov       VARCHAR(1))
AS
BEGIN
   FOR SELECT div.codigo
            , div.cod_com
            , div.
            , com.nome
            , div.cod_bco
            , col.descricao
            , div.lei_cod
            , lei.descricao
            , lei.data
            , lei.hora
            , div.lot_num
            , div.dat_ent
            , div.dat_sai
            , div.div_met
            , div.vlr_lei
            , div.vlr_com
            , div.vlr_mer
            , div.vlr_ven
            , div.cod_mov
       FROM diverso div
          INNER JOIN coligada col ON (div.cod_bco = col.codigo) AND 
(div.cod_com = col.codigo_comitente)
          INNER JOIN comitente com ON (col.codigo_comitente = com.codigo)
          INNER JOIN leiloes lei ON (div.lei_cod = lei.codigo)
       WHERE com.codigo = :codComitente
         AND lei.codigo = :codLeilao
         AND div.cod_mov IN (:sLeilao, :sGuarda, :sDevolucao)
       INTO codDiverso, cod_com, descComitente, cod_bco, descColigada, 
lei_cod, descLeilao
          , dtLeilao, horaLeilao, lot_num, dat_ent, dat_sai, div_met, 
vlr_lei, vlr_com
          , vlr_mer, vlr_ven, cod_mov
   DO
   BEGIN
     SUSPEND;
   END
END

repare que no returns tenho vários parâmetros e agora mesmo preciso 
adicionar mais 1 tabela e 5 campos, imagine que conforme o relatório 
serão muitos parâmetros. Então queria aprender se existe como declarar o 
procedimento fazendo o retorno do meu select sem ter que criar 1 
parâmetro para cada campo. Entendeu? Então se existir como e você puder 
me dizer como fazer essa declaração, eu agradeço. Pergunto pois não 
encontrei na documentação.

	Acho que em meu e-mail anterior tentei generalizar e passei a impressão 
errada.

Valew

--
Edson de Paulo
Curitiba - PR





paulosxs Yahoo! escreveu:
> Edson, tanto o Oracle quanto o MS SQL possuem essa capacidade. No 
> entanto, apesar da flexibilidade, isso não é uma prática recomendada no 
> desenvolvimento de um sistema bem estruturado. Mesmo matematicamente, 
> considerando o conceito de função, no qual essas procedures se 
> enquadram, é abominável. Claro que quem decide é o desenvolvedor, mas, 
> por uma questão de boas práticas, recomendo padronizar a estrutura de 
> retorno ou criar uma procedure para cada estrutura de retorno.
> 
> 
> Edson de Paulo escreveu:
>> 	Pessoal tenho uma procedure que irá retornar um determinado select de 
>> acordo com os parâmetros que passei, os resultado de saída pode variar, 
>> com um select pode retornar Param1, Param2, Param3, com outro select 
>> pode retornar Param1 e outro retornar Param2 e Param3, ou seja o 
>> resultado é dinâmico, tem como criar essa procedure sem ter que fixar os 
>> parâmetros de retorno. Por exemplo no oracle eu faria da seguinte maneira.
>>
>> CREATE PROCEDURE prcTeste(Retorno OUT IS REF CURSOR, pTipo VARCHAR)
>> AS
>> BEGIN
>>    IF pTipo = 'S' THEN
>>      OPEN retorno FOR
>>        SELECT campo1, campo2, Campo3
>>        FROM tabela;
>>    ELSE
>>      OPEN retorno FOR
>>        SELECT campo1
>>        FROM tabela;
>>    END IF;
>> END;
>>
>> E dependendo do meu parâmetro pTipo ele irá retornar um cursor com 3 ou 
>> com 1 campo apenas.
>>
>> Espero ter sido claro na pergunta, se alguém puder me dar uma dica.
>>
>> Obrigado
>>
>>   
> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> 

-- 
Edson de Paulo
Curitiba - PR





Mais detalhes sobre a lista de discussão lista