Como chamar uma stored procedure

MySQL

25/05/2012

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
Vagner Almeida

Vagner Almeida

Curtidas 1

Respostas

Joel Rodrigues

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

Vagner Almeida

25/05/2012

para eu testar no query analyser, como eu teria que fazer?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

25/05/2012

Tenta assim:
CALL NOMEPROCEDURE(1, @val1, @val2, @val3)
SELECT @val1, @val2, @val 3
GOSTEI 0
Vagner Almeida

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

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?
GOSTEI 0
Vagner Almeida

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;



GOSTEI 0
Joel Rodrigues

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

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...
GOSTEI 0
Joel Rodrigues

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.
GOSTEI 0
POSTAR