Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Store Procedure (https://www.clubdelphi.com/foros/showthread.php?t=93981)

shoulder 05-06-2019 19:04:48

Store Procedure
 
Hola uso mysql/Delphi 7/ coneccion Zeolib, el procedimiento funciona directamente en la base mysql pero no logro llamarlo desde delphi lo estoy haciendo asi y me dice que en el contexto el procedimiento no retorna un resultado . no se que tengo mal fui haciendo el call come me funciona en la base y no encuentro mucha documentacion.



Código Delphi [-]


zquery1.SQL.Add('CALL ver(:codigo,@precio ,');
zquery1.SQL.Add('@articulo)');


zQuery1.ParamByName('codigo').value  :=  '111';


zquery1.open;
.


Gracias

bucanero 05-06-2019 19:15:14

hola a todos


El comando zquery1.open se utiliza para sentencias de tipo SELECT y en este caso estas ejecutando un procedimiento almacenado por lo que deberías de utilizar en su lugar un ZQuery1.ExecSQL;

Por otra parte, @precio y @articulo son variables que si las pasas como parámetros de entrada tienes que inicializarlas o leerlas de alguna forma con anterioridad a la llamada del procedimiento.

Si por el contrario son parámetros de salida que esperas que te devuelva el propio procedimiento, entonces tendrías que hacer posteriormente un select para mostrar esas variables

Código Delphi [-]
zquery1.SQL.Add('CALL ver(:codigo,@precio,@articulo)');
zquery1.SQL.Add('SELECT @precio,@articulo');
zQuery1.ParamByName('codigo').value  :=  '111';
zquery1.open;

shoulder 05-06-2019 20:28:21

Store Procedure
 
Hola primero muchas gracias me sigue dando error, el parametro de entrada es solo codigo y los de salida los que tienen el arroba. me da error entre el cierre de la funcion Call y el select


Código Delphi [-]
zquery1.SQL.Add('CALL ver(:codigo,@precio,@articulo)'); 
zquery1.SQL.Add('SELECT @precio,@articulo');
zQuery1.ParamByName('codigo').value  :=  '111';
zquery1.open;

//intente tambien pero igual
zquery1.SQL.Add('CALL ver(:codigo)');
zquery1.SQL.Add('SELECT @precio,@articulo');
zQuery1.ParamByName('codigo').value  :=  '111';
zquery1.open;

//tambien hice

zquery1.SQL.Add('CALL ver(:codigo,@precio,@articulo');
zquery1.SQL.Add('(SELECT @precio,@articulo)'); 
zQuery1.ParamByName('codigo').value  :=  '111';
zquery1.open;

//tambien


zquery1.SQL.Add('CALL ver(:codigo)');
zQuery1.ParamByName('codigo').value  :=  '111';
zquery1.open;
zquery1.SQL.Add('SELECT @precio,@articulo');
// ......
 zquery1.open;

bucanero 06-06-2019 12:24:20

Tienes que hacerlo sobre el mismo query en dos veces, uno para la llamada al procedimiento y otro para el propio SELECT, intentalo de esta forma, a mi así, si me funciona :

Código Delphi [-]
    ZQuery1.sql.Clear;
    zquery1.SQL.Add('CALL ver(:codigo,@precio,@articulo)');
    zQuery1.ParamByName('codigo').value := '111';
    zQuery1.ExecSQL;

    ZQuery1.sql.Clear;
    zquery1.SQL.Add('SELECT @precio,@articulo');
    zquery1.open;


Por otra parte y haciendo algunas pruebas para intentar hacerlo directo, utilice los parámetros del propio query (1 de entrada y 2 de salida).
Pero me he topado con cierto bug ya documentado de ZEOS, en cuanto al tema de los parámetros, y en particular da el error: Input parameter count is less then expected y parece venir desde la versión 6.X.
Aqui se habla del tema
http://zeoslib.sourceforge.net/viewtopic.php?t=2979
http://zeoslib.sourceforge.net/viewtopic.php?t=9357
y este sería el código que genera el error:

Código Delphi [-]
  zquery1.SQL.Add('CALL ver(:codigo, :precio,:articulo)');
    ParamByName('codigo').ParamType := ptInput;
    zQuery1.ParamByName('codigo').value := '111';
    ParamByName('precio').ParamType := ptOutput;
    ParamByName('articulo').ParamType := ptOutput;
    zQuery1.ExecSQL; //<-- aqui salta el error
    ShowMessage(ParamByName('articulo').AsString);


Aunque parece que ya han sacado algún parche para solucionarlo, en mi caso en particular estoy utilizando la version 7.2.1-rc y en ella aún sigue saliendo dicho error.

shoulder 06-06-2019 16:10:28

Store Procedure
 
Primero de todo mil gracias pero sigo con problemas me dice que en ese contexto no se puede dar datos en la primera parte para mi es que tengo una version muy vieja de ZEO es la 6.1.5. Voy a migrar a la 7.2, lo que pasa que tengo un programa muy grande quiero ver como se comporta con la nueva version de zeo, voy a desistalar zeo e instalarlo con la nueva version. Hasta probe una linea que habia encontrado en la web tampoco funciona que era esta:


Código Delphi [-]


  ZReadOnyQuery.SQL := 'select * from storedproc(:param1)';
ZReadOnyQuery.paramByName('param1').value = 1;
  ZReadOnyQuery.Open;


Para mi la version del 2004 es muy antigua estaria llena de bugs.

bucanero 06-06-2019 17:18:51

Cita:

Empezado por shoulder (Mensaje 532311)

Para mi la version del 2004 es muy antigua estaria llena de bugs.

Zeos tiene unos cuantos BUGS, y yo ya me he topado con algunos :(, aunque supongo que las ultimas versiones ya habrán corregido al menos parte de esos BUGS...

Por otra parte este código que publicas aquí, lo veo muy extraño para MySQL, y por lo menos a mi no me funciona ni incluso directamente desde PhpMyAdmin,
Cita:

Empezado por shoulder (Mensaje 532311)
Código Delphi [-]
  ZReadOnyQuery.SQL := 'select * from storedproc(:param1)';
ZReadOnyQuery.paramByName('param1').value = 1;
  ZReadOnyQuery.Open;

Porque suponiendo que storedProc es una función y que retornara algún dato entonces la forma correcta de usarla quedaría así:
Código SQL [-]
select storedproc(:param1);


La franja horaria es GMT +2. Ahora son las 07:37:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi