Ir para conteúdo
Fórum Script Brasil
  • 0

Sintaxe Store Procedure - Diferença MySQL x Firebird


Matheus Peluchi

Pergunta

Bom dia pessoal,

Andei dando uma pesquisada e não encontrei um exemplo como queria.
Hoje tenho um banco de dados Firebird, e estou trocando para MySQL. Estou programando em delphi e uso componentes da paleta DBX, Gostaria de entender as diferenças entre a sintaxe de a procedure MySQL e a Firebird. Como exemplo trouxe uma Store Proedure da minha base firebird e gostaria de saber como ficaria a mesma procedure em Mysql. Dessa forma vou consegui entender melhor as diferenças.

Essa procedure seleciona os items da tabela Itensentrada, onde o Numero da entrada é a que eu passo pelo parametro  RCODENTRADa, e atualiza o estoque alimentando também uma outra tabela de  histórico de produtos e clientes.

 

Não sei exatamente se no MySQL consigo fazer isso. Imagino que sim pois as linguagens são bem semelhantes...mas não acho a sintaxe correta para montar a Store Procedure.

 

CREATE PROCEDURE ATUALIZA_ESTOQUE_ENTRADA (
    RCODENTRADA INTEGER)
AS
declare variable VCODENTRADA integer;
declare variable VCODCLIENTE integer;
declare variable VCODOBRA integer;
declare variable VCODPROD integer;
declare variable VQTDE float;
declare variable VVRUNITARIO numeric(15,2);
declare variable VTIPO char(1);
declare variable VSTATUS varchar(20);
begin
 
    FOR SELECT I.codentrada, I.codobra, I.codproduto, I.quantidade, I.vrunitario
    FROM ITENSENTRADA I
    WHERE I.codentrada = :rcodentrada
    INTO :vcodentrada, :vcodobra, :vcodprod, :vqtde, :vvrunitario do
 
    BEGIN
        vtipo = 'E';
 
        SELECT E.codcliente, e.status
        FROM ENTRADA e
        WHERE E.codentrada = :rcodentrada
        INTO :vcodcliente, :vstatus;
 
        if (:vstatus = 'ABERTA' or :vstatus = 'FINALIZADA') then exit;
        else
        begin
          UPDATE entrada e
          SET e.status = 'FINALIZADA'
          WHERE E.codentrada = :rcodentrada;
 
          UPDATE PRODUTO P SET
          P.estoque = P.estoque + :vqtde,
          P.vrunitario = :vvrunitario
          WHERE P.codproduto = :vcodprod;
 
 
          INSERT INTO HISTORICOCLIENTES(CODMOV, CODCLIENTE, CODPRODUTO, QTDE, CODOBRA, TIPO) VALUES (:vcodentrada, :vcodcliente, :vcodprod, :vqtde, :vcodobra, :vtipo);
          INSERT INTO HISTORICOPRODUTO (CODMOV, CODOBRA, CODCLIENTE, CODPROD, QTDE, VALOR, TIPO) VALUES (:vcodentrada, :vcodobra, :vcodcliente, :vcodprod, :vqtde, :vvrunitario, :vtipo);
         end
 
    END
END

 

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Basicamente é isso:

DELIMITER $$

CREATE PROCEDURE `nomedobanco`.`ATUALIZA_ESTOQUE_ENTRADA`(IN RCODENTRADA INTEGER)
BEGIN
   DECLARE VCODENTRADA INTEGER;
   DECLARE VCODOBRA INTEGER;
   DECLARE VCODPROD INTEGER;
   DECLARE VQTDE FLOAT;
   DECLARE VVRUNITARIO NUMERIC(15,2);
   
   DECLARE VCODCLIENTE INTEGER;
   DECLARE VSTATUS VARCHAR(20);
   DECLARE VTIPO CHAR(1);

   DECLARE done INT DEFAULT FALSE;
   DECLARE cur1 CURSOR FOR SELECT I.codentrada, I.codobra, I.codproduto, I.quantidade, I.vrunitario
     FROM ITENSENTRADA I 
     WHERE I.codentrada = RCODENTRADA;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
   
   OPEN cur1;
   FETCH cur1 INTO VCODENTRADA, VCODOBRA, VCODPROD, VQTDE, VVRUNITARIO;
   WHILE NOT done DO
      SET vtipo = 'E';
 
        SELECT E.codcliente, e.status INTO vcodcliente, vstatus
        FROM ENTRADA e
        WHERE E.codentrada = rcodentrada;
 
        IF NOT (vstatus = 'ABERTA' OR vstatus = 'FINALIZADA') THEN
           UPDATE entrada e
           SET e.status = 'FINALIZADA'
           WHERE E.codentrada = rcodentrada;
 
           UPDATE PRODUTO P SET
           P.estoque = P.estoque + vqtde,
           P.vrunitario = vvrunitario
           WHERE P.codproduto = vcodprod;
 
           INSERT INTO HISTORICOCLIENTES(CODMOV, CODCLIENTE, CODPRODUTO, QTDE, CODOBRA, TIPO) VALUES (vcodentrada, vcodcliente, vcodprod, vqtde, vcodobra, vtipo);
           INSERT INTO HISTORICOPRODUTO (CODMOV, CODOBRA, CODCLIENTE, CODPROD, QTDE, VALOR, TIPO) VALUES (vcodentrada, vcodobra, vcodcliente, vcodprod, vqtde, vvrunitario, vtipo);
        END IF;
        FETCH cur1 INTO VCODENTRADA, VCODOBRA, VCODPROD, VQTDE, VVRUNITARIO;
   END DO;
END$$

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...