Introducción al SQL embebido



Documentos relacionados
SQL Embebido. Introducción (I)

Base de Datos Oracle: desarrollo de aplicaciones

SQL EMBEBIDO FELIPE GARCÍA GÓMEZ

Motivación: SQL Interactivo vs. No Interactivo

Desarrollo Cobol/DB2

Seminario 1. Conexión a Oracle

Permite definir cada relación que pertenece a la base de datos relacional, incluyendo:

El Lenguaje PL/SQL. Un lenguaje de propósito general orientado a la inclusión de sentencias SQL. Estructura del código PL/SQL.

El usuario puede utilizar esta tabla derivada como una tabla más, en sus consultas.

Sintaxis: CURSOR nombre_cursor[(param1 [IN] tipo1,... )] IS consulta ;

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL

Tema 4. Manipulación de datos con SQL

Conceptos Avanzados de Cursores Explícitos. Copyright Oracle Corporation, All rights reserved.

accesos a una base de datos desde un programa escrito en un lenguaje de alto nivel (C, Pascal, COBOL,...). Nosotros vamos a utilizar SQL inmerso en C

Tema: Arreglos de Objetos en C++.

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Ataques a Aplicaciones de Bases de Datos

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

CURSORES EN SQL SERVER

BASES DE DATOS AVANZADAS Transacciones en MYSQL

Tema: Procedimientos almacenados y cursores. Facultad : Ingeniería Escuela : Computación Asignatura: SQL SERVER. GUÍA 2 Pág. 1

Se guardan en archivos con extencion c y los cabezales con extension h

Programación SQL. Lucio Salgado Diciembre 2008

Tema 1. Bases de datos activas

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

El lenguaje de manipulación de datos (DML) es una parte fundamental de SQL.

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Bases de Datos 3º Informática de Sistemas

LENGUAJE. Tema 1 - Introducción

Lic. Vladimir Cotaquispe Gutierrez PROGRAMACIÓN PL/SQL I - 1. Copyright 2008, Oracle. All rights reserved.

UNIDAD DE TRABAJO 3: PROGRAMACIÓN DE BASES DE DATOS TEMA 8: INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN

Base de datos relacional

PL/SQL. DECLARE /* Parte Declarativa */ BEGIN /* Parte de Ejecución */ EXCEPTION /* Parte de Excepciones */ END;

Asignatura: Administración de Bases de Datos. Pedro P. Alarcón Cavero

Tema 4. SQL. Juan Ignacio Rodríguez de León

Oracle básico (IV): Programación en PL/SQL

Creación y Gestión de Tablas. Copyright Oracle Corporation, All rights reserved.

Bases de Datos / Elementos de Bases de Datos Que es un Stored Procedure? Stored Procedures: Ventajas

Son objetos cuya función es el tratamiento de varios registros exclusivamente durante la ejecución de un programa.

BASES DE DATOS - SQL. Javier Enciso

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

APUNTES: APLICACIONES WEB BASADAS EN PHP Y MYSQL Página 1 de 5

Enlaces relacionados:

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

6. PROGRAMACIÓN CON TRANSACT-SQL

Los paquetes tienen dos partes: una especificación y un cuerpo que están almacenados por separado en la base de datos.

APLICACIONES WEB PERL + BASES DE DATOS REQUERIMIENTO RESPUESTA

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Fundamentos de la Programación

Estándar de desarrollo de aplicaciones del Govern de les Illes Balears

Dependiendo de las tareas, podemos clasificar las sentencias SQL en dos tipos:

Capítulo 6. Introducción a la POO

CONSULTAS BASICAS EN SQL SERVER

Bases de Datos / Elementos de Bases de Datos 2015

Práctica 3. Consultas SQL

A continuación se presenta la forma en que se puede conectar PHP con el gestor de bases de datos MySQL.

QUÉ ES UNA BASE DE DATOS Y CUÁLES SON LOS PRINCIPALES TIPOS? EJEMPLOS: MYSQL, SQLSERVER, ORACLE, POSTGRESQL, INFORMIX (DV00204A)

CONCEPTOS DE PROCESAMIENTO DE TRANSACCIONES

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

Bases de datos relacionales y el modelo entidad-relación

6 - Recuperar algunos registros (where)

- Bases de Datos - - Diseño Físico - Luis D. García

