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

Procedimientos con OUT

Estas en el tema de Procedimientos con OUT en el foro de Mysql en Foros del Web. saludos, intento realizar este pequeño procedure, con un parametro de entreda y salida (IN, OUT) el problema es que cuando intento obtener el resultado, me ...
  #1 (permalink)  
Antiguo 15/01/2011, 10:37
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Procedimientos con OUT

saludos, intento realizar este pequeño procedure, con un parametro de entreda y salida (IN, OUT) el problema es que cuando intento obtener el resultado,
me trae NULL como tal, que estoy haciendo mal,
la ideas es poder realizar procedimientos y obtener resultados como "OK, funciono" o "NO, Funciono".

Código PHP:
DELIMITER $$

DROP PROCEDURE IF EXISTS `db`.`procedure1` $$
CREATE DEFINER=`root`@`localhostPROCEDURE `procedure1`
(
IN parameter1 INTEGEROUT variable1 VARCHAR(7))
BEGIN
  
IF parameter1 17 THEN
      SET variable1 
'birds';
    ELSE
      
SET variable1 'beasts';
  
END IF;
END $$

DELIMITER ;

CALL procedure1(17,@variable1);
SELECT @total

RESULTADO
---------------

@
Total
NULL

1 ROW fetchet
...... 
espero su respuesta.
  #2 (permalink)  
Antiguo 15/01/2011, 11:24
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Las variables de usuario deben ser inicializadas antes de ser usadas porque no tienen tipo y su valor inicial es NULL. Como NULL da por resultado NULL con cualquier operación, el valor que el SP genera se pierde.
Código MySQL:
Ver original
  1. SET  @total = '';
  2. CALL procedure1(17,@variable1);
  3. SELECT @total;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/01/2011, 15:56
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1. SET  @total = '';
  2. CALL procedure1(17,@variable1);
  3. SELECT @total;
literalmente la ejecute asi, o, la llame asi, y tuve el mismo resultado desde
el procedure, NULL, :S

sera problema de mi version de mysql?????

MySQL QUERY BROWSER version 1.2.12

'5.0.45-community-nt-log'
  #4 (permalink)  
Antiguo 15/01/2011, 18:48
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Recién miro bien tu código. Yo simplemente había puesto "@total" porque tu lo habías escrito así, pero el problema es que esa variable jamás la usas en ninguna parte, por lo que mal podría tener algo... ¿no crees? La que envías al SP se llama "@parametro1", no "@total".
Esto debería funcionar:

Código MySQL:
Ver original
  1. SET  @total = '';
  2. CALL procedure1(17,@total);
  3. SELECT @total;

Y esto también:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `db`.`procedure1` $$
  4. CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure1`
  5. (IN parameter1 INTEGER)
  6.   IF parameter1 = 17 THEN
  7.       SET  @total  = 'birds';
  8.     ELSE
  9.       SET  @total  = 'beasts';
  10.   END IF;
  11. END $$
  12.  
  13. DELIMITER ;
  14.  
  15. SET  @total  = '';
  16. CALL procedure1(17);
  17. SELECT @total
__________________
¿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 16/01/2011, 10:12
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Recién miro bien tu código. Yo simplemente había puesto "@total" porque tu lo habías escrito así, pero el problema es que esa variable jamás la usas en ninguna parte, por lo que mal podría tener algo... ¿no crees? La que envías al SP se llama "@parametro1", no "@total
mmm pero tengo 2 variables ( parameter1 que es la ENTREDA IN, variable1 que es la SALIDA OUT) y las 2 variables las ocupo, ingreso el dato con parameter1 y segun el resultado de la consulta, le asigno el valor a variable1, pero
tampoco me funciono de esta forma que posteaste ahora osea sacando la "variable1"y dejandola interna y la idea es q tenga una salida.
  #6 (permalink)  
