Estud@nte 6 Denunciar post Postado Agosto 11, 2011 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
Bruno Augusto 417 Denunciar post Postado Agosto 11, 2011 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
Estud@nte 6 Denunciar post Postado Agosto 11, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Agosto 12, 2011 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
Estud@nte 6 Denunciar post Postado Agosto 13, 2011 Ó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
Andrey Knupp Vital 136 Denunciar post Postado Agosto 13, 2011 CALL é uma keyword SQL reservada para chamar as procedures, tanto no SQL, quanto no PHP, você tem que usar ele. $db->prepare( 'CALL `procedure()`' ); ;) Compartilhar este post Link para o post Compartilhar em outros sites
Estud@nte 6 Denunciar post Postado Agosto 13, 2011 @Andrey Knupp Muito Obrigado pela informação :joia: Att; Estud@nte Compartilhar este post Link para o post Compartilhar em outros sites