Como chamar uma stored procedure
Olá...
Criei uma Stored Procedure para totalizar os valores de um caixa que eu informar e me retornar os totais.
ex.:
vlrDin 0,00
vlrCar 0,00
vlrChq 0,00
Quando executo a Procedure direto dela mesma, é retornado o valor como eu quero, Mas quando utilizo o camonado:
CALL NOMEPROCEDURE(1) -- onde 1 é o numero do caixa, aparece o seguinte erro:
Incorrect number of arguments for PROCEDURE easypharma.sp_totalizadorcx01; expected 4, got 1
COMO EU FAÇO PARA EXECUTAR A PROCEDURE?
segue abaixo o inicio do código da Procedure:
CREATE DEFINER = root@localhost PROCEDURE `sp_totalizadorcx01`(
in nrocx integer,
out vlrdin decimal(9,2),
out vlrcar decimal(9,2),
out vlrchq decimal(9,2)
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT
BEGIN
Criei uma Stored Procedure para totalizar os valores de um caixa que eu informar e me retornar os totais.
ex.:
vlrDin 0,00
vlrCar 0,00
vlrChq 0,00
Quando executo a Procedure direto dela mesma, é retornado o valor como eu quero, Mas quando utilizo o camonado:
CALL NOMEPROCEDURE(1) -- onde 1 é o numero do caixa, aparece o seguinte erro:
Incorrect number of arguments for PROCEDURE easypharma.sp_totalizadorcx01; expected 4, got 1
COMO EU FAÇO PARA EXECUTAR A PROCEDURE?
segue abaixo o inicio do código da Procedure:
CREATE DEFINER = root@localhost PROCEDURE `sp_totalizadorcx01`(
in nrocx integer,
out vlrdin decimal(9,2),
out vlrcar decimal(9,2),
out vlrchq decimal(9,2)
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT
BEGIN
Vagner Almeida
Curtidas 1
Respostas
Joel Rodrigues
25/05/2012
Como você tem parâmetros de retorno no procedure, é necessário declarar 3 variáveis e passá-las na chamada para que elas recebam os valores de retorno. Ou seja, você terá que passar 4 parâmetros, sendo um valor de entrada e 3 variáveis para receber as saídas.
GOSTEI 0
Vagner Almeida
25/05/2012
para eu testar no query analyser, como eu teria que fazer?
GOSTEI 0
Joel Rodrigues
25/05/2012
Tenta assim:
CALL NOMEPROCEDURE(1, @val1, @val2, @val3) SELECT @val1, @val2, @val 3
GOSTEI 0
Vagner Almeida
25/05/2012
para eu testar no query analyser, como eu teria que fazer?
Como eu faria isso no Delphi ????
SQL.Clear;
SQL.Add(CALL sp_totalizadorcx+sFilial+(:nrocx, @a, @b, @c));
ParamByName(nrocx).AsInteger := opCXcd;
Open;
?????
GOSTEI 0
Joel Rodrigues
25/05/2012
Rapaz, eu nunca usei MySQL no Delphi, mas vamos tentar.
Primeiramente, no Query Analyzer deu certo?
Que engine de conexão você está utilizando?
Primeiramente, no Query Analyzer deu certo?
Que engine de conexão você está utilizando?
GOSTEI 0
Vagner Almeida
25/05/2012
No Analyser deu certo, da seguinte forma
Primeiro eu executei o call, dai ele me retornou uma tabela sem campos.
CALL sp_totalizadorcx01(1, @ra, @rb, @rc)
Voltei e executei o select, dai me mostrou os resultados que eu queria ver. Obs: o nome das colunas foram os das variáveis ( @ra, @rb, @rc ).
select @ra, @rb, @rc
No delphi eu tentei fazer do mesmo jeito, executar um e depois o outro, mas logo no primeiro deu problema.
Estou usando o componente ZEUS, acesso direto.
var zqr: TZQuery;
begin
zqr := TZQuery.Create(nil);
zqr.Connection := dm.zDB;
try
with zqr do begin
SQL.Clear;
SQL.Add(CALL sp_totalizadorcx+sFilial+(:nrocx, @din, @car, @chq));
ParamByName(nrocx).AsInteger := opCXcd;
Open; //Deu um problema aqui.(menssagem: CAN NOT OPEN A RESULTSET)
SQL.Clear;
SQL.Add(select @din, @car, @chq);
Open;
ValorDin.Value := FieldByName(@din).AsFloat;
ValorCar.Value := FieldByName(@car).AsFloat;
ValorChe.Value := FieldByName(@chq).AsFloat;
end;
finally
zqr.Free;
end;
Primeiro eu executei o call, dai ele me retornou uma tabela sem campos.
CALL sp_totalizadorcx01(1, @ra, @rb, @rc)
Voltei e executei o select, dai me mostrou os resultados que eu queria ver. Obs: o nome das colunas foram os das variáveis ( @ra, @rb, @rc ).
select @ra, @rb, @rc
No delphi eu tentei fazer do mesmo jeito, executar um e depois o outro, mas logo no primeiro deu problema.
Estou usando o componente ZEUS, acesso direto.
var zqr: TZQuery;
begin
zqr := TZQuery.Create(nil);
zqr.Connection := dm.zDB;
try
with zqr do begin
SQL.Clear;
SQL.Add(CALL sp_totalizadorcx+sFilial+(:nrocx, @din, @car, @chq));
ParamByName(nrocx).AsInteger := opCXcd;
Open; //Deu um problema aqui.(menssagem: CAN NOT OPEN A RESULTSET)
SQL.Clear;
SQL.Add(select @din, @car, @chq);
Open;
ValorDin.Value := FieldByName(@din).AsFloat;
ValorCar.Value := FieldByName(@car).AsFloat;
ValorChe.Value := FieldByName(@chq).AsFloat;
end;
finally
zqr.Free;
end;
GOSTEI 0
Joel Rodrigues
25/05/2012
Ao invés de Open, chame o ExecSQL, Exec, ExecuteSQL ou semelhante (não conheço o Zeos).
GOSTEI 0
Vagner Almeida
25/05/2012
Isso mesmo.
Não é Open é ExecSQL.
assim funcionou.
SQL.Clear;
SQL.Add(CALL sp_totalizadorcx+sFilial+(:nrocx, @din, @car, @chq));
ParamByName(nrocx).AsInteger := opCXcd;
ExecSQL;
SQL.Clear;
SQL.Add(select @din, @car, @chq);
Open;
Muito obrigado...
Não é Open é ExecSQL.
assim funcionou.
SQL.Clear;
SQL.Add(CALL sp_totalizadorcx+sFilial+(:nrocx, @din, @car, @chq));
ParamByName(nrocx).AsInteger := opCXcd;
ExecSQL;
SQL.Clear;
SQL.Add(select @din, @car, @chq);
Open;
Muito obrigado...
GOSTEI 0
Joel Rodrigues
25/05/2012
Que bom que funcionou. Fico feliz por ter ajudado. Inclusive aprendi coisas novas com este tópico. Quer saber? Nunca usei MySQL e muito menos Zeos =), mas conseguimos resolver o problema.
Boa sorte em seus projetos.
Boa sorte em seus projetos.
GOSTEI 0