Sei sulla pagina 1di 21

11/05/2013

SQL en Entorno de Programacin


BAD 115 Ciclo I/2013

Motivacin: SQL Interactivo vs. No Interactivo

Hasta la fecha hemos considerado slo consultas SQL en las que tecleamos en developer o sqladmin las ordenes que deseamos ejecutar. Esto se conoce como SQL Interactivo. SQL interactivo es ideal para:
Definir la estructura de la base de datos Probar consultas Realizar prototipos

El SQL interactivo no es una buena solucin para la mayora de las aplicaciones reales que requieren un interfaz con un usuario sin conocimientos de SQL. Para las cuales se necesita, adems de SQL, un lenguaje de programacin de alto nivel.
2

11/05/2013

Posibles formas de Conexin con la base de datos


Embedded SQL Library (database API): ODBC (database independent, complex). Interfaces con acceso native: JDBC, ADO.NET, Conector de MySql.

SQL embebido

Los comandos SQL deben seguir una sintaxis especial que los "asla" del resto de las ordenes del programa
EXEC SQL SQL_statement

Un precompilador se encargar de procesar estas ordenes y trasladarlas a llamadas a una librera (que se encarga de las comunicaciones). ecpg Finalmente el compilador nativo compila el programa. gcc

11/05/2013

Precompilador SQL
Programa nativo + SQL embebido Programa nativo + SQL traducido (ecpg)

Editor Precompilador Compilador Lincador

Cdigo objeto
Libreras nativas Libreras DDBB

Ejecutable

Un ejemplo

Preprocesador para C y SQL embebido (ECPG)

#include <stdio.h> /* Esta zona se descibir ms adelante */ EXEC SQL BEGIN DECLARE SECTION; int resultado; EXEC SQL END DECLARE SECTION; int main() { EXEC SQL CONNECT TO peliculas; EXEC SQL SELECT (1+1) INTO :resultado; printf("1+1=%d\n",resultado); return 0;
} /*ecpg 297.pgc -o 297.c; vi 297.c */ /*make -f 297.mak -n*/

11/05/2013

Compartir Variables

Es posible compartir variables entre el cdigo SQL y el nativo. La definicin se realiza usando la sintaxis:

EXEC SQL begin declare section; varchar userid[ 10], password[ 10], cname[ 15]; int cno; EXEC SQL end declare section;

Declaration section-> variables compartidas por SQL y lenguaje nativo ":" se antepone a las variables cuando se usan en SQL

Compartir variables: un ejemplo


EXEC SQL BEGIN DECLARE SECTION; unsigned long num_enrolled; char crs_code; char SQLSTATE [6]; Variables EXEC SQL END DECLARE SECTION; compartidas . EXEC SQL SELECT C.NumEnrolled INTO :num_enrolled : se usa para las variables en SQL FROM Course AS C WHERE C.CrsCode = :crs_code;

Declaration section-> variables compartidas por SQL y lenguaje nativo ":" se antepone a las variables cuando se usan en SQL

11/05/2013

NULL

SQL trata el valor NULL de forma muy especial que no es directamente exportable a otros lenguajes de programacin. Hay unas variables llamadas variables indicadoras que contienen un cdigo que matiza los valores devueltos por la base de datos:
0
el valor de la variable nativa es correcto. -1 el valor de la variable nativa debe tratarse como si fuera NULL. Su valor es irrelevante. >0 el valor de la variable nativa ha sido procesado (probablemente un casting que ha producido una truncacin o redondeo)

Conexin

Hasta la fecha hemos usado:


EXEC SQL CONNECT TO peliculas;

para conectarnos Obviamente faltan campos para:


usuario password servidor (direccin IP) puerto

10

11/05/2013

Ejemplo
#include <stdio.h>
EXEC SQL INCLUDE sqlca;

