Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Mysql (http://www.forosdelweb.com/f86/)
-   -   Procedimiento con parametros (http://www.forosdelweb.com/f86/procedimiento-con-parametros-586120/)

Marvin 13/05/2008 16:05

Procedimiento con parametros
 
Holas, tengo este procedimiento que recibe parametros para poder ejecutar una consulta pero no se en que podria estar fallando.

La idea es que sea un procedimiento global para poder chekear si existe algun dato en una tabla, como para ingresar clientes o algun uso de ese tipo.

Código:

DELIMITER $$

DROP PROCEDURE IF EXISTS `veterinaria`.`checkIfExists` $$
CREATE PROCEDURE `checkIfExists`(IN tabla varchar(100), IN campo varchar(100), IN valor varchar(100))
BEGIN
SET @esql = 'SELECT * FROM '+tabla+' WHERE '+campo+' = '+valor+'';
PREPARE consulta FROM @esql;
EXECUTE consulta;
END $$

DELIMITER ;

Me tira error en la consulta al momento de llamarla por php, pero no me da muchos detalles como para poder hacer algo al respecto.

Gracias de antemano!

Marvin 14/05/2008 11:50

Re: Procedimiento con parametros
 
Aun no he podido saber cual es el problema :S... alguien sabe que puedo estar haciendo mal ??

Gracias.

Marvin 15/05/2008 18:54

Respuesta: Procedimiento con parametros
 
Código:

DELIMITER $$

DROP PROCEDURE IF EXISTS `veterinaria`.`checkIfExists` $$
CREATE PROCEDURE `checkIfExists`(IN valor varchar(100))
BEGIN
DECLARE xnum INT;
SELECT COUNT(*) INTO xnum FROM cliente WHERE rut = '@valor';
SELECT xnum;
END $$

DELIMITER ;

Al final me decidi por hacer una consulta por cada tabla pero lo que no funciona ahora es el COUNT(*), me sale que conto 1 row pero siempre me muestra 0... alguna idea?.

Gracias.

gnzsoloyo 15/05/2008 20:26

Respuesta: Procedimiento con parametros
 
Código:

DELIMITER $$

DROP PROCEDURE IF EXISTS `veterinaria`.`checkIfExists` $$
CREATE PROCEDURE `checkIfExists`(IN valor varchar(100))
BEGIN
DECLARE xnum INT;
SELECT COUNT(*) INTO xnum FROM cliente WHERE rut = @valor;
SELECT xnum;
END $$

DELIMITER ;

Los apóstrofes (') se usan para contener strings.
En el primero el '+tabla+' es un string conteniendo "+tabla+" y los signos de adición son caracteres reservados.

Marvin 15/05/2008 21:22

Respuesta: Procedimiento con parametros
 
Sip... eso lo se... lo que pasa es que si te fijas... en el primero toda la consulta es un string y utilizaba eso para identificar tabla como parte de un string, sin eso el procedimiento me daba error.

En el segundo los apostrofes los utilizo porque rut esta como varchar en la base de datos (la verificacion del digito la hago antes)

=) lo que me pasa ahora es que al ejecutar el procedimiento y haciendole el seguimiento, la consulta me devuelve un row (o sea el count deberia ser 1) pero igualmente me devuelve un 0.

gnzsoloyo 15/05/2008 22:17

Respuesta: Procedimiento con parametros
 
Cita:

En el segundo los apostrofes los utilizo porque rut esta como varchar en la base de datos (la verificacion del digito la hago antes)
¿ Y qué tiene que ver que rut sea un varchar?, si valor también es un varchar. Al entrar declarado en el prototipo, valor es una variable que CONTIENE un varchar. La comparación no se hace con el contenido de los apóstrofes, sino con el contenido de la variable.
Es exactamente lo mismo que si en Visual Basic quisieras comparar el contenido de una variable en un sub, poniendo el nombre de la variable entre comillas...
Cita:

Sip... eso lo se... lo que pasa es que si te fijas... en el primero toda la consulta es un string y utilizaba eso para identificar tabla como parte de un string, sin eso el procedimiento me daba error.
Pero el problema no es sólo ese, sino que el signo "+" no se usa para concatenar strings. El "+" espera la presencia de valores numéricos, no cadenas de texto. Para eso existe el CONCAT().
En realidad el código debería ser:
Código:

DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfExists` $$
CREATE PROCEDURE `checkIfExists`(IN tabla varchar(100), IN campo varchar(100), IN valor varchar(100))
BEGIN
SET @esql = concat('SELECT * FROM ', tabla, ' WHERE ', campo, ' = \'', valor, '\';');
PREPARE consulta FROM @esql;
EXECUTE consulta;
END $$

DELIMITER ;

Ya lo probé y la cadena de la sentencia se genera bien...

El segmento "\'" lo estoy escribiendo para que ponga el contenido de valor entre apóstrofes, suponiendo que lo que estás ingresando es un string. Sobre esto tiene que ver en el manual las secuencias de escape.

Marvin 15/05/2008 23:09

Respuesta: Procedimiento con parametros
 
A eso era lo que queria llegar :D gracias.

Como vengo de procedimientos de SQL Server... el signo mas para mi era concatenar no mas... por eso me tiraba el error.

Gracias men! te pasaste! :arriba:

gnzsoloyo 16/05/2008 05:21

Respuesta: Procedimiento con parametros
 
El tema de los encadenamientos de valores es en realidad una extensión al SQL-99, que es en definitiva el estándar, por lo que hay que prestar bastante atención porque de DBMS en DBMS la cosa cambia.
Así como en SQL Server es el "+", en Oracle el "||" (doble barra OR) y en MYSQL Server el CONCAT().


La zona horaria es GMT -6. Ahora son las 12:10.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.