Base de datos Procedimientos Almacenados y Funciones

Tema: PROCEDIMIENTOS ALMACENADOS.

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Diseño de bases de datos

3. El catálogo 26. Laboratorio de Bases de Datos

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

SISTEMAS DE BASES DE DATOS APELLIDOS: NOMBRE: DNI: FECHA:

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

TEMA 20: CONCEPTOS BÁSICOS DE SQL

Manipulando Datos. y Transacciones

Soporte lógico de computadoras

OBJETIVOS METODOLOGÍA PROCEDIMIENTO 1.- Trabajo con el servidor de bases de datos Sybase

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

5- Uso de sentencias avanzadas

Laboratorio Informix. Stored Procedures Triggers

Formato para prácticas de laboratorio

Formato para prácticas de laboratorio

Examen Principios de Programación Febrero 2012

Para procesar instrucciones SELECT que devuelvan más de una fila, son necesarios cursores explicitos combinados con un estructura de bloque.

Restricciones de Integridad

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

DOCUMENTACIÓN DE POWER BUILDER 11. CONSULTA DINAMICA Las consultas dinámicas se realizan cuando power builder no soporta una consulta SQL.

Curso Internet Básico - Aularagon

Manual del TESQL (Embedded SQL)

Ampliación de Bases de Datos Práctica 1: El lenguaje PL/SQL de Oracle Sesión 1: Introducción al PL/SQL

ÍNDICE INTRODUCCIÓN...13

Tema 2. Memoria Dinámica. 2.1 Datos estáticos y dinámicos

TEMA 4: El lenguaje SQL II: Introducción, modificación y borrado de datos.

Transcripción:

Introducción al SQL embebido Bases de Datos II 1 Índice 1. Introducción. 2. Estructura típica de un programa 3. Declaración de variables. 4. Utilización de SQL embebido. Sentencias básicas Uso de cursores 5. Detalles a tener en cuenta en C++. 6. Definición y control de transacciones. 7. Control de errores. 2

1. Introducción SQL embebido está pensado para intercalar instrucciones en el código de un programa escrito en un lenguaje de alto nivel (C, C++, Fortran, Cobol..). El intercambio de información con el SGBD se realiza a través de variables del lenguaje, a las que se les denomina variables anfitrionas. Idea: escribir un programa que manipule una BD con el lenguaje SQL usando las estructuras de control y las variables del lenguaje correspondiente. 3 2. Estructura de un programa Programa Declaración de variables, Declaración de variables anfitrionas, Fin de Declaración de variables anfitrionas, Fin de declaración de variables Comienzo del código, Instrucciones propias del lenguaje Conexión a la BD Instrucciones en SQL Desconexión de la BD Acceso A la BD Instrucciones propias del lenguaje Fin del código del programa 4

3. Declaración de variables anfitrionas (1) Se deben declarar en una sección especial: EXEC SQL BEGIN DECLARE SECTION;..declaraciones de variables en C EXEC SQL END DECLARE SECTION; Las variables deben tener un tipo apropiado al uso que se va a hacer de ellas. Se pueden utilizar los tipos de datos de C típicos y el pseudotipo VARCHAR para manipular cadenas: VARCHAR primera[20] Struct{ unsigned short len; char arr[20]; } primera; 5 3. Declaración de variables anfitrionas (2) Ejemplo de declaración de variables: EXEC SQL BEGIN DECLARE SECTION; float salario,comision; Short ind_var; VARCHAR nombre[30]; int n_emp; EXEC SQL END DELCLARE SECTION; Variables indicadoras: están asociadas a variables anfitrionas y se declaran en la sección de variables anfitrionas: :host_variable INDICATOR :ind_variable :comision INDICATOR :ind_var :comision:ind_var Nota: variables anfitrionas y Variables indicadoras van Precedidas de : 6

