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

Procedimiento con parametros

Estas en el tema de Procedimiento con parametros en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/05/2008, 16:05
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
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!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #2 (permalink)  
Antiguo 14/05/2008, 11:50
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Re: Procedimiento con parametros

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

Gracias.
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 15/05/2008, 18:54
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
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.
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #4 (permalink)  
Antiguo 15/05/2008, 20:26
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: 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.
__________________
¿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 15/05/2008, 21:22
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
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.
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #6 (permalink)  
Antiguo 15/05/2008, 22:17
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: 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.
__________________
¿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 15/05/2008, 23:09
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
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!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #8 (permalink)  
Antiguo 16/05/2008, 05: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, 4 meses
Puntos: 2658
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().
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 01:14.