Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/12/2010, 12:48
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Tabla como parametro en stored procedure

Las tablas no se numeran en MySQL (o en ningún otro DBMS). En este sentido tienes que dejar de lado los conceptos de programación y tratar de entender cómo se estructuran e identifican los objetos de base de datos.
Las tablas, bases, campos, funciones, índices, procedimientos, triggers, etc., se identifican sólo por sus nombres. Los números de índice que pueden poseer dentro de ciertas consultas sólo tienen existencia dentro de esa consulta y no identifican físicamente nada más.
El único modo que MySQL admite para llamar a una tabla dentro de un SP es por su nombre. Nada más. Esto implica que no se puede llamar directamente una tabla usando la cadena de texto que pueda pasarte como parámetro; al menos no estrictamente como tu lo entiendes:

Código MySQL:
Ver original
  1. CREATE PROCEDURE leertabla(IN tabla VARCHAR(100), IN campo VARCHAR(50), IN valor INT)
  2.      INSERT INTO tabla(campo) VALUES(valor);

No puedes hacerlo así porque en ese contexto "tabla" no es la variable dl parámetro "IN tabla VARCHAR(100)", sino una tabla cuyo nombre es "tabla". Simplemente no reconoce el parámetro como una variable y automáticamente toma su nombre como nombre de la tabla.
¿Se entiende?

Aún así, existe una forma de usar parámetros para definir una sentencia que se puede ejecutar tal que pueda hacer lo que quieres: Usando sentencias preparadas.

En ese contexto sería mas o menos así:

Código MySQL:
Ver original
  1. CREATE PROCEDURE leertabla(IN tabla VARCHAR(100), IN campo VARCHAR(50), IN valor INT)
  2.      @snt = CONCAT('INSERT INTO ', tabla, '(', campo, ') VALUES(', valor, ')');
  3.      PREPARE sent FROM @snt;
  4.      EXECUTE sent;
  5.      DEALLOCATE sent;

Como las sentencias preparadas existen en el ambiente de una conexión y depende de ella, debes destruirlas cuando se hayan terminado de usar (DEALLOCATE), o permanecerán en memoria hasta el cierre de la conexión.
Además, como depende de la conexión, son inaccesibles desde otra conexión a MySQL, aunque sea del mismo usuario.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)