3. Declaración de variables anfitrionas (3) Valores posibles para las variables indicadoras: 0 Éxito -1 >0 Valor nulo devuelto, insertado o actualizado. Valor devuelto truncado EXEC SQL BEGIN DECLARE SECTION; int n_emp; float salario,comision; short ind_com; EXEC SQL END DECLARE SECTION; n_emp = 5; EXEC SQL SELECT sal, comm INTO :salario,:comision:ind_com FROM emp WHERE idemp =:n_emp; if (ind_com == -1) //Comision es NULL pagar =salario; else pagar = salario + comision; 7 4. Sentencias SQL básicas Sentencias que devuelven una única tupla o ninguna. Son las sentencias de SQL: select, update, insert, delete: EXEC SQL SELECT enombre, sal INTO :emp_name, :salario FROM emp WHERE idemp=:n_emp; EXEC SQL INSERT INTO emp (idemp,enombre) VALUES (:n_emp,:salario) EXEC SQL UPDATE emp SET sal = :salario, com = :comision WERE idemp = : n_emp; EXEC SQL DELETE FROM emp WHERE iddepart = :n_depart; 8

4. Otras sentencias SQL Sentencias de conexión a la BD: EXEC SQL CONNECT :nombreusuario IDENTIFIED BY :clave; EXEC SQL CONNECT :nombreclave; esther/miclave Cuando la consulta puede devolver más de una tupla es necesario utilizar cursores. Pasos: Definición del cursor, Apertura del cursor, Manejo del cursor, Cerrar el cursor. 9 4. Sentencias SQL : cursores Definición del cursor: EXEC SQL DECLARE ncursor CURSOR for especificacion_cursor; Sentencia SELECT Abrir cursor: cuando un cursor se abre su posición actual pasa a ser delante de la primera tupla: EXEC SQL OPEN ncursor; FETCH: permite mover el cursor y leer la tupla en la que queda colocado EXEC SQL FETCH ncursor INTO listadevariables; Cerrar el cursor: Variables anfitrionas EXEC SQL CLOSE ncursor; 10

Ejemplo con cursores //defino un cursor EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT enombre FROM emp WHERE idemp = :nemp; //Abro el cursor EXEC SQL OPEN emp_cursor; //Recojo datos y proceso //PARA FINAL DEL BUCLE EXEC SQL WHENEVER NOT FOUND DO break; for(;;) { //Recojo datos EXEC SQL FETCH emp_cursor INTO :emp_nombre; //Añado carácter final de cadena emp_nombre.arr[emp_nombre.len]= \0 ; printf( %s,emp_nombre.arr); } EXEC SQL CLOSE emp_cursor; EXEC SQL COMMIT WORK REALEASE; 11 5. Detalles a tener en cuenta en C++ Cuatro consideraciones importantes: Emisión de código del precompilador. CODE=CPP Capacidad de análisis (PARSE). PARSE= NONE PARTIAL FULL Extensión del fichero de salida. CPP_SUFFIX= CC C Localización de los ficheros de cabecera. SYS_INCLUDE 12

6. Soporte de transacciones Sentencias especiales para manejar transacciones: COMMIT Efectua cambios Desconecta de Oracle OPCIÓN RELEASE ROLLBACK Libera recursos Deshace Cambios EXEC SQL COMMIT RELEASE; EXEC SQL ROLLBACK RELEASE; 13 7. Control de errores Para el control de los errores producidos durante la ejecución de un programa se utiliza la estructura sqlca (Area de comunicación SQL). #include <sqlca.h> Oracle actualiza la estructura después de cada nueva sentencia SQL. Para saber si se han producido errores, dos alternativas: Comprobar la estructura sqlca explicitamente. Comprobar implícitamente (sentencia WHENEVER). Los campos más utilizados de la estructura son: 0 <0 sqlca.sqlcode sqlca.sqlerrm No error 0< Detectada excepción Existe algún problema Longitud sqlerrml Mensaje sqlerrmc 14

7. Control de errores De forma explícita implica revisar el valor del campo sqlcode cada vez que se ejecute una sentencia SQL. De forma implicita implica la utilización de la sentencia WHENEVER: EXEC SQL WHENEVER <CONDICION> <ACCIÓN> Condiciones: SQLWARNING SQLERROR NOT FOUND Acciones: CONTINUE DO DO BREAK DO CONTINUE GOTO etiqueta STOP 15 7. Consejos para el control de errores La sentencia WHENEVER debe estar antes de cualquier sentencia SQL. Evitar bucles infinitos: si una sentencia WHENEVER SQLERROR GOTO va a una función que ejecuta una sentencia SQL esta puede fallar de nuevo y producirse un bucle. EXEC SQL WHENEVER SQLERROR GOTO sql_error; Sql_error: EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ROLLBACK WORK RELEASE; Cuando un FETCH no devuelve datos: EXEC SQL WHENEVER NOT FOUND DO break; While(1) { EXEC SQL FETCH... } EXEC SQL CLOSE mi_cursor; 16

