[firebase-br] For Select

RedDevil reddevil em reddevil.eti.br
Ter Jun 28 13:00:44 -03 2005


ola Adalberto,

quando eu comecei a estudar as stored procedures, eu tambem acabei entrando
nessa que voce entrou...

tipow eu achava que, tomando como exemplo esse que voce postou na lista, o
"suspend" seria necessario para "varrer" toda a tabela, que a cada "suspend"
seria incluido um registro no "insert into...".

entao eu li o que o Mr. Cantu colocou na pagina 208 do seu livro, o Firebird
Essencial, e percebi que, em SP's executaveis, como eh o caso aqui, o que o
"suspend" faz eh encerrar a SP, indo para o END final... e o Mr. Cantu
tambem menciona que nao eh aconselhavel o uso do "suspend" nessas SP's, as
executaveis...

em suma, o que o "suspend" faz eh retornar os valores de saida, em uma
stored procedure selecionavel e suspender a execuçao da SP ate que o proximo
FETCH seja recebido, quando entao ele novamente retorna os valores e
suspende novamente a execuçao da SP, e assim vai, ate que sejam "varridos"
todos os registros especificados no For Select (alguma coisa assim...;o).

entao eu povoei (putz... a alguns dias atras eu escrevi "populei uma
tabela"... o que aconteceu foi que eu estava pensando em uma resposta que a
Helen deu para um cara na lista IBO Support, na qual ela usou o termo
Populate...;o) uma tabela origem com apenas oito registros cujo grupo era
igual a 4, executei essa SP ae abaixo e os oito registros cujo grupo era
igual a 4 foram inseridos na tabela destino...

create procedure xinsert
as
declare variable wcodigo integer;
declare variable wmed varchar(50);
declare variable wgrupo integer;
begin
for select meds.codigo, meds.medicamento, meds.grupo
        from medicamentos meds
        where (meds.grupo = 4)
        into :wcodigo, :wmed, :wgrupo
do
begin
insert into matmeds (codigo, medicamento, grupo)
values (:wcodigo, :wmed, :wgrupo);
end
exit;
end

ou seja, em SP's executaveis nao deve-se usar o "suspend"... apenas em SP's
selecionaveis...


[]s
força sempre.
ate +++

--
Luiz "RedDevil" Stefanski
http://www.RedDevil.eti.br - Delphi Powered by IBObjects
exemplos e dicas sobre o IBObjects:
http://www.firebase.com.br/cgi-bin/firebase.cgi/dnld?ID=165
compilaçao/instalaçao do IBObjects sabor BPG:
http://www.firebase.com.br/cgi-bin/firebase.cgi/artigo?ID=630



----- Original Message -----
From: "Edvaldo (BOL)" <evgomes em bol.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, June 27, 2005 10:42 AM
Subject: Re: [firebase-br] For Select


SE VC TIRAR O SUSPEND DE DENTRO DO BEGIN QUEM SABE FUNCIONE ...

EDVALDO

----- Original Message -----
From: "Adalberto Sousa Monteiro" <asm190 em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, June 27, 2005 10:10 AM
Subject: [firebase-br] For Select


Bom dia a todos, alguem poderia me ajudar com a seguinte duvida.
Montei a procedure abaixo, para que seja chamada pela aplicação para estar
gerando uma movimentação de vendas.

Gostaria de saber como faço para 'varrer' todos os registros retornado pelo
SELECT, dentro da propria de procedure ?
Como faço para a procedure dar o 'insert' de todos os registros ?
Ele so gera um unico registro no insert, e não todos que foram retornados
pelo select.

Desde ja agradeço
Adalberto

For SELECT EXTRACT(YEAR  FROM PED.DT_PEDIDO),
       EXTRACT(MONTH FROM PED.DT_PEDIDO),
       ITEM.CD_FORNECEDOR,
       ITEM.CD_PRODUTO,
       PED.CD_CLIENTE,
       PED.CD_REPRESENTANTE,
       SUM((ITEM.QT_VENDA * ITEM.PR_UNITARIO)) VL_TOTVENDABRT,
       SUM(ITEM.VL_TOTAL) VL_TOTVENDALIQ,
       SUM(ITEM.QT_VENDA) QT_TOTVENDA,
       SUM(ITEM.VL_COMISSAO) VL_TOTCOMIS,
       SUM(ITEM.VL_DESCONTO) VL_TOTDESC
FROM   ITEMPEDIDO ITEM, PEDIDO PED, CLIENTE CLI
WHERE  ITEM.NR_PEDIDO = PED.NR_PEDIDO AND
       CLI.CD_CLIENTE = PED.CD_CLIENTE
GROUP BY EXTRACT(YEAR  FROM PED.DT_PEDIDO),
         EXTRACT(MONTH FROM PED.DT_PEDIDO),
         ITEM.CD_FORNECEDOR,
         ITEM.CD_PRODUTO,
         PED.CD_CLIENTE,
         PED.CD_REPRESENTANTE
Into :var1, var2, var3 ... etc etc
Do Begin
    Insert into ... etc etc etc
    Suspend;
End







Mais detalhes sobre a lista de discussão lista