[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