Aplicaciones de SQL dinámico
Con SQL dinámico, un Db2 o prepara y ejecuta las sentencias SQL dentro de un programa mientras este se está ejecutando. SQL dinámico es una buena opción si no conoce el formato de una sentencia de SQL antes de escribir o ejecutar un programa.
Una aplicación que utiliza SQL dinámico genera una sentencia de SQL con formato de serie de caracteres o acepta una sentencia de SQL como entrada. Según las necesidades de la aplicación, podría ser capaz de simplificar la programación. Intente planificar la aplicación para que no utilice sentencias de SELECT o para que emita únicamente las sentencias que devuelven un número de valores conocidos de tipos de datos conocidos. En general, los programas dinámicos más complejos son aquéllos en los que no se conoce previamente las sentencias de SQL que emite la aplicación.
Una aplicación SQL dinámica típica realiza los pasos siguientes:
- Convierte los datos de entrada en una sentencia de SQL.
- Prepara la sentencia de SQL para ejecutarse y adquiere una descripción de la tabla de resultados (si existe alguna).
- Obtiene, para sentencias SELECT, suficiente almacenamiento principal para contener datos recuperados.
- Ejecuta la sentencia o capta las filas de datos.
- Procesa la información que se devuelve.
- Maneja códigos de retorno de SQL.
Este ejemplo muestra una parte de un programa C que emite dinámicamente sentencias de SQL a Db2. Suponga
que está escribiendo un programa para mantener un inventario de libros. La
tabla que necesita actualizar depende de la entrada para el programa. Este ejemplo muestra cómo puede crear una sentencia SQL y, a continuación, llamar a Db2 para ejecutarla.
/*********************************************************/
/* Determine which table to update, then build SQL */
/* statement dynamically into 'stmt' variable. */
/*********************************************************/
strcpy(stmt,"UPDATE ");
EXEC SQL SELECT TYPE INTO :book_type FROM BOOK_TYPES WHERE
TITLE=:bktitle;
IF (book_type=='FICTION') strcpy(table_name,"FICTION_BOOKS");
ELSE strcpy(table_name,"NON_FICTION_BOOKS");
strcat(stmt,table_name);
strcat(stmt,
" SET INVENTORY = INVENTORY-1 WHERE TITLE = :bktitle");
/*********************************************************/
/* PREPARE and EXECUTE the statement */
/*********************************************************/
EXEC SQL PREPARE OBJSTMT FROM :stmt;
EXEC SQL EXECUTE OBJSTMT;