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