EXEC SQL BEGIN DECLARE SECTION; int resultado; EXEC SQL END DECLARE SECTION; int main(){ EXEC SQL CONNECT TO peliculas@localhost:5432 USER roberto/pepino;
if (sqlca.sqlcode) {printf("%s\n", sqlca.sqlerrm.sqlerrmc); exit(1); }

EXEC SQL SELECT (1+1) INTO :resultado; printf("1+1=%d\n",resultado); return 0; }


11

Errores

Se puede acceder a la base de datos para conocer su estado (Ha habido algn error durante la ejecucin?
EXEC SQL include sqlca;

El elemento ms interesante de la estructura sqlca es sqlcode. El 0 consulta correcta. >0 la consulta se ha realizado satisfactoriamente pero ha ocurrido una excepcin (por ejemplo no hay ms tuplas disponibles) < 0 ha ocurrido un error

12

11/05/2013

Errores
#include <stdio.h> EXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION; int resultado; EXEC SQL END DECLARE SECTION; int main() { EXEC SQL CONNECT TO basequenoexiste; if (sqlca.sqlcode) {printf("Error: No puedo conectar a la base (%d)\n", sqlca.sqlcode); exit(1); } EXEC SQL SELECT (1+1) INTO :resultado; printf("1+1=%d\n",resultado); return 0; } /*300*/
13

WHENEVER

Cada comando de SQL embebido puede (potencialmente) generar un error. Para aliviar el trabajo del programador existe la directiva WHENEVER que instruye al precompilador para que genere el cdigo que procesar los errores La sintaxis de la directiva WHENEVER es:
EXEC SQL WHENEVER <condicin> <accin>

14

11/05/2013

WHENEVER (cont)

La condicin puede ser:


SQLERROR - genera cdigo que se encargue de los errores (SQLCODE < 0).

SQLWARNING genera codigo que se encarge de las advertencias (warnings) (SQLCODE > 0)
NOT FOUND - genera cdigo que se encargue del caso especial en que todas las tuplas obtenidas como resultado de la consulta ya se han transferido. sqlprint imprime mensaje de error

15

WHENEVER (CONT)

La accin puede ser:


CONTINUE ignora el error y continua la ejecucin FUNCION transfiere el error a la funcion que se encarga de procesar los errores. DO BREAK salte del bucle DO CONTINUE continua con la interacin siguiente (se supone dentro de un bucle) GOTO label - transfiere el control a otra parte del programa. STOP Aborta transaccin. SQLPRINT imprime codigo error
16

11/05/2013

WHENEVER: Ejemplo!!!
#include <stdio.h> int main() { EXEC SQL BEGIN DECLARE SECTION; int resultadoInd; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO peliculas; EXEC SQL WHENEVER sqlerror sqlprint; // DO BREAK //STOP EXEC SQL INSERT INTO tablaquenoexiste (id,color) VALUES (1,2); printf(El programa no ha abortado tras hacer sqlprint); return 0; }

SELECT

SELECT es un comando de SQL potencialmente complicado de usar. Problema: los lenguajes de programacin tradicionales estn concebidos para procesar variables aisladas y no grandes tablas de dimensin virtualmente infinita SQL, por el contrario, puede procesar una gran cantidad de filas con un solo comando Aquellos SELECTs que devuelvan 0 o una tupla son fcilmente procesables pero... qu hacer cuando n tuplas son devueltas?
18

11/05/2013

SELECT Devuelve una sola tupla


EXEC SQL SELECT fName, lName, address INTO :firstName, :lastName, :address:addressInd, FROM PrivateOwner WHERE ownerNo = CO21'; Si se devuelve ms de una tupla solo la primera de ellas es retenida

Cursores

Si una consulta puede devolver un nmero arbitrario de tuplas, es necesario usar cursores. Los cursores permiten al lenguaje nativo acceder a una relacin tupla a tupla. Los cursores se comportan como punteros a una tupla del resultado y pueden ser movidos de una tupla a la siguiente (se puede saltar hacia atrs y delante). Los cursores se deben declarar y abrir antes de que puedan ser usados. Una vez abiertos el comando fetch permite avanzar hasta la siguiente tupla

10

11/05/2013

Cursores

Yes DECLARE OPEN FETCH Notfound? CLOSE

DECLARE CURSOR IS define el conjunto de filas mediante una consulta OPEN resuelve la consulta y posiciona el cursor en la primera fila resultante FETCH avanza el cursor a la proxima fila del conjunto de filas resultante CLOSE libera el resultado de la consulta NOT FOUND cdigo retornado (sqlcode) cuando el cursor pas la ultima fila de la consulta

CURSOR - Ejemplo
Consideremos la consulta: SELECT titulo, puntuacion ,votos FROM pelicula WHERE puntuacion > 9.4;

ttulo High and the Mighty, The Flklypa Grand Prix

puntuacion votos 9.5 256 9.8 255

22

11

11/05/2013

Cursores: Declaracin
DECLARE CURSOR cursor IS SELECT [FOR UPDATE OF col];

OPEN CURSOR cursor;


FETCH [orientacion] [FROM] cursor INTO vlist; orientacion: next, prior, first, last, relative i, absolute i. CLOSE cursor;

Cursor: Declaracin

Los cursores se declara usando las palabras reservadas:


DECLARE CURSOR...CURSOR FOR el nombre del cursor y la consulta a realizar
EXEC SQL DECLARE miprimercursor CURSOR FOR SELECT titulo, puntuacin, votos FROM pelicula WHERE puntuacion > 9.4;
24

12

11/05/2013

Cursors - OPEN

La orden OPEN ejecuta la consulta y coloca un puntero apuntando hacia la primera tupla de la relacin resultante EXEC SQL OPEN miprimercursor; High and the Mighty, The 9.5 Flklypa Grand Prix 9.8 256 255

Pointer

25

Cursores - FETCH

FETCH devuelve la siguiente tupla en la relacin resultante de nuestra consulta y la coloca en una variable accesible por el lenguaje nativo
EXEC SQL FETCH miprimercursor INTO :titulo, :puntuacin, :votos

FETCH se coloca normalmente dentro de un bucle que itera hasta que no se devuelven ms filas. Esto es, SQLCODE es NOT FOUND.

26

13

11/05/2013

Cursores: FETCH
EXEC SQL WHENEVER NOT FOUND DO BREAK; while(1) { EXEC SQL FETCH miprimercursor INTO :titulo, :puntuacin, :votos; //MAS CODIGO AQUI }
Fetch 1

Fetch 2

High and the Mighty, The 9.5 Flklypa Grand Prix 9.8

256 255

CURSOR - CLOSE

La orden CLOSE cierra el cursor activo. EXEC SQL CLOSE miprimercursor;

28

14

11/05/2013

Un ejemplo de todo junto


#include <stdio.h> EXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION; char titulo[256]; float fPuntuacion; int votos; char miquery[256]; EXEC SQL END DECLARE SECTION; EXEC SQL WHENEVER SQLERROR sqlprint; int main(){ // conectarse EXEC SQL CONNECT TO peliculas; if (sqlca.sqlcode){ printf("Error: No puedo conectar a la base (%d)\n", sqlca.sqlcode); exit(1); }

// declarar cursor EXEC SQL DECLARE micursor CURSOR FOR SELECT titulo, puntuacion, votos FROM pelicula WHERE puntuacion > 9.4; EXEC SQL OPEN micursor;
EXEC SQL WHENEVER NOT FOUND DO BREAK; while (1) { EXEC SQL FETCH IN micursor INTO :titulo, :fPuntuacion, :votos; printf("%s %f %d\n",titulo, fPuntuacion, votos); } EXEC SQL DISCONNECT; return 0; }
30

15

11/05/2013

SQL Dinmico vs Esttico


Hasta el momento hemos visto SQL (embebido) esttico SQL esttico es, posiblemente, la formula ms popular de programar con SQL pero slo en usable si se conoce las consultas que una aplicacin va a hacer durante la fase de diseo de la aplicacin. Su principal limitacin es que no permite decidir en tiempo real a que tablas o atributos (u otros objetos) nos queremos referir. Esto es: con SQL esttico puedes decidir que valor va a tener un atributo en tiempo real pero no que atributo vas a cambiar (o a que base de datos vas a acceder)

EXECUTE IMMEDATELY

La forma ms sencilla de ejecutar una sentencia arbitraria en SQL consiste en usar la orden EXECUTE IMMEDIATE : EXEC SQL EXECUTE IMMEDIATE [cadena_con_la_consulta] Por ejemplo: EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "CREATE TABLE test1(...);"; EXEC SQL END DECLARE SECTION; EXEC SQL EXECUTE IMMEDIATE :stmt;

No se pueden ejecutar sentencias que devuelvan datos de esta manera. (SELECT no esta permitido pero INSERT o UPDATE son posibles)

16

11/05/2013

Ejemplo
#include <stdio.h> int main() { EXEC SQL BEGIN DECLARE SECTION; char resultado[11]; int resultadoInd; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO peliculas; //Dos Declare secction estilo c++ EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "CREATE TABLE test1 (i int, f float);"; EXEC SQL END DECLARE SECTION; EXEC SQL EXECUTE IMMEDIATE :stmt; EXEC SQL COMMIT; return 0; }//immediate
33

APIs para las bases de datos

Hasta ahora hemos mencionado distintos mtodos para embeber SQL en lenguajes de programacin de alto nivel. (Con la excepcin de JDBC) Normalmente todos las empresas que mantienen sistemas de bases de datos ofrecen APIs. De esta forma en lugar de embeber SQL los programadores tienen acceso a un conjunto de libreras que les permiten comunicarse con la base de datos.

34

17

11/05/2013

Open Database Connectivity (ODBC)

Las distintas APIs desarrolladas por los diferentes vendedores representan un problema para los desarrolladores de aplicaciones ya que les fuerzan a rescribir el cdigo para cada base de datos Entre las muchas estandarizaciones propuestas ODBC (originalmente propuesta por Microsoft) es uno de los estndares de facto. Probablemente el estndar que es soportado por ms lenguajes y aplicaciones ODBC asume que las bases estn basadas en SQL estandard.

35

Open Database Connectivity (ODBC)

ODBC (escrito en C) permite conectarse a las diversas bases de datos usando el mismo cdigo y sin necesidad de recompilar. java -Djdbc.drivers=org.mysql.Driver myaplicacion Por lo tanto permite al desarrollador crear programas que no estn orientados hacia una base de datos en concreto. Se precisa de un driver (suministrado por la empresa que desarrolla el sistema de bases de datos) que hace de enlace entre el driver manager y la base de datos.
36

18

11/05/2013

Ventajas de usar ODBC


La aplicacion no depende de un API nativo (de una base de datos en particular). La aplicacin puede ignorar las comunicaciones cliente servidor. Hay drivers que siguen el estandar ODBC para virtualmente cualquier lenguaje y cualquier sistema de bases de datos. As pues una aplicacin escrita con ODBC puede conectarse a virtualmente cualquier base de datos

37

ODBC:Arquitectura

ODBC tiene cuatro componentes principales:


Aplicacin Driver Manager (parte del sistema operativo en windows) Driver Base de Datos.

38

19

11/05/2013

ODBC Architecture

Applicacion procesa los datos y realiza llamadas a funciones ODBC para emviar sentencias SQL o recibir datos de la BBDD Driver Manager maneja los drivers en representacin de la aplicacin.

Driver procesan las llamadas a funciones ODBC, embian el as consultas SQL y recogen los resultados Los drivers pueden modificar las consultas para que se adecuen a la sintaxis que espera la base de datos.

Datos-

39

ODBC: Limitaciones

Las principales son:


Ms lento que las alternativas usando drivers nativos o SQL embebido ODBC no puede explotar todas las funciones disponibles en la base de datos.

40

20

11/05/2013

ODBC: Bibliografia http://www.unixodbc.org/ http://msdn.microsoft.com/

41

21

Potrebbero piacerti anche