Publicado el 6 de Julio del 2017
1.472 visualizaciones desde el 6 de Julio del 2017
116,7 KB
20 paginas
Creado hace 15a (21/04/2009)
SQL Embebido
Introducción (I)
z SQL directo (o interactivo): las instrucciones se
ejecutan directamente desde el terminal y el resultado
de las consultas se visualiza en el monitor de la
estación.
z SQL embebido: utilizado intercalando sus instrucciones
en el código de un programa escrito en un lenguaje de
programación al que se denomina lenguaje anfitrión
(FORTRAN, COBOL, C, etc.).
2
Introducción (II)
z La forma de construir un programa con SQL
embebido varía dependiendo del lenguaje y
el gestor de BD utilizados
z Nosotros estudiaremos el caso de SQL
embebido en C contra Oracle.
z Oracle ha definido un lenguaje especial para
soportar este tipo de programación: lenguaje
Pro*C
3
Introducción (III)
z SQL embebido en
Oracle: Proceso de
compilación y enlazado
(link) de un programa
Pro*C
4
Introducción (IV)
z Estructura de un programa Pro*C:
Inclusión de cabeceras
Declaración de variables
Declaración de VARIABLES huésped
Comienzo del código del programa
...
Instrucciones propias del lenguaje
CONEXIÓN con la base de datos
...
...
...
Instrucciones de SQL: DML, DDL
+
Instrucciones propias del lenguaje
DESCONEXIÓN de la base de datos
Instrucciones propias del lenguaje
...
...
Fin del código de programa
Índice:
z Sintaxis general de las instrucciones básicas
de SQL embebido
z Sentencias básicas de SQL embebido:
{Declaración de variables
{Control de errores
{Conexión /desconexión de la base de datos
{Consultas (sentencias select)
{Sentencias de modificación de datos: (insert,
update,delete)
{Sentencias de modificación de la BD (create, …)
{Ejecución de sentencias SQL a partir de strings:
SQL dinámico.
5
6
Sintaxis general de las sentencias de
SQL embebido (I)
z En general, cualquier instrucción del SQL interactivo se puede
utilizar en el SQL embebido con pequeñas variaciones
sintácticas.
z Existen, además, instrucciones específicas del SQL para la
gestión de los conjuntos de tuplas obtenidos como resultado de
alguna consulta.
z También: directivas del precompilador: gestión de errores,
delimitación de segmentos de programa, etc.
7
Sintaxis general de las sentencias de
SQL embebido (II)
z Consideraciones generales de sintaxis:
{ Todas las instrucciones del SQL embebido van precedidas
de las palabras reservadas EXEC SQL y finalizan con un
símbolo especial.
{ En el lenguaje Pro*C este símbolo es el punto y coma (;).
EXEC SQL delete from emp;
{ Esta notación permite al precompilador identificar y procesar
estas instrucciones para traducirlas a código C estándar.
8
Declaración de variables (I)
z Las variables del lenguaje que son utilizadas en
instrucciones SQL (variables huéspedes) deben ser
declaradas en una sección especial encabezada y
terminada de la siguiente forma:
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;
...
z Las variables huésped constituyen la única vía de
intercambio de datos entre el programa huésped y la
base de datos.
Declaración de variables (II)
z La declaración y el uso de una variable huésped se realizan en
la forma convencional del lenguaje C:
long empno;
…
empno = 123;
z Pueden aparecer en una instrucción SQL en cualquier lugar en
el que puede aparecer una expresión o valor del mismo tipo, y
deben ir precedidas del símbolo dos puntos ( : ).
EXEC SQL SELECT * … FROM EMP WHERE EMPNO = :empno;
z No se pueden utilizar para representar a objetos de la base de
datos (nombres de tabla, columna, etc.)
char tabla[] = “emp”;
…
EXEC SQL SELECT * FROM :tabla
(INCORRECTO!!!)
9
10
Declaración de variables (III)
z Los siguientes tipos utilizados en C pueden ser utilizados
para definir variables huésped:
{ char
{ char[n]
{ int
{ short
{ long
{ float
{ double
{ VARCHAR[n]
Carácter Simple
Cadena de n caracteres (string)
Valor entero
Entero corto
Entero Largo
Valor de punto flotante (precisión sencilla)
Valor de punto flotante (precisión doble)
Cadena de caracteres de longitud variable
z Las variables deben tener un tipo apropiado al uso que se
va a hacer de ellas.
11
Declaración de variables (IV)
• Caso especial: Pseudotipo VARCHAR. Permite almacenar valores del tipo
VARCHAR[n] de SQL.
Declaraciones VARCHAR traducidas por el precompilador de Oracle a un
tipo estándar de C: una estructura
VARCHAR nombre[10];
Struct{
int len;
char arr[10];
} nombre;
/* longitud válida del string */
/* texto del string */
Para imprimir un tipo VARCHAR:
printf("%.*s", nombre.len, nombre.arr);
12
Ejemplo 1 - Enunciado
z Programa que imprime el nombre y comisión de un
empleado a partir de su identificador (numero de
empleado).
Name
---------
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
Type
---------------
NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
Null?
-----------
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
Ejemplo 1 - Declaración de variables
/**** Ejemplo1 ****/
/* Inclusión de cabeceras usuales en C */
#include <stdio.h>
#include <string.h>
/* Declaración de variables “huésped", que serán utilizadas en
sentencias SQL */
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR nomemp[10];
float comision;
long num;
EXEC SQL END DECLARE SECTION;
13
14
Control de errores (I)
zMediante la sentencia WHENEVER:
EXEC SQL WHENEVER SQLERROR DO GestionError();
zFormato general:
(Condición)
! SQLERROR
WHENEVER ! SQLWARNING
! NOT FOUND
(Acción)
! DO BREAK
! DO Funcion()
! CONTINUE
! GOTO Etiqueta
15
Control de errores (II)
z Condiciones:
{SQLERROR : Se ha producido un error de SQL.
Ejemplos: error de conexión, violación de una restricción, etc.
{SQLWARNING : Hay un warning o aviso.
Ejemplos: truncado de datos
{NOT FOUND : Ya hemos recuperado todas las tuplas del
resultado de la consulta (usando un cursor).
z Acciones:
{DO BREAK : Si está en un bucle sale de él
{DO Funcion() : Ejecuta la función que se le indica
{CONTINUE : Continúa, ignorando el error
{GOTO Etiqueta : Va la etiqueta indicada
16
Control de errores (III)
z Cuando se ejecuta una sentencia
WHENEVER, tiene efecto hasta el final del
programa o hasta que la siguiente sentencia
WHENEVER.
z Ejemplo:
EXEC SQL WHENEVER SQLERROR DO GestionError();
. . . Sentencias
. . . En esta parte, si hay un error de SQL se
llama a la función GestionError
. . . A partir de aquí, los errores SQL se ignoran
EXEC SQL WHENEVER SQLERROR CONTINUE;
17
Control de errores (IV)
z La sentencia WHENEVER se usa a veces en conjunción con la
estructura SQLCA (SQL Communications Area): guarda el estado de
la última ejecución de una sentencia SQL:
struct sqlca{
char
long
long
struct{
char
long
char
sqlext[8];
char
};
struct sqlca sqlca;
sqlcaid[8];
sqlabc;
sqlcode;
unsigned short sqlerrml;
char
} sqlerrm;
sqlerrp[8];
sqlerrd[8];
sqlwarn[8];
sqlerrmc[70];
{ Sqlcode: Código de resultado. Es 0 si fue correcta
{ Sqlerrm.sqlerrmc: Mensaje de error
{ sqlerrd[2]: Número de filas (tuplas) afectadas por la última
z Necesario incluir el fichero de cabecera <sqlca.h> para poder utilizar
18
sentencia
la variable sqlca.
Ejemplo 1 – Con control de errores
#include <stdio.h>
#include <string.h>
/* Cabeceras de SQL Communication Area, para control de errores, etc. */
#include <sqlca.h>
/* Prototipos de funciones */
void GestionErrores();
/* Declaración de variables “huésped", que serán utilizadas en sentencias SQL */
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR DO GestionError();
main(){
...
}
/* En caso de error: mostrar el código y mensaje de error,
void GestionError(){
VARCHAR nomemp[10]; float comision; long num;
se aborta la transacción y se sale del programa */
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("Error %d\n",sqlca.sqlcode);
printf("Error %s\n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}
19
Conexión/Desconexión
z Antes de efectuar cualquier operación sobre la BDD es
necesario conectarse a la misma:
EXEC SQL CONNECT usuario/pasword;
EXEC SQL CONNECT usuario IDENTIFIED BY password
z Asimismo, para liberar los recursos asociados a la
sesión, es obligatorio desconectarse de la base de
datos antes de que el programa finalice:
EXEC SQL COMMIT [WORK] RELEASE;
z Si se desea terminar deshaciendo la última transacción,
la desconexión se hace de este modo:
EXEC SQL ROLLBACK [WORK] RELEASE;
20
Ejemplo 1 - Conexión
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
/* Prototipos de funciones */
void GestionError();
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR nomemp[10];
float comision;
long num;
char usuario [20] = “scott/tiger”;
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR DO
GestionError();
main(){
EXEC SQL CONNECT :usuario;
...
EXEC SQL COMMIT RELEASE;
}
/* Errores */
void GestionError(){
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("Error %d\n",sqlca.sqlcode);
printf("Error %s\n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
Consultas (Selección de datos)
z Las consultas en SQL embebido, aunque similares a sus
equivalentes en SQL interactivo, tienen algunas particularidades.
“Obtener el nombre del empleado cuyo número es 7900”
z En SQL interactivo:
SELECT ENAME
FROM EMP
WHERE EMPNO=7900
Resultado:
ENAME
---------
JAMES
z Con SQL embebido, debemos indicar dónde guardar el valor
obtenido por la consulta, en vez de ser mostrado por pantalla.
z Se emplearán las variables huésped definidas en la DECLARE
SECTION.
21
22
Consultas: Una fila (I)
z La operación de consulta se realiza con la siguiente variante de
la sentencia SELECT del lenguaje SQL interactivo:
SELECT [ALL | DISTINCT] lista_selección
INTO lista_variables
FROM lista_relación
[WHERE condición_búsqueda]
[GROUP BY lista_atributo]
[HAVING condición_búsqueda]
z La sentencia SELECT debe devolver exactamente una fila, en
caso contrario se producirá un error.
la
INTO especifica
z La cláusula
almacenarán los datos seleccionados.
li
Comentarios de: SQL Embebido (0)
No hay comentarios