Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 13-may-2008, 16:05   #1 (permalink)
Marvin tiene algunos puntos positivos de karma
 
Avatar de Marvin
 
Fecha de Ingreso: febrero-2005
Ubicación: Santiago - Chile
Mensajes: 1.119
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.
Marvin está desconectado   Responder Citando
Antiguo 14-may-2008, 11:50   #2 (permalink)
Marvin tiene algunos puntos positivos de karma
 
Avatar de Marvin
 
Fecha de Ingreso: febrero-2005
Ubicación: Santiago - Chile
Mensajes: 1.119
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.
Marvin está desconectado   Responder Citando
Antiguo 15-may-2008, 18:54   #3 (permalink)
Marvin tiene algunos puntos positivos de karma
 
Avatar de Marvin
 
Fecha de Ingreso: febrero-2005
Ubicación: Santiago - Chile
Mensajes: 1.119
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.
Marvin está desconectado   Responder Citando
Antiguo 15-may-2008, 20:26   #4 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 824
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.
__________________
¿Quién de sus aciertos aprende?, si yo aprendo de mis errores constantemente...
gnzsoloyo está desconectado   Responder Citando
Antiguo 15-may-2008, 21:22   #5 (permalink)
Marvin tiene algunos puntos positivos de karma
 
Avatar de Marvin
 
Fecha de Ingreso: febrero-2005
Ubicación: Santiago - Chile
Mensajes: 1.119
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.
Marvin está desconectado   Responder Citando
Antiguo 15-may-2008, 22:17   #6 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 824
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.
__________________
¿Quién de sus aciertos aprende?, si yo aprendo de mis errores constantemente...
gnzsoloyo está desconectado   Responder Citando
Antiguo 15-may-2008, 23:09   #7 (permalink)
Marvin tiene algunos puntos positivos de karma
 
Avatar de Marvin
 
Fecha de Ingreso: febrero-2005
Ubicación: Santiago - Chile
Mensajes: 1.119
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.
Marvin está desconectado   Responder Citando
Antiguo 16-may-2008, 05:21   #8 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 824
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().
__________________
¿Quién de sus aciertos aprende?, si yo aprendo de mis errores constantemente...
gnzsoloyo está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 01:39.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93