Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ZeosDBO: ZStoredProc intenta hacer un SELECT a un Procedimiento Almacenado !!!! (https://www.clubdelphi.com/foros/showthread.php?t=21335)

DobleSiete 13-05-2005 18:17:12

ZeosDBO: ZStoredProc intenta hacer un SELECT a un Procedimiento Almacenado !!!!
 
Hola a todos...

He estado intentando llamar a un Procedimiento Almacenado en Delphi 7, hecho en Interbase 6.5, pero cuando activo el componente ZStoredProc, obtengo este mensaje:

Código:

"SQL Error: Dynamic SQL Error code = -84.
 procedure ZAP_MIDDATOS does not return any values.
 Error Code: -84 non-SQL security class defined The SQL:
 SELECT * FROM ZAP_MIDDATOS;"

Este es el procedimiento ZAP_MIDDATOS
Código SQL [-]
  SET term !! ; 
  CREATE PROCEDURE ZAP_MIDDATOS 
  AS 
  BEGIN 
    DELETE FROM MIDDATOS; 
  END !! 
  SET TERM ; !!

Zeos está intentado hacer un SELECT * FROM zap_middatos en vez de EXECUTE PROCEDURE zap_middatos, que sería lo correcto.

Muchos se preguntarán ¿por que no usas IBX?, bueno la respuesta es muy simple, el sistema va a entrar en una fase de transición, y la base de datos va a cambiar de Interbase 6.5 a PostgreSQL 8.0.

La gran pregunta ¿Como debo configurar el componente para que no haga un SELECT...? ¿o acaso es un error? ¿Debo modificar el código fuente de ZeosLib?

Cualquier consejo será útil...


PS: Estoy usuando ZeosDBO 6.1.5 stable.

DobleSiete 24-05-2005 14:12:46

Solución: retornar variable
 
Ya que los componentes ZStoredProc se empeñan en hacerle SELECT a procedimiento almacenado sin retorno de valores (en vez de llamarlos con EXECUTE PROCEDURE de manera inteligente) lo mas sencillo es hacer que el procedimiento retorne una variable, pero no necesariamente con un valor, de esta manera:

Código SQL [-]
  DROP PROCEDURE zap_middatos;
  
  SET TERM !!;
  CREATE PROCEDURE zap_middatos RETURNS (x INT)
  AS
  BEGIN
    DELETE FROM middatos;
  END!!
  SET TERM ;!!

La variable x (un entero) está declarada, pero no inicializada. Por lo tanto da lo mismo llamarlo con

Código SQL [-]
EXECUTE PROCEDURE zap_middatos

que usando

Código SQL [-]
SELECT * FROM zap_middatos

Pero en un componente ZStoredProc solamente el segundo funciona, imagino que es porque no es "inteligente" y no evalua si el procedimiento devuelve o no variables (no valores).

Eso es todo...
supongo que muchos lo sabían... pero unos pocos no, así que para ellos va la explicación :-)


La franja horaria es GMT +2. Ahora son las 12:18:39.

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