Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Estud@nte

[Resolvido] Stored Procedures

Recommended Posts

A partir de qual versão da suporte ao Stored Procedures, atualmente estou usando este mysql-5.0.67-win32, e da uns erros de sintaxe nos códigos te teste que estou estudando da net!

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

De acordo com o manual de referência (aqui e aqui), desde a versão 4.1

 

Qual a sintaxe que está usando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

create table if not exists `clientes` (
 `cid` int(6) unsigned zerofill not null auto_increment,
 `nome` varchar(16) not null,
 `sobrenome` varchar(23) not null,
 primary key (`cid`)
) engine=innodb;

insert into `clientes` (`cid`, `nome`, `sobrenome`) values
(000001, 'andrey', 'knupp vital'),
(000002, 'gustavo', 'josé da silva'),
(000003, 'rodrigo', 'oliveira dos santos');


create table if not exists `pagamentos` (
 `pgid` smallint(6) unsigned zerofill not null auto_increment,
 `cid` int(11) not null,
 `valor` decimal(10,2) not null,
 `parcelas` tinyint(3) not null,
 `status` enum('emitidas','não emitidas') not null,
 primary key (`pgid`),
 key `cid` (`cid`)
) engine = innodb;

insert into `pagamentos` (`pgid`, `cid`, `valor`, `parcelas`, `status`) values
(000001, 1, '1200.00', 6, 'Não Emitidas')


create table `parcelas` (
 `pid` smallint(6) unsigned zerofill not null auto_increment,
 `cliente` varchar(32) not null,
 `valor` decimal(10,2) not null,
 `vencimento` datetime not null,
 `parcela` tinyint(4) not null,
 `mensagem` varchar(38) not null,
 primary key (`pid`)
) engine = innodb;

delimiter $$
create procedure `parcelas`()
begin 
    declare idpagamento int(11);
    declare idcliente int(11);
    declare totalparcelas int(11);
    declare valorpagamento decimal(10,2);
    declare parcelaatual tinyint(3);
    declare datavencimento datetime;
    declare nomecliente varchar(32);
    declare pagamentoatual decimal(10,2);
    declare vencimentoatual datetime;
    declare cur cursor for 
    select `pgid`, `pagamentos`.`cid`, `valor`, concat( `clientes`.`nome`, ' ', `clientes`.`sobrenome` ) as `nomecliente`, 
    `parcelas` from `pagamentos` inner join `clientes` on `pagamentos`.`cid` = `clientes`.`cid` where `status` = 'não emitidas';
    open cur;
     begin
         declare exit handler for sqlstate '02000' begin end;
         declare exit handler for sqlexception begin end;
         loop
               fetch cur into idpagamento, idcliente, valorpagamento, nomecliente, totalparcelas;
               set parcelaatual = totalparcelas;
               while parcelaatual >= 1 do
                   set pagamentoatual = valorpagamento / parcelaatual;
                    insert into `parcelas`( `pid`, `cliente`, `valor`, `vencimento`, `parcela`, `mensagem` ) 
                    values ( null, nomecliente, pagamentoatual, date_add( now(), interval parcelaatual month ), parcelaatual,
                    concat( parcelaatual, 'x de: ', concat('r$ ', replace( replace( replace( format( pagamentoatual, 2), '.', '|'), ',', '.'), '|', ',') ) ) );
                   set parcelaatual = parcelaatual - 1;
               end while;
               update `pagamentos` set `status` = 'emitidas' where `pgid` = idpagamento;
         end loop;
      end;
     close cur;
end$$
delimiter ;

 

o erro

 

Erro
consulta SQL:

INSERT INTO  `pagamentos` (  `pgid` ,  `cid` ,  `valor` ,  `parcelas` ,  `status` ) 
VALUES ( 000001, 1,  '1200.00', 6,  'Não Emitidas' ) 
CREATE TABLE  `parcelas` (

`pid` SMALLINT( 6 ) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT ,
`cliente` VARCHAR( 32 ) NOT NULL ,
`valor` DECIMAL( 10, 2 ) NOT NULL ,
`vencimento` DATETIME NOT NULL ,
`parcela` TINYINT( 4 ) NOT NULL ,
`mensagem` VARCHAR( 38 ) NOT NULL ,
PRIMARY KEY (  `pid` )
) ENGINE = INNODB;

Mensagens do MySQL : 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create table `parcelas` (
 `pid` smallint(6) unsigned zerofill not null auto_i' at line 5 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem um erro de sintaxe aí, não tinha percebido isso quando te passei o código, veja aqui:

insert into `pagamentos` (`pgid`, `cid`, `valor`, `parcelas`, `status`) values
(000001, 1, '1200.00', 6, 'Não Emitidas')

 

Falta um ';' depois do parênteses, por isso está dando erro quando executa o sql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ótimo! :clap:

 

Agora funcionou, só uma pergunta o comando CALL `parcelas`(), tem que ser executado direto do php ou tem uma outra maneira?

 

Estou iniciando sou Estud@ante :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.