CAPÍTULO 5. 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();
}