Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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;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 5Tem 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.
Ó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:
CALL é uma keyword SQL reservada para chamar as procedures, tanto no SQL, quanto no PHP, você tem que usar ele.
$db->prepare( 'CALL `procedure()`' );
;)
De acordo com o manual de referência (aqui e aqui), desde a versão 4.1
Qual a sintaxe que está usando?