Antiguo 16/01/2011, 17:23
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Mira, el procedure funciona con las variables tal y como lo he puesto, y esta es una demostración hecha en la consola de MySQL (MySQL Command Line):
Código MySQL:
Ver original
  1. mysql> DELIMITER $$
  2. mysql> DROP PROCEDURE IF EXISTS `procedure1` $$
  3. Query OK, 0 rows affected, 1 warning (0.00 sec)
  4.  
  5. mysql> CREATE PROCEDURE `procedure1`
  6.     -> (IN parameter1 INTEGER,
  7.     -> OUT variable1 VARCHAR(7))
  8.     -> BEGIN
  9.     ->   IF parameter1 = 17 THEN
  10.     ->       SET variable1 = 'birds';
  11.     ->     ELSE
  12.     ->       SET variable1 = 'beasts';
  13.     ->   END IF;
  14.     -> END $$
  15. Query OK, 0 rows affected (0.09 sec)
  16.  
  17. mysql>
  18. mysql> DELIMITER ;
  19. mysql> SET  @total = '';
  20. Query OK, 0 rows affected (0.00 sec)
  21.  
  22. mysql> CALL procedure1(17,@total);
  23. Query OK, 0 rows affected (0.00 sec)
  24.  
  25. mysql> SELECT @total;
  26. +--------+
  27. | @total |
  28. +--------+
  29. | birds  |
  30. +--------+
  31. 1 row in set (0.00 sec)

Como puedes ver, la variable no sólo está bien declarada como te dije, e inicializada, sino que ha tomado perfectamente el valor de salida de la variable local "variable1" (recordar que las variables del prototipo son locales, mientras que las que llevan @ son globales en la conexión).
Incluso, usando el segundo ejemplo, también funciona:
Código MySQL:
Ver original
  1. mysql> DELIMITER $$
  2. mysql> DROP PROCEDURE IF EXISTS `procedure1` $$
  3. Query OK, 0 rows affected (0.00 sec)
  4.  
  5. mysql> CREATE PROCEDURE `procedure1`
  6.     -> (IN parameter1 INTEGER)
  7.     -> BEGIN
  8.     ->   IF parameter1 = 17 THEN
  9.     ->       SET @total = 'birds';
  10.     ->     ELSE
  11.     ->       SET @total = 'beasts';
  12.     ->   END IF;
  13.     -> END $$
  14. Query OK, 0 rows affected (0.00 sec)
  15.  
  16. mysql>
  17. mysql> DELIMITER ;
  18. mysql>
  19. mysql> SET  @total = '';
  20. Query OK, 0 rows affected (0.00 sec)
  21.  
  22. mysql> CALL procedure1(17);
  23. Query OK, 0 rows affected (0.00 sec)
  24.  
  25. mysql> SELECT @total;
  26. +--------+
  27. | @total |
  28. +--------+
  29. | birds  |
  30. +--------+
  31. 1 row in set (0.00 sec)

Y también funciona en MySQL Query Browser, en tanto la conexión donde se genere el bloque de llamada sea la misma.
__________________
¿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 17/01/2011, 10:36
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT



gracias por tu tiempo ,
pero sigo sin entender porque sige mostrandome
el resultado en NULL, te muestro literalmente como realizo
la consulta, para que veas que e intentado de muchas formas posibles
pero sige sin mostrarme el resultado que, estoy de seguro que tu
codigo esta muy buen.

agradesco ayuda.
  #8 (permalink)  
Antiguo 17/01/2011, 10: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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

¿Versión de MySQL Query Browser?

