FoxPress – Diciembre 2005

 

Usa los Procedimientos Almacenados de MySQL 5.0

 

 

             Por  la Redacción de FoxPress

Recientemente, los artífices de MySQL declararon que la versión 5.0.15 estaba lista para entrar en producción.

Una de las novedades de la versión 5.x es que soporta Procedimientos Almacenados.

Los Procedimientos Almacenados se guardan en la propia Base de Datos aunque se pueden crear de forma interactiva desde la propia Base de Datos o desde Fox.

Por ejemplo, el siguiente código es un Procedimiento Almacenado que inserta un registro con un valor en función del parámetro recibido.

 

CREATE PROCEDURE procedure1 (IN parameter1 INTEGER)

     BEGIN

            DECLARE variable1 CHAR(10);

            IF parameter1 = 17 THEN

                    SET variable1 = 'birds';

            ELSE

                    SET variable1 = 'beasts';

            END IF;

            INSERT INTO table1 VALUES (variable1);

     END

 

         Este Procedimiento Almacenado lo podrías crear interactivamente mediante la versión para MySQL 5.0 de la herramienta gratuita SQLYog

 

         Si quisieras crear y ejecutar ese  Procedimiento Almacenado desde Fox deberías:

 

         Instalarte el Driver ODBC para la versión 5.0 y ejecutar el siguiente código.

 

         Ya verás que se usa una cadena de conexión que deberás adaptar a tus parámetros.

 

CLOSE ALL

CLEAR

 

cCadena = "Driver=MySQL Connector/ODBC v5;Server=localhost;Port=3306;Option=131072;Stmt=;Database=test;Uid=root;Pwd=chalie;"

 

WAIT WINDOW 'Conectando a la Base de Datos Remota... Espere!' Nowait

nhandle = SQLSTRINGCONNECT(cCadena,.t.)

IF nhandle < 0

     ? 'Imposible Conectarse'

     RETURN

ELSE

     ? 'OK'

ENDIF

 

? SQLEXEC(nhandle,"DROP FUNCTION IF EXISTS procedure1")

 

text to lcSQL noshow

     CREATE PROCEDURE procedure1 (IN parameter1 INTEGER)

     BEGIN

            DECLARE variable1 CHAR(10);

            IF parameter1 = 17 THEN

                    SET variable1 = 'birds';

            ELSE

                    SET variable1 = 'beasts';

            END IF;

            INSERT INTO table1 VALUES (variable1);

     END

endtext

 

IF SQLEXEC(nhandle,lcSQL) = 1

     ? "Creado satisfactoriamente"

ENDIF

 

* Lo invocamos

? SQLEXEC(nhandle,"CALL procedure1(17)")

     Un documento sobre el uso de los Procedimientos Almacenados en MySQL lo tienes en  http://dev.mysql.com/tech-resources/articles/mysql-storedprocedures.html

   De todos modos una carencia actual es que el Driver ODBC para la versión 5.0 está todavía en Alfa y en algunos casos como a la hora de devolver valores desde un Procedimiento Almacenado no lo está haciendo correctamente.

 

 

 

FoxPress – Diciembre de 2005

 

==========================================================================

 

 

Estimado Director:

 

Sobre el artículo de los Procedimientos Almacenados de MySQL 5.0 quisiera comentar dos cosas:

 

-Los procedimientos almacenados así como los triggers funcionan perfectamente con el anterior ODBC 3.51.11.
-Creo haber visto un error de sintaxis ya que no veo la orden DELIMITER por ningún lado.


Os adjunto un ejemplo de procedimiento almacenado, que tengo desarrollado, Sirve para renumerar el diario contable de apuntes de una empresa y un ejercicio contable determinados:
XKE --> Código de Empresa.
XEJER --> Ejercicio contable.

--------------------------------------------------------------------------------------------------------------------------------


drop procedure if exists PCRENUM;

 

DELIMITER //
create procedure PCRENUM (IN XKE CHAR(03), IN XEJER CHAR(04))
begin

 

   declare l_loop_end INT default 0;
   declare XASIENTO DOUBLE(8,0);
   declare XDOCUMENTO CHAR(32);
   declare TXTASIENTO CHAR(8);
   
   declare TMPCURSOR cursor for select DOCUMENTO from DCAST
                            WHERE KE=XKE AND EJER=XEJER AND SWDEL<>'1'
                            GROUP BY DOCUMENTO
                            ORDER BY FECHA, TIPO, ASIENTO ;
  
   declare continue handler for sqlstate '02000' set l_loop_end = 1;

 

   open TMPCURSOR;

 

   set XASIENTO = 0;
   set XDOCUMENTO = '';
   set TXTASIENTO = '';

 

   repeat

 

      fetch TMPCURSOR into XDOCUMENTO;

 

      if not l_loop_end then
         set XASIENTO=XASIENTO+ 1 ;
         set TXTASIENTO=LPAD(XASIENTO,08,'0') ;
         UPDATE DCAST SET ASIENTO=TXTASIENTO, FECHAM=CURDATE() 
                WHERE DOCUMENTO=XDOCUMENTO AND (LINEA>'0' AND LINEA<'z') AND SWDEL<>'1' ;
      end if;

 

   until l_loop_end end repeat;

 

   close TMPCURSOR;
  
   REPLACE DCONT SET KE=XKE, NAT='99', TIPO='K', EJER=XEJER, SERIE='CCC',
                    NOMBRE='CONTABILIDAD',
                    NUMERO=XASIENTO, FECHAM=CURDATE(), SWDEL='' ;

 

end;//

 

DELIMITER ;

 

 

Antonio L. Montagut