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

Función comprobar existencia tabla (nombre tabla por parámetro)

Estas en el tema de Función comprobar existencia tabla (nombre tabla por parámetro) en el foro de Mysql en Foros del Web. Buenas, después de mucho pelear me decido a hacer mi primera pregunta. Estoy usando MySQL Server 5.7 y tengo el siguiente código: Código: delimiter // ...
  #1 (permalink)  
Antiguo 13/04/2016, 02:21
 
Fecha de Ingreso: abril-2016
Mensajes: 1
Antigüedad: 8 años
Puntos: 0
Función comprobar existencia tabla (nombre tabla por parámetro)

Buenas,

después de mucho pelear me decido a hacer mi primera pregunta. Estoy usando MySQL Server 5.7 y tengo el siguiente código:

Código:
delimiter //

create function table_exists(str_table char(255)) returns boolean
begin

	declare to_return boolean;
    
    select count(table_name)>0 as NUM_REG
    into to_return
    from information_schema.TABLES
    where table_name = concat("'",str_table,"'")
    limit 1;
    
    set to_return = false;
    if(to_return=true) then
		set to_return = true;
	end if;
    
    return to_return;
    
end
//

Haciendo pruebas en una query aparte, almaceno el nombre de mi tabla en una variable y trato de utilizarla (como si fuera el parámetro de entrada de mi función):

Código:
select @cuTable:=concat("'",'e3g_alava',"'");
select @cuTable;
Aquí @CuTable = 'e3g_alava'

Si hago y hago las siguientes 4 pruebas, no doy con la tecla para que me de los 2 resultados que debe haber en information_schema.TABLES:

Código:
select *
from information_schema.TABLES

where table_name = @cuTable;					-- opción 1
where table_name in (select @cuTable);				-- opción 2
where table_name concat("'",@cuTable,"'");			-- opción 3
where table_name = concat("'",'e3g_alava',"'");		-- intento desesperado...
¿Alguna idea? Muchas gracias!
Saludos
  #2 (permalink)  
Antiguo 13/04/2016, 07:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Función comprobar existencia tabla (nombre tabla por parámetro)

Hola andelval:

el problema es que estas concatenando comillas al nombre de la tabla, es decir no es lo mismo 'tabla' que tabla...

checa este ejemplo. Supongamos que queremos buscar la tabla1 en el esquema pruebas, entonces hacemos esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   table_schema, table_name, ENGINE, table_rows
  3.     -> FROM information_schema.TABLES
  4.     -> WHERE
  5.     ->   table_schema = 'pruebas' AND
  6.     ->   table_name = 'tabla1';
  7. +--------------+------------+--------+------------+
  8. | table_schema | table_name | ENGINE | table_rows |
  9. +--------------+------------+--------+------------+
  10. | pruebas      | tabla1     | InnoDB |          2 |
  11. +--------------+------------+--------+------------+
  12. 1 row in set (0.00 sec)

Lo que tú estás haciendo equivale a poner algo así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   table_schema, table_name, ENGINE, table_rows
  3.     -> FROM information_schema.TABLES
  4.     -> WHERE
  5.     ->   table_schema = 'pruebas' AND
  6.     ->   table_name = '''tabla1''';
  7. Empty set (0.00 sec)

por lo tanto encontrarás la tabla sólo si el nombre de la misma incluyera las comillas.

Intenta quitando el CONCAT que tienes en la asignación de tu variable:

Código MySQL:
Ver original
  1. mysql> SET @cuTable = 'tabla1';
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT
  5.     ->   table_schema, table_name, ENGINE, table_rows
  6.     -> FROM information_schema.TABLES
  7.     -> WHERE
  8.     ->   table_schema = 'pruebas' AND
  9.     ->   table_name = @cuTable;
  10. +--------------+------------+--------+------------+
  11. | table_schema | table_name | ENGINE | table_rows |
  12. +--------------+------------+--------+------------+
  13. | pruebas      | tabla1     | InnoDB |          2 |
  14. +--------------+------------+--------+------------+
  15. 1 row in set (0.00 sec)

O si lo prefieres con SELECT :=

Código MySQL:
Ver original
  1. mysql> SELECT @cuTable:='tabla2';
  2. +--------------------+
  3. | @cuTable:='tabla2' |
  4. +--------------------+
  5. | tabla2             |
  6. +--------------------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> SELECT
  10.     ->   table_schema, table_name, ENGINE, table_rows
  11.     -> FROM information_schema.TABLES
  12.     -> WHERE
  13.     ->   table_schema = 'pruebas' AND
  14.     ->   table_name = @cuTable;
  15. +--------------+------------+--------+------------+
  16. | table_schema | table_name | ENGINE | table_rows |
  17. +--------------+------------+--------+------------+
  18. | pruebas      | tabla2     | InnoDB |          9 |
  19. +--------------+------------+--------+------------+
  20. 1 row in set (0.00 sec)

Saludos
Leo.

Etiquetas: existencia, nombre, select, sql, tabla
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 22:02.