La única posibilidad que conozco es que la ejecución de cada línea se produzca en una conexión diferente (como la variable depende de la conexión, si estas se cierran su valor desaparece y la variable también).
Prueba el procedimiento así:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `db`.`procedure1` $$
  4. CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure1`
  5. (IN parameter1 INTEGER)
  6.   IF parameter1 = 17 THEN
  7.       SET  @total  = 'birds';
  8.     ELSE
  9.       SET  @total  = 'beasts';
  10.   END IF;
  11.   SELECT @total;
  12. END $$
  13.  
  14. DELIMITER ;
  15.  
  16. SET  @total  = '';
  17. CALL procedure1(17);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 17/01/2011, 10:57
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Versión de MySQL Query Browser?
MySQL QUERY BROWSER version 1.2.12

'5.0.45-community-nt-log'


no me deja crearlo, me arroja 2 problemas;
1) executo tal como esta el PROCEDURE, y no se ejecuta lanza problema,
The query could not be executed. ! Description - ErrorNr.

2) le borro el select que esta dentro del PROCEDURE y arroja,
PROCEDURE procedure1 does not exist 1305

le cambio nombre al PROCEDURE y me arroja el primero.

puede que sea mi computador, o la version....
espero tu respuesta.
  #10 (permalink)  
Antiguo 17/01/2011, 11:37
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Cita:
1) executo tal como esta el PROCEDURE, y no se ejecuta lanza problema,
The query could not be executed. ! Description - ErrorNr.
¿Qué numero de error decía?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 17/01/2011, 13:08
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Qué numero de error decía?
nada en blanco, no sale ningun mensaje de que tipo de error es exactamente
podra ser la version de Mysql tengo?¿?¿??
e intentado llamar el resultado por PHP para ver si me lo muestra pero tampoco,
y necesito los mensajes atraves de PROCEDURES. :S

gracias por tu tiempo :)
  #12 (permalink)  
Antiguo 17/01/2011, 13:21
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Por un lado, el MySQL Query Browser ya está discontinuado. Fue reemplazado junto con el Administrator por el MySQL Workbench, que si es una herramienta realmente potente.
Yo aún lo uso de cuando en cuando porque cierta simpleza de trabajo que tiene me resulta útil. De todos modos está obsoleto.

Lo que no sé si te has percatado es que el MQB no ejecuta todas las sentencias que aparecen en el panel de ejecución en forma secuencial. Sólo ejecuta la sentencia donde estés posicionado con el cursor de texto. Nada más.
Eso significa que tienes que ir renglón a renglón invocando la ejecución, o no se ejecutarán.

¿Lo hiciste así, desde arriba hacia abajo?

El Workbench si las ejecuta en cadena, todas las que haya en el panel de edición. E incluso más: tiene un revisor de sintaxis que te marca dónde encuentra errores.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 18/01/2011, 10:43
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El Workbench si las ejecuta en cadena, todas las que haya en el panel de edición. E incluso más: tiene un revisor de sintaxis que te marca dónde encuentra errores.
Cambie la version del Workbench, y funciono el PROCEDURE, pero si le
quito el select @total, del final no funciona la salida,
pero por lo menos obtengo lo que queria, y no estaba trabajando con la herramienta
del Workbench (query), mucho mejor, mi consulta ahora es,

La mejor forma de tener mensajes de salida es como me explicaste?¿?¿?¿?¿?

y se que no va en esta seccion pero para continuar con el mismo post;
para rescatar el mensaje en pantalla por PHP io lo realizo asi

Código PHP:
$hostname "localhost";
$database "db";
$username "root";
$password "pass";

$link1 mysqli_connect($hostname$username$password) or die(mysqli_error($link1));
mysqli_select_db($link1,$database);

$sql "set @total='';";
$sql "CALL procedure1('17')";
$sql "SELECT @total";
$resultado mysqli_query($link1,$sql) or die('No se pudo realizar la consulta ' mysqli_error($link1)); 
o me equivoco?¿?¿? o falta algo?¿?¿?¿?

MUCHAS GRACIAS POR TU TIEMPO Y AYUDA. DE VERDAD
  #14 (permalink)  
Antiguo 18/01/2011, 10:51
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Cita:
La mejor forma de tener mensajes de salida es como me explicaste
En el contexto de lo que planteas, si. Es la forma de obtenerlos.
¿Si es la mejor? Puede que no, pero depende mucho del lenguaje que uses, y como estás usando PHP es una de las formas más sencillas.

Respecto al PHP... bueno, estás poniendo mal una parte, porque cada una de las líneas al final es una sentencia a ejecutar por si misma:

Código PHP:
$hostname "localhost";
$database "db";
$username "root";
$password "pass";

$link1 mysqli_connect($hostname$username$password) or die(mysqli_error($link1));
mysqli_select_db($link1,$database);
if(
$link1)
    
$sql "set @total='';";
    
$resultado mysqli_query($link1,$sql) ;
    if(
$resultado)
        {
$sql "CALL procedure1('17')";
        
$resultado mysqli_query($link1,$sql) ;
        if(
$resultado)
            {
$sql "SELECT @total";
              
$resultado mysqli_query($link1,$sql
                  or die(
'No se pudo realizar la consulta ' mysqli_error($link1));  
              }
         } 
de lo contrario solamente estás ejecutando la última sentencia, y obviamente te dará NULL...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 18/01/2011, 11:10
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

Lo realize como me dices pero me arroja el error ;

No se pudo realizar la consulta Commands out of sync; you can't run this command now

investigue y es porque entrega mas de un resultado, y no puedo dar con la solución, algunos dicen con limpiar la coneccion deberia funcionar pero no lo logro.

Código PHP:
function mysqli_clean_connection($dbc

while(
mysqli_more_results($dbc)) 

if(
mysqli_next_result($dbc)) 

$result mysqli_use_result($dbc); 
mysql_free_result($result); 




el primer ejemplo no lo logro emplear.
/**/

if(mysqli_more_results($link1))
while(
mysqli_next_result($link1)); 
  #16 (permalink)  
Antiguo 18/01/2011, 11:18
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, 5 meses
Puntos: 2658
Respuesta: Procedimientos con OUT

Si reinicias la conexión, la variable "@total" muere. No podrás leerla y te dará NULL.
Lo que puede corresponder usar es o tes variables distintas para los result, o bien liberar los recursos una vez terminados:

Código PHP:
Ver original
  1. $link1 = mysqli_connect($hostname, $username, $password) or die(mysqli_error($link1));
  2. mysqli_select_db($link1,$database);
  3. if($link1)
  4.     $sql = "set @total='';";
  5.     $resultado1 = mysqli_query($link1,$sql) ;
  6.     if($resultado1)
  7.         {$sql = "CALL procedure1('17')";
  8.         $resultado2 = mysqli_query($link1,$sql) ;
  9.         if($resultado2)
  10.             {$sql = "SELECT @total";
  11.               $resultado3 = mysqli_query($link1,$sql)
  12.                   or die('No se pudo realizar la consulta ' . mysqli_error($link1));  
  13.               }
  14.          }

o bien:
Código PHP:
Ver original
  1. $link1 = mysqli_connect($hostname, $username, $password) or die(mysqli_error($link1));
  2. mysqli_select_db($link1,$database);
  3. if($link1)
  4.     $sql = "set @total='';";
  5.     $resultado = mysqli_query($link1,$sql) ;
  6.     if($resultado)
  7.         {$sql = "CALL procedure1('17')";
  8.         mysql_free_result($resultado);
  9.         $resultado = mysqli_query($link1,$sql) ;
  10.         if($resultado)
  11.             {$sql = "SELECT @total";
  12.               mysql_free_result($resultado);
  13.               $resultado = mysqli_query($link1,$sql)
  14.                   or die('No se pudo realizar la consulta ' . mysqli_error($link1));  
  15.               }
  16.          }

De todos modos te recuerdo que esto ya es tema del Foro de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 18/01/2011, 11:31
Avatar de shinta_snake  
Fecha de Ingreso: diciembre-2009
Mensajes: 70
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Procedimientos con OUT

OK. sabia que vendria el CAMBIO DE FORO XD

pero muchas gracias por tu ayuda me falta esto, que el resultado aparasca en pantalla,
desde php, no logre hacer funcionar con ninguno de los 2 codigos ,
el 1ro me arroja error en los mysql_free_resultd y el mismo error (No se pudo realizar la consulta Commands out of sync; you can't run this command now) y el 2do este ultimo.

AGRADESCO TU AYUDA, TIEMPO Y PACIENCIA.

Etiquetas: procedimiento
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 15:49.