CAPÍTULO 5. SQL EMBEBIDO



 
SQL embebido

Un feo ejemplo (no escribas un programa como este ...esto es sólo con propósitos educativos)

 /* - Para verlo, aquí tienes un programa ejemplo que usa SQL embebido. SQL embebido permite
a los programadores conectar con una base de datos e incluir código SQL en su programa, y poder usar,
manipular y procesar datos de la base de datos..
- Este ejemplo de programa en C (usando SQL embebido) imprimirá un informe.
- Este programa deberá ser precompilado para las sentencias SQL, antes de la compilación normal.
- Las partes EXEC SQL son las mismas (estándar), pero el código C restante deberá ser cambiado,
incluyendo la declaración de variables si estás usando un lenguaje diferente.
-SQL embebido cambia de sistema a sistema, así que, una vez más, comprueba la documentación, especialmente la declaración
de variables y procedimientos, en donde las consideraciones del DBMS y el sistema operativo son cruciales.
*/
/* ***************************************************/
/* ESTE PROGRAMA NO ES COMPILABLE O EJECUTABLE */
/* SU PROPOSITO ES SÓLO DE SEVIR DE EJEMPLO             */
/****************************************************/
#include <stdio.h>

/* Esta sección declara las variables locales, estas deberán ser las variables que tu programa use, pero también
las variables SQL podrán ser utilizadas para tomar o dar valores */

EXEC SQL BEGIN DECLARE SECTION;
    int ID_comprador;
    char Nombre[100], Apellidos[100], Producto[100];
EXEC SQL END DECLARE SECTION;

/* Esto incluye la variable SQLCA , aquí puede haber algún error si se compilase. */

EXEC SQL INCLUDE SQLCA;
main() {

/* Este es un posible camino para conectarse con la base de datos */

EXEC SQL CONNECT UserID/Password;

/* Este código informa si estás conectado a la base de datos o si ha habido algún error durante la conexión*/

if(sqlca.sqlcode)
{
    printf(Printer, "Error conectando al servidor de la base de datos.\n");
    exit();
 }
printf("Conectado al servidor de la base de datos.\n");

/* Esto declara un "Cursor". Éste es usado cuando una consulta devuelve más de una fila, y una operación va a ser realizada en cada fila resultante de la consulta. Con cada fila establecida por esta consulta, lo usare en el informe. Después "Fetch" será usado para sacar cada fila, una a una, pero para la consulta que está actualmente ejecutada, se usará el estamento "Open". El "Declare" simplemente establece la consulta.*/

EXEC SQL DECLARE ProductoCursor CURSOR FOR
        SELECT PRODUCTO, ID_COMPRADOR
        FROM ANTIGÜEDADES
        ORDER BY PRODUCTO;

EXEC SQL OPEN ProductoCursor;

 /* +-- Podrías desear poner un bloque de chequeo de errores aquí. --+ */

/* Fetch pone los valores de la "siguiente" fila de la consulta en las variables locales, respectivamente. Sin embargo, un "priming fetch" (tecnica de programación) debe ser hecha antes. Cuando el cursor está fuera de los datos, un código SQL debe de ser generado para permitirnos salir del bucle. Para simplificar, el bucle será dejado cuando ocurra cualquier código SQL, incluso si es una código de error. De otra manera, un código de chequeo específico debería de ser preparado*/

EXEC SQL FETCH ProductoCursor INTO :Producto, :ID_comprador;

while(!sqlca.sqlcode)
{

/* Con cada fila, además hacemos un par de cosas. Primero, aumentamos el precio $5 (honorarios por tramitaciones) y extraemos el nombre del comprador para ponerlo en el informe. Para hacer esto, usaremos Update y Select, antes de imprimir la línea en la pantalla. La actuaclización, sin embargo, asume que un comprador dado sólo ha comprado uno de todos los productos dados, o sino, el precio será incrementado demasiadas veces. Por otra parte, una "FilaID" podría haber sido utilizada (ver documentación). Además observa los dos puntos antes de los nombres de las variables locales cuando son usada dentro de sentencias de SQL.*/

    EXEC SQL UPDATE ANTIGÜEDADES
    SET PRECIO = PRECIO + 5
    WHERE PRODUCTO = :Producto AND ID_COMPRADOR = :ID_comprador;

    EXEC SQL SELECT NOMBREPROPIETARIO, APELLIDOPROPIETARIO
    INTO :Nombre, :Apellidos
    FROM PROPIETARIOS_ANTIGÜEDADES
    WHERE ID_COMPRADOR = :ID_comprador;

    printf("%25s %25s %25s", Nombre, Apellidos, Producto);
/* Feo informe- sólo para propositos de ejemplo!. Veamos la siguiente fila */
    EXEC SQL FETCH ProductoCursor INTO :Producto, :ID_comprador;
}
/* Cierra el cursor, entrega los cambios (ver debajo), y sale del programa */
EXEC SQL CLOSE ProductoCursor;
EXEC SQL COMMIT RELEASE;
exit();
}