Criar SP (Stored Procedure) no MySql

MySQL, SQL Comentar >> Marcelo Korjenioski

Exe­cute o codigo para criar a tabela tb_saldo.

CREATE TABLE tb_saldo (
fk_cliente int auto_increment primary key,
nome varchar(60) not null,
cpf varchar(20) not null unique,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp
) Engine =InnoDB;

O código abaixo veri­fica se já existe uma pro­ce­dure com o mesmo nome. Caso exista ele deleta a pro­ce­dure e logo depois ele cria a sp_criar_usuario novamente.

GO
DROP PROCEDURE IF EXISTS sp_criar_usuario;
GO
create procedure sp_criar_usuario(v_nome varchar(60), v_cpf char(20), v_valor decimal(10,2))
BEGIN
IF ( (v_nome != '') AND (v_cpf != '') AND (v_valor >= 0) AND ((select count(cpf) from tb_saldo where cpf = v_cpf) = 0)) THEN
INSERT INTO tb_saldo (nome,cpf,saldo)
VALUES (v_nome, v_cpf,v_valor);
ELSE
SELECT 'Erro ao cadastrar!' AS Msg;
END IF;
END;

Crio a sto­red pro­ce­dure sp_credito para adi­ci­o­nar credito.

GO
DROP PROCEDURE IF EXISTS sp_credito;
GO
CREATE PROCEDURE sp_credito(v_cpf CHAR(20), v_valor DECIMAL(10,2))
BEGIN
IF (SELECT count(cpf) FROM tb_saldo WHERE cpf = v_cpf) THEN
UPDATE tb_saldo SET saldo = saldo + v_valor WHERE cpf = v_cpf;
ELSE
SELECT 'CPF não encontrado!' AS Msg;
END IF;
END;

Crio a sto­red pro­ce­dure sp_transferencia para trans­fe­rir cre­dito entre usuários.

GO
DROP PROCEDURE IF EXISTS sp_transferencia;
GO
CREATE PROCEDURE sp_transferencia(v_origem VARCHAR(20), v_destino VARCHAR(20), v_valor DECIMAL(10,2))
BEGIN
if ((select count(cpf) FROM tb_saldo WHERE cpf = v_origem AND saldo >= v_valor) > 0 AND (SELECT count(cpf) FROM tb_saldo WHERE cpf = v_destino) > 0 ) THEN
UPDATE tb_saldo SET saldo = saldo - v_valor WHERE cpf = v_origem;
UPDATE tb_saldo SET saldo = saldo + v_valor WHERE cpf = v_destino;
ELSE
SELECT 'Erro!' AS Msg;
END IF;
END;

Crio a sto­red pro­ce­dure sp_pks_clientes para retor­nar todas pk_cliente com o valor igual ou supe­rior ao infor­mado no argu­mento. O retorno é uma string sepa­randa por vir­gula.
A fun­ção group_concat ira con­ca­te­nar os regis­tros de fk_cliente para o retorno.

GO
DROP PROCEDURE IF EXISTS sp_pks_clientes;
GO
CREATE PROCEDURE sp_pks_clientes(v_valor DECIMAL(10,2))
BEGIN
DECLARE v_pks_clientes varchar(200);
SET v_pks_clientes = (SELECT group_concat(fk_cliente) AS codigos FROM tb_saldo  WHERE  saldo >= v_valor);
SELECT v_pks_clientes;
END;

Para cha­mar uma pro­ce­dure é neces­sá­rio usar “call sp_nome(argumentos);”.

Crio o usuá­rio Maria.

call sp_criar_usuario('Maria','03984582901','50');

Crio o usuá­rio João.

call sp_criar_usuario('João','12345678910','0');

Adi­ci­ono o valor para Maria

call sp_credito('03984582901',40);

Faço a transferencia

call sp_transferencia('03984582901','12345678910',40);

Veri­fico retorno de todas as pk_cliente em uma string com o valor igual ou supe­rior ao infor­mado na sp_usuarios.

call sp_usuarios(20);

Veri­fico se os valo­res estão corretos

select * from tb_saldo

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Com­par­ti­lhe com seus ami­gos:
  • Print
  • Facebook
  • Google Bookmarks
  • PDF
  • RSS
  • Twitter
  • LinkedIn



  • Dou­glas

    Olá, para­béns pelo POST!
    É muito claro e objetivo.

    Apro­veito para te pedir uma ajuda:
    Tenho que criar uma query onde veri­fica se há um deter­mi­nado regis­tro na tabela. Em caso posi­tivo faz um UPDATE. Em caso nega­tivo faz um DELETE.

    Ten­tei via Query e não con­se­gui. Agora estou ten­tando via PROCEDURE, mas dá o seguinte erro:

    ‘You have an error in your SQL syn­tax; check the manual that cor­res­ponds to your MySQL ser­ver ver­sion for the right syn­tax to use near ‘END’ at line 1′.

    Abaixo está o código:

    DROP PROCEDURE IF EXISTS mySp_Desativar;
    CREATE PROCEDURE mySp_Desativar(IN v_Categoria_ID CHAR(2))
    BEGIN
    IF (SELECT COUNT(*) FROM pro­du­tos WHERE Categoria_ID = v_Categoria_ID) THEN
    UPDATE cate­go­rias
    SET Categorias_Status = 0
    WHERE Categoria_ID = v_Categoria_ID;
    ELSE
    DELETE cate­go­rias
    WHERE Categoria_ID = v_Categoria_ID;
    END IF;
    END;

    Acho que ins­ta­lei o mySQL InnoDB, se faz dife­rença.
    Obrigado.

blog comments powered by Disqus
Designed by NattyWP Wordpress Themes.
Images by desEXign.