Como seguramente sabes, lo normal y generalmente lo mejor es que crees tablas afuera de los stored procedures y de los triggers. ¿Por qué? porque de esa manera es el propio Firebird quien se encargará de verificar que todo esté correcto en tiempo de compilación, o sea cuando los usuarios aún no están usando la Base de Datos. Si él descubre algún error (por ejemplo quisiste escribir INTEGER pero escribiste INTEGGGGER) te mostrará un mensaje adecuado y no te permitirá grabar la estructura de esa tabla. O sea que en tiempo de compilación ya descubrió el error y te lo señaló. Y eso está muy bien.

Sin embargo, a veces puedes necesitar crear tablas cuyas características desconoces en tiempo de compilación y solamente las puedes conocer en tiempo de ejecución (o sea cuando los usuarios ya están usando la Base de Datos). El problema es que si escribiste algo mal recién te enterarás en tiempo de ejecución.

Para crear una tabla en tiempo de ejecución utilizaremos el comando EXECUTE STATEMENT, como vemos a continuación:

CREATE PROCEDURE CREAR_TABLA
AS
   DECLARE VARIABLE lcComando VARCHAR(4096);
BEGIN

   lcComando = 'CREATE TABLE PRUEBA1 (
                   PRU_NUMERO INTEGER,
                   PRU_NOMBRE VARCHAR(40),
                   PRU_CANTID SMALLINT);' ;

   EXECUTE STATEMENT lcComando;

END;

Como puedes ver, el truco está en escribir un comando que se encargue de crear la tabla. Desde luego que el comando debe ser sintáticamente correcto, ya que si hay un error (escribiste INTEGGGER en lugar de INTEGER) la tabla no será creada y verás un mensaje similar al siguiente:

Invalid command.
Specified domain or source column INTEGGGER does not exist.
At procedure ‘CREAR_TABLA’ line: 11, col: 4.

Pero si escribiste todo bien podrás crear todas las tablas que quieras en tiempo de ejecución. Y eso puede ser muy útil en ciertos casos.

Además, no solamente puedes crear tablas, también si lo deseas puedes alterar tablas, borrar tablas, crearles índices, Primary Keys, Foreign Keys, etc.

CREATE PROCEDURE BORRAR_TABLA
AS
   DECLARE VARIABLE lcComando VARCHAR(1024);
BEGIN

   lcComando = 'DROP TABLE PRUEBA1;' ;

   EXECUTE STATEMENT lcComando;

END;

El stored procedure BORRAR_TABLA se encarga de borrar la tabla PRUEBA1, también si quisiéramos podríamos hacerlo más general, para que pueda borrar a cualquier tabla, no solamente a PRUEBA1. En ese caso escribiríamos algo como:

CREATE PROCEDURE BORRAR_TABLA(
   tcNombreTabla VARCHAR(32))
AS
   DECLARE VARIABLE lcComando VARCHAR(1024);
BEGIN

   lcComando = 'DROP TABLE ' || tcNombreTabla || ';' ;

   EXECUTE STATEMENT lcComando;

END;

Y lo ejecutaríamos de esta manera:

EXECUTE PROCEDURE BORRAR_TABLA('PRUEBA1');

Donde el stored procedure recibe como parámetro de entrada el nombre de la tabla que se desea borrar.

Manejo de errores

Si no eres cuidadoso varios errores pueden ocurrir, por ejemplo: quieres crear la tabla PRUEBA1 pero ya existe la tabla PRUEBA1. O quieres borrar la tabla PRUEBA1 pero no existe una tabla con ese nombre. O cuando creas una tabla su estructura está mal. O muchos otros.

Debes estar prevenido ante esas posibilidades y en tu stored procedure o trigger prever todas las posibilidades y usar excepciones para manejar los errores.

Artículos relacionados:

Entendiendo las excepciones

El índice del blog Firebird21

Anuncios