Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Error al ejecutar funcion

Estas en el tema de Error al ejecutar funcion en el foro de Mysql en Foros del Web. Hola, estoy ejecutando las siguientes funciones: Código: CREATE FUNCTION funcion (varemail VARCHAR(40),varpass BLOB,) RETURNS VARCHAR(50) BEGIN DECLARE insemail VARCHAR(40); SET insemail = (SELECT email FROM ...
  #1 (permalink)  
Antiguo 24/05/2011, 04:08
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Error al ejecutar funcion

Hola, estoy ejecutando las siguientes funciones:

Código:
CREATE FUNCTION funcion (varemail VARCHAR(40),varpass BLOB,) RETURNS VARCHAR(50)
BEGIN   
    DECLARE insemail VARCHAR(40);    
    SET insemail = (SELECT email FROM sfusuarios WHERE email = varemail);   
    IF(insemail IS NULL) THEN
        CALL procedu(varemail,varpass);
        RETURN 'El email no existe';
    ELSE
        RETURN 'EL email ya esta en uso.';
    END IF;
END

Código:
CREATE PROCEDURE procedu (IN varemail VARCHAR(70),IN varpass BLOB)
BEGIN
    DECLARE idusuario INT;    
    START TRANSACTION;
        INSERT INTO sfusuarios (email,pass) VALUES (varemail,varpass);
        SET idusuario = (SELECT idusu FROM sfusuarios WHERE email = varemail);        
        IF(idusuario IS NOT NULL) THEN
            INSERT INTO sfperfil (idusu,fechanac) VALUES (idusuario,varfechanac);
        END IF;
        
    COMMIT;
END
Al ejecutar cada una por separado funcionan pero al intentar ejecutar la funcion tal cual la muestro me manda el siguiente error.
Explicit or implicit commit is not allowed in stored function or trigger

Última edición por rogeliomx; 24/05/2011 a las 04:13
  #2 (permalink)  
Antiguo 24/05/2011, 04:50
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Hu que mala onda creo que ya descubrí por que no se puede hay esta la respuesta:

http://www.slideshare.net/Kamisutra/db2-ibm

cuarta diapositiva ahora la pregunta como lo resuelvo T_T, seguiré buscando si alguien sabe ayuda please.
  #3 (permalink)  
Antiguo 24/05/2011, 05:12
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Quisiera cambiar mi pregunta seria lo mismo que ejecute la transacción desde PHP así:

http://gustavo.duranlinar.es/2010/09...php-y-mysql-5/

Disculpen es que en mi escuela lo único que enseñan es tecnología MS y la verdad es que eso ni necesita enseñarse esta refacil y como es comercial la ayuda o soporte es deimediato se hacer todo esto en SQL SERVER pero en MYSQL es otro rollo y apenas me estoy adaptando.
  #4 (permalink)  
Antiguo 24/05/2011, 05:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

El problema es que el iniciador de la secuencia es una stored function, y MySQL no permite que dentro de una function haya transacciones. El hecho de que la transacción se declare dentro de un stored procedure es irrelevante, porque el proceso padre no es el SP es la SF, esto es, las restricciones de proceso de la stored function son heredadas por el subproceso llamado (el SP en este caso).
Lo que pareces haber querido hacer es esquivar la restricción de la transacción impuesta a la SF y eso no es posible, o al menos no es posible hacerlo de ese modo.
La transacción es un objeto de jerarquía superior que afecta todo el proceso de la consulta, por lo que no debe ser colocado en una función, que tiene por único objeto obtener un valor dado.
En otras palabras: No lo hagas así. Usa simplemente un stored procedure donde se realice toda la tarea, o bien usa la transacción por fuera de la función, desde el PHP.

¿Se entiende el problema?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/05/2011, 10:29
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Pues por las opciones que me das solo me queda usar la transacción con PHP por que necesito hacerlo así.

Estaba leyendo algo de BEGIN WORK y BEGIN TRANSACTION, que me puedes decir sobre esto.

La transaccion es un objeto de ni.....

Entonces de ninguna forma en MYSQL podre crear una transacción dentro una funcion??

Hacer todo en el SP no funciona ya que este no regresa valores y si te fijas en la función realizo una validación que prefiero no realizar con PHP para ahorrar tiempo y esfuerzo.
  #6 (permalink)  
Antiguo 24/05/2011, 10:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

No la admite porque las funciones deben devolver un único valor, y eventualmente se usan dentro de un SELECT/INSERT/UPDATE/DELETE (raramente creas una función para invocarla sola), y como las tres últimas pueden estar ya dentro de una transacción declarada, y MySQL no admite transacciones anidadas, entonces no te puede permitir hacerlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/05/2011, 10:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

¿Qué dudas tienes sobre las transacciones?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 24/05/2011, 10:44
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Qué dudas tienes sobre las transacciones?
Tengo dudas para saber implementarlas veras hay alguna forma de crear un bloque de código en mysql algo así

INICIA TRANSACCION

EJECUTA LA FUNCION

//si todo salio bien ejecuta el commit.
TERMINA TRANSACCION

desde php asi seria vdd, encontré un articulo que eso explicaba de hecho es en el que me guiare pero antes de decidirme, si puedo crear un bloque de código así en mysql ya solo tendría que ejecutar el query desde PHP como lo estoy haciendo ahora

mysqli->query('BLOQUE DE CODIGO');
  #9 (permalink)  
Antiguo 24/05/2011, 10:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

Esto es tema más de PHP que de MySQL, pero como es algo medio híbrido te pongo la idea acá:
Código PHP:
$SERVIDOR="TuHost";
$BASE_DATOS="TuBaseDeDatos";
$USUARIO="TuUsuario";
$PASSWORD="TuPassword";

$db mysql_connect($SERVIDOR,$USUARIO,$PASSWORD);
mysql_select_db($BASE_DATOS,$db);

$error 0//variable para detectar error

mysql_query("START TRANSACTION"); // Inicio de Transacción

$result=mysql_query("INSERT INTO tabla1 VALUES (1,1000)");

if(!
$result)
$error=1;

$result=mysql_query("INSERT INTO tabla2 VALUES (1,2000)");

if(!
$result)
$error=1;

if(
$error) {
mysql_query("ROLLBACK");
echo 
"Error en la transaccion";
} else {
mysql_query("COMMIT");
echo 
"Transacción exitosa";

Mas o menos esa es la idea.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 24/05/2011, 11:04
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Gracias pero precisamente todo esto es lo que me quiero evitar al crear un bloque de código por eso creo la función que se encargaba de todo ahora de casi todo, al ejecutar la función tenia un código de PHP mas limpio por eso trate de crear la TRANSACCIÓN dentro de la función así no tenía que modificar el código de PHP, pero parece que no me voy a salvar jeje.

Bueno gracias me ayudaste con mas de una duda y me quedo muy clara la primera explicación GRACIAS.
  #11 (permalink)  
Antiguo 24/05/2011, 11:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

Entonces sólo te queda poner todo dentro de un stored procedure y llamar al stored procedure. Las transacciones sí se pueden invocar dentro de un SP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 24/05/2011, 11:44
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

pero el SP no regresa valores, solamente las funciones.
  #13 (permalink)  
Antiguo 24/05/2011, 11:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al ejecutar funcion

El SP puede regresar valores en las variables OUT e INOUT. No he probado nunca cómo se recuperan desde PHP; yo lo suelo hacer en vb.net.
Un SP también te puede devolver una tabla resultado como si fuera un SELECT, si la última sentencia es un SELECT, pero en ese caso te conviene usar la librería MySQLI, en lugar de la MySQL, para evitar problemas en la lectura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 24/05/2011, 12:25
 
Fecha de Ingreso: abril-2008
Mensajes: 316
Antigüedad: 16 años
Puntos: 3
Respuesta: Error al ejecutar funcion

Ok lo revisare haber que pasa gracias.

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:53.