MySQL: Funcion para determinar si un ID Existe

publicado por: Anonymous

necesito hacer una funcion en mysql que me devuelva verdadero si un id existe, debo enviarle 3 parametros, nombre de la tabla, nombre del campo y el valor, si hay en dicha tabla un registro que se identifique con el valor recibido en el campo espeficicado de la tabla, entonces la funcion debe devolver TRUE, de lo contrario FALSE.

lo intente de la siguiente manera, pero no reconoce el nombre de la tabla
Error Code: 1146. Table ‘mydb.p_tabla’ doesn’t exist

CREATE DEFINER=`root`@`localhost` FUNCTION `existe_ID`(`p_tabla`VARCHAR(45), `p_campo` VARCHAR(100), `p_id` int UNSIGNED) RETURNS tinyint(1)
BEGIN
    DECLARE existe boolean DEFAULT FALSE;

    IF EXISTS (SELECT `p_campo` FROM `p_tabla` WHERE `p_campo` = `p_id`)THEN
        SET existe = TRUE;
    END IF;

  RETURN existe;
END

solución

Lo que intentas hacer no es posible debido a que la sintaxis que usa MySQL (y otros DBMSs) para la definición de sentencias DML no permite ejecutar la misma cambiando el nombre de la tabla de manera dinámica.

Esto quiere decir que el nombre de una tabla en una sentencia DML no puede ser una variable o argumento.

Por ejemplo, en la siguiente consulta:

SELECT `p_campo` FROM `p_tabla` WHERE `p_campo` = `p_id`;

Lo que se cree que va a pasar es que MySQL va a reemplazar el parámetro p_tabla por lo que contenga la misma. Pero eso no sucede, en vez de eso, él toma literalmente a p_tabla como si fuese el nombre de una tabla existente en la base de datos, pero evidentemente dicha tabla no existe.

Sin embargo te doy dos opciones para lograr lo que quieres hacer:

  1. Crear dinámicamente la sentencia que necesitas desde un lenguaje servidor (PHP, Java, NodeJS, etc) y ejecutarla con su respectivo controlador de MySQL.

  2. Usar PREPARED STATEMENTS en MySQL:

Básicamente se trata de una función de MySQL que te permite crear sentencias dinámicamente y ejecutarlas en el mismo entorno, justo lo que se supone que necesitas. Pero te advierto que tiene su precio y no fueron creadas para ello asi que lo dejo a tu consideración.

Ejemplo de uso:

DELIMITER !
CREATE PROCEDURE listar(
    IN tabla VARCHAR(50), 
    IN campo VARCHAR(50), 
    IN valor INT
)
BEGIN
    SET @query = CONCAT('SELECT * FROM ', tabla, ' WHERE ', campo, ' = ', valor);
    PREPARE statement FROM @query;       -- Preparar query.
    EXECUTE statement;                   -- Ejecutar query.
    DEALLOCATE PREPARE statement;        -- Eliminar query alojado en memoria.
END!

Inténtalo en el interprete de MySQL y mira el resultado. Debes investigar si se puede integrar con funciones porque realmente no lo se.

Aqui puedes encontrar más información acerca de los prepared statements.

Espero que esto haya sido de utilidad para ti.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.