8. Métodos de SQL dinámico Existen 4 métodos para definir sentencias SQL dinámicas: 1 Consultas no, no variables anfitrionas. delete from emp where dptno =20 2 Consultas no, número conocido de variables anfitrionas. delete from emp where Idemp= :n_emp 3 4 Consultas si, número conocido de elementos a seleccionar y v. Anfitrionas. Consultas con un desconocido número de v. anfitrionas y elementos a seleccionar select ename, empno from emp where deptno =:dept_number select <no conocido> from emp Where deptno = 20 17 8. Ejemplos de los tres primeros métodos Método 1 Cadena = insert into mitabla values( test ) ; EXEC SQL EXECUTE IMMEDIATE :cadena; Variable anfitriona Cadena = delete from emp where empno = :n EXEC SQL PREPARE sent_sql FROM :cadena; Emp_no =3; EXEC SQL EXECUTE sent_sql USING :emp_no; EMP_NO=5; EXEC SQL EXECUTE sent_sql USING :emp_no Variable anfitriona Consulta = select idemp,trab from emp where sal < :salario ; EXEC SQL PREPARE sent_sql FROM :consulta; EXEC SQL DECLARE mi_curso FOR sent_sql; EXEC SQL OPEN mi_cursor USING :mi_salario; EXEC SQL FETH mi_cursor INTO :no_emp, :trab; EXEC SQL CLOSE mi_cursor Anfitriona: salida Guardasitio Anfitriona entrada Método 2 Método 3 Guardasitio 18

#include <stdio.h> #include <string.h> #include <sqlca.h> // Para el control de errores void control_errores(); main() { EXEC SQL BEGIN DECLARE OPTION; VARCHAR usuclave[30]; //como me conecto VARCHAR consulta[100]; //donde almaceno la consulta VARCHAR vnombre[30]; //variable anfitriona int vnodept; //otra variable anfitriona EXEC SQL END DECLARE OPTION; //Fijo el control de errores antes de empezar con SQL EXEC SQL WHENEVER SQLERROR DO control_errores(); //Me conecto a la BD con un login/password strcpy(usuclave.arr, esther/miclave ); // usuclave.len=strlen(usuclave.arr); EXEC SQL CONNECT :usuclave; puts( Conectado con Oracle ); //cout << Concectado con Oracle ; //Guardo la consulta que se va a realizar en la variable consulta strcpy(consulta.arr, select nombre from emp where deptno = :v1 ); consulta.len=strlen(consulta.arr); 19 //Preparo la sentencia para mandarla a Oracle EXEC SQL PREPARE sentsql FROM :consulta; //Esta consulta necesita cursor, por lo tanto defino el cursor EXEC SQL DECLARE micursor CURSOR FOR senntsql; //Abro el cursor EXEC SQL OPEN micursor USING :vnodept; //Control del final de datos consulta EXEC SQL WHENEVER NOT FOUND DO break; while(1) //Cuidado!! Bucle infinito { EXEC SQL FETCH micursor INTO :vnombre; //Arreglo la variable VARCHAR vnombre para manipularla en C/C++ vnombre.arr[vnombre.len]= \0 ; //Imprimo el resultado de la consulta... o lo que quiera printf( %s\n,vnombre.arr); // cout << vnombre.arr; } //Imprimo el número de filas devueltas printf( \nnumero de filas devuleltas: %d\n,sqlca.sqlerrd[2]); EXEC SQL CLOSE micursor; EXEC SQL COMMIT RELEASE; //Termino la transacción y me desconecto de Oracle } 20

//Función de control de errores void control_errores() { //IMPRIMO MENSAJE DE ERROR: sqlca.sqlerrm.sqlerrmc[sqla.sqlerrm.sqlerrml]= \0 ; printf( %s\n,sqlca.sqlerrm.sqlerrmc); //cout << sqlca.sqlerrm.sqlerrmc EXEC SQL WHENEVER SQLERROR CONTINUE; //Deshago cualquier posible cambio y me desconecto de Oracle EXEC SQL ROLLBACK RELEASE; } 21