You are on page 1of 38

Taller de base de datos 2 1 Extensiones de lenguaje de procedimiento para SQL

INSTITUTO TECNOLGICO SUPERIOR DE MOTUL

Carrera: INGENIERA EN SISTEMAS COMPUTACIONALES Materia: Taller de Base de datos II

Reporte de Investigacin: Unidad 2. Extensiones de lenguaje de procedimiento para SQL.

Motul, Yucatn, Mxico 11 Abril de 2013.

Taller de base de datos 2 2 Extensiones de lenguaje de procedimiento para SQL

Contenido
Introduccin: ................................................................................................................................. 3 Objetivos: ...................................................................................................................................... 4 Objetivo general: ....................................................................................................................... 4 Objetivos especficos:................................................................................................................ 4 Metodologa: ............................................................................................................................. 4 2. Estructura de un bloque. ....................................................................................................... 5 2.1.1. Estructuras de programa ................................................................................................. 6 2.1.2. Entorno de programacin ............................................................................................... 7 2.2. Uso de variables ..................................................................................................................... 8 2.2.2. Sentencias ejecutables .................................................................................................. 11 2.3. Manipulacin de datos ......................................................................................................... 11 2.3.1. Insercin de datos. ........................................................................................................ 12 2.3.2. Actualizacin de datos. ................................................................................................. 12 2.3.3. Eliminacin de datos. .................................................................................................... 12 2.4. Estructuras de control. ......................................................................................................... 13 2.4.1 Estructuras condicionales. ............................................................................................. 13 2.4.2 Bucles. ............................................................................................................................ 15 2.4.3 Etiquetas anidadas. ........................................................................................................ 17 2.5 Tipos de datos compuestos................................................................................................... 18 2.5.1 Registros. ........................................................................................................................ 19 2.6. Cursores................................................................................................................................ 19 Atributos de los cursores ........................................................................................................ 23 Manejo del cursor ..................................................................................................................... 24 2.7. Excepciones .......................................................................................................................... 24 2.8 SQL Dinmico y metadatos. ................................................................................................. 30 2.9 Dependencias. ....................................................................................................................... 31 2.10. Triggers ............................................................................................................................... 32 2.11 Compilacin nativa e interpretada.................................................................................. 37 Conclusiones: .............................................................................................................................. 38 Bibliografa .................................................................................................................................. 38

Taller de base de datos 2 3 Extensiones de lenguaje de procedimiento para SQL

Introduccin:
En esta investigacin daremos a conocer un poco ms sobre Pl/Sql por lo que como hemos visto antes el lenguaje SQL como un lenguaje declarativo que permite crear bases de datos, leer datos, eliminar datos, insertar datos, entre otras operaciones. Pero este lenguaje de consultas estructurado tiene su lado fuerte en la administracin de las bases de datos mediante

"procedimientos", y se utilizan para optimizar las transacciones y/o accesos a la base de datos por parte del administrador evitando realizar mltiples consultas y slo realizando un "proceso" que lo haga todo (teniendo en cuenta que, por lo general, la informacin que se necesita de las bases de datos requieren distintas consultas para obtenerla).

El SQL de procedimientos (PL/SQL es una abreviatura de "Procedural Language/SQL") permite utilizar cdigos de procedimientos y sentencias SQL que se guardan dentro de la base de datos, y ste cdigo de procedimientos es ejecutado por el DBMS (sistema administrador de bases de datos) cuando es invocado, ya sea en forma directa o indirecta por el usuario final. Es importante recordar que las funciones PL/SQL no son las mismas que las funciones incorporadas del SQL, y sus principales diferencias radican en que las funciones SQL slo pueden utilizarse en sentencias SQL, en cambio, las funciones PL/SQL slo pueden ser invocadas en programas PL/SQL, ya sean programas activadores o procedimientos almacenados

Por lo que de igual manera debemos de tener muy en cuenta los tipos de bloques de Pl/Sql as como tambin la estructura de bloque bsico.

Taller de base de datos 2 4 Extensiones de lenguaje de procedimiento para SQL

Objetivos:

Objetivo general:
Conocer los conceptos de la unidad extensiones de leguaje de procedimiento para sql

Objetivos especficos:
Investigar todos los temas de la unidad Dar a conocer las definiciones de dichos temas Dar ejemplos de sintaxis

Metodologa:

Para poder dar a conocer esta informacin lo primero que se hizo fue ir investigando en los distintos tipos de comunicacin tales como internet, libros, por lo que se fue buscando de acuerdo al tema y luego de se fue escogiendo la informacin para luego estructurarla en este documento.

Taller de base de datos 2 5 Extensiones de lenguaje de procedimiento para SQL

2. Estructura de un bloque.
La estructura bsica de un bloque Pl/Sql se define como:

DECLARE – Opcional Variables, cursores, excepciones definidas por el usuario BEGIN – Obligatorio. Indica que empieza el programa Sentencias SQL y Sentencias de Control PL/SQL EXCEPTION – Opcional Acciones a realizar cuando se produzcan errores END; – Obligatorio

Un bloque Pl/Sql se puede programar dentro de un procedimiento, una funcin o de forma independiente, por lo que existen tres tipos de bloque que son:

Annimo:

[DECLARE] BEGIN -- instrucciones [EXCEPTION] END;

Procedimiento:

PROCEDURE nombreProcedimiento IS [DECLARE] BEGIN -- instrucciones


5

Taller de base de datos 2 6 Extensiones de lenguaje de procedimiento para SQL [EXCEPTION] END;

Funcin

FUNCTION nombreFuncion RETURN tipodedato IS [DECLARE] BEGIN -- instrucciones RETURN valor; [EXCEPTION] END;

2.1.1. Estructuras de programa


Se encuentra dividido por:

Estructuras en Herramientas: Bloques annimos Funciones o procedimientos de aplicacin Paquetes de aplicacin Triggers de aplicacin Tipos de objeto. Estructuras en el servidor de base de datos: Bloques annimos Funciones o procedimientos almacenados Paquetes almacenados Triggers de base de datos Tipos de objeto
6

Taller de base de datos 2 7 Extensiones de lenguaje de procedimiento para SQL

2.1.2. Entorno de programacin


El entorno de programacin de PL/SQL es una interfaz en la que se tiene que contar con una usuario y contrasea para iniciar sesin y poder trabajar en el, estos requerimientos se obtienen mediante la instalacin de la interfaz y en el proceso ser necesario su validacin para poder trabajar en el rea especialmente diseada para eso como se observa a continuacin.

Taller de base de datos 2 8 Extensiones de lenguaje de procedimiento para SQL

2.2. Uso de variables


Las variables pueden usarse para: Almacenamiento temporal de datos Manipulacin de valores almacenados Usarse de nuevo.

Taller de base de datos 2 9 Extensiones de lenguaje de procedimiento para SQL En el cual los identificadores son usados para poder nombrar a una variable y proporcionan convenciones para el nombre de las variables. Por lo que deben comenzar con una letra pueden incluir letras o nmeros, caracteres especiales tales como guion bajo, signo de dlar, signo de libra. Se limita a 30 caracteres No se usan palabras reservadas. Algunos tipos de variables PL/SQL son: Escalares Compuestas De referencia Objetos largos (LOB)

Variables no-PL/SQL: Bind Creadas en el entorno Tambin llamadas variables host Creadas con la palabra reservada VARIABLE Usadas en sentencias SQL y bloques PL/SQL Accedidas (consultadas) an despus de que el bloque PL/SQL es ejecutado Referenciadas anteponiendo dos puntos (:)

Las variables PL/SQL pueden pertener a los siguientes datos (solo se enlistaron los tipo bsicos llamados tambin escalares)

Taller de base de datos 2 10 Extensiones de lenguaje de procedimiento para SQL

Atributo %TYPE

Permite declarar una variable basada en: Otras variables previamente declaradas La definicin de una columna de la base de datos

Preceder de %TYPE por: La tabla y la columna de la base de datos El nombre de la variable definida con anterioridad

Variables BOOLEANAS

A una variable Boolean slo se le pueden asignar los valores: TRUE, FALSE o NULL. Estas variables estn conectadas por los operadores lgicos AND, OR y NOT.

Tipos de Datos Compuestos Tipos:


10

Taller de base de datos 2 11 Extensiones de lenguaje de procedimiento para SQL REGISTROS PL/SQL TABLAS PL/SQL Contienen componentes internos

2.2.2. Sentencias ejecutables


Unidades Lxicas en un Bloque PL/SQL

Unidades lxicas: Estas unidades lxicas son bloques construidos de cualquier bloque PL/SQL, secuencias de caracteres incluyendo letras, nmeros, tabs, espacios, retornos de carro, y smbolos

Pueden ser clasificados como: -Identificadores -Delimitadores -Literales -Comentarios

2.3. Manipulacin de datos


Cuando se quiere agregar, actualizar o eliminar datos de una base de datos, se ejecutan sentencias DML. Una coleccin de sentencias DML que forman una unidad lgica de trabajo es llamada transaccin.

Considere una base de datos de un banco. Cuando un cliente del banco transfiere dinero de su cuenta de ahorros a su cuenta de cheques, la transaccin puede consistir de tres operaciones separadas:

1. Decrementa la cuenta de ahorros. 2. Incrementar la cuenta de cheques. 3. Registrar la transaccin en la bitcora de transacciones.

11

Taller de base de datos 2 12 Extensiones de lenguaje de procedimiento para SQL Modificar las tablas de la Base de Datos utilizando comandos DML INSERT UPDATE DELETE

2.3.1. Insercin de datos.


Para almacenar datos en una base de datos debemos insertar filas en las tablas. Para ellos SQL pone a nuestra disposicin la sentencia INSERT. El proceso de insercin de filas consiste en aadir a una tabla una o ms filas y en cada fila todos o parte de sus campos.

Podemos distinguir dos formas de insertar filas: Insercin individual de filas. Insercin mltiple de filas.

2.3.2. Actualizacin de datos.


Para la actualizacin de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualizacin de uno o varios registros de una nica tabla

2.3.3. Eliminacin de datos.


DELETE: Elimina una o varias filas de una tabla. Ejemplo: DECLARE Deptno employess, department_idTYPE; 10; BEGIN DELETE FROM employees
12

Taller de base de datos 2 13 Extensiones de lenguaje de procedimiento para SQL WHERE departmemt_id = deptno; END;

2.4. Estructuras de control.


Las estructuras de control nos permiten controlar el flujo del programa: tomar decisiones, realizar acciones repetitivas etc, dependiendo de unas condiciones que nosotros mismos establezcamos. Entre las cuales podemos encontrar las estructuras condicionales ( if, if-else),los bucles y las etiquetas anidadas.

2.4.1 Estructuras condicionales.


IF-ELSE su estructura bsica es:

IF condicin THEN Bloque de instrucciones; [ELSIF condicin THEN Bloque de instrucciones;] ... [ELSE Bloque de instrucciones;] END IF; Como en cualquier lenguaje de programacin, condicin es cualquier expresin que de cmo resultado un valor booleano. Hay que saber que las estructuras IF se pueden anidar unas dentro de otras. IF THEN se evala la condicin y si resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte falsa o nula, NO se realiza NINGUNA accin.

IF fecha_nac < '1-01-1970' THEN --No termina con un ; Salario := salario *1.15; --aumento de salario en un 15%
13

Taller de base de datos 2 14 Extensiones de lenguaje de procedimiento para SQL END IF;

Se pueden anidar varias instrucciones: IF fecha_nac < 1-01-1970 THEN IF apellido =Martnez THEN salario:= salario *1.15; END IF; END IF; IF - THEN ELSE se evala la condicin y si resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte falsa, se ejecutan las instrucciones que siguen a la instruccin ELSE. Slo se permite una instruccin ELSE en cada instruccin IF. IF fecha_nac <1-01-1970 THEN salario:= salario *1.15; ELSE salario:= salario* 1.05; END IF; IF - THEN ELSIF se evala la condicin y si resulta verdadera, se ejecutan uno o ms lneas de cdigo de programa. En el caso de que la condicin resulte ser falsa, se evala la condicin especificada en el ELSIF. IF condicion THEN instrucciones; ELSE IF condicion2 THEN instrucciones; ELSE IF condicion3 THEN instrucciones; END IF; END IF; END IF;
14

Taller de base de datos 2 15 Extensiones de lenguaje de procedimiento para SQL

2.4.2 Bucles.
Los bucles se controlan de dos maneras: o se repiten hasta que se cumpla una condicin, o se repiten un nmero especfico de veces. Cada estructura bucle puede utilizarse de cualquiera de las dos formas, pero los bucles While y Repeat son ms apropiados para ser repetidos hasta que se cumpla una condicin, y los bucles For son ms apropiados para ser repetidos un nmero especfico de veces.

LOOP sentencias; END LOOP;

Las sentencias de dentro del bucle se ejecutarn durante un nmero indefinido de vueltas, hasta que aparezca la instruccin EXIT; que finalizar el bucle. Este tipo de bucle se denomina bucle incondicional.

LOOP Sentencias IF (expresion) THEN Sentencias EXIT; END IF; END LOOP;

Otra opcin es incluir la estructura EXIT WHEN condicin, se terminar el bucle cuando la condicin se cumpla:

LOOP Sentencias EXIT WHEN condicin; Sentencias END LOOP;


15

Taller de base de datos 2 16 Extensiones de lenguaje de procedimiento para SQL

La sintaxis formal de la estructura de control de flujo While...End while es:

While (Expresion_Booleana) instruccin(es) End while

Un bucle While...End while ejecuta las instrucciones en el bucle mientras que la expresin booleana sea TRUE. Prueba la expresin booleana al comienzo del bucle y no entra al bucle si la expresin es FALSE.

Es comn inicializar el valor probado en la expresin booleana antes de introducir el bucle While...End while. Inicializar el valor significa definirlo para algo apropiado, generalmente para que la expresin booleana sea verdadera y que While...End while ejecute el bucle.

La expresin booleana debe ser definida por algo dentro del bucle o si no el bucle continuar indefinidamente. El siguiente bucle contina

indefinidamente porque Infinito siempre es TRUE:

Infinito:=True While (Infinito) End while

Si se encuentra en una situacin as, donde un mtodo se ejecuta de manera descontrolada, puede utilizar la funciones de ejecucin paso a paso para detener el bucle y encontrar el problema. Para mayor informacin sobre ejecucin paso a paso de un mtodo, consulte la seccin Depurador.

La sintaxis formal de la estructura de flujo de control For...End for es: For (Variable_Contador; Expresion_Inicio; Expresion_Fin {;

Expresion_Incremento}) instruccin(es)
16

Taller de base de datos 2 17 Extensiones de lenguaje de procedimiento para SQL End for

El bucle For...End for es un bucle controlado por una variable contador: La variable contador Variable_Contador es una variable numrica (Real, Entero, o Entero largo) que el bucle For...End for inicializa en el valor especificado por Expresion_Inicio. Cada vez que el bucle se ejecuta, el valor del contador se incrementa en el valor especificado por el parmetro opcional Expresion_Incremento. Si no especifica Expresion_Incremento, la variable contador se incrementar por defecto en uno (1).

El control para manejo de opciones es el IF.

Control repetitivo

WHILE: Puede tenerse varias condiciones para los ciclos. Este verifica una condicin, que mientras sea verdadera se mantiene en el ciclo.

FOR numrico: se utiliza este ciclo para realizar iteraciones sobre un rango de nmeros.

FOR con cursores: Este es un tipo que combina el control de cursores y el uso de ciclos para recorrerlo. Ac no hace falta abrir y cerrar el cursor directamente, sino que el FOR se encarga de ello.

Utilice el LOOP para realizar procesamiento interactivo basado en escogencias lgicas.

2.4.3 Etiquetas anidadas.

17

Taller de base de datos 2 18 Extensiones de lenguaje de procedimiento para SQL Se pueden anidar bucles en mltiples niveles. Usar etiquetas para distinguir entre bloques y bucles. Salir al bucle exterior al que hace referencia con una etiqueta en la sentencia EXIT. Ejemplo: ... BEGIN <<Outer_loop>> LOOP counter:= counter+1; EXIT WHEN counter>10; <<Inner_loop>>LOOP ... EXIT Outer_loop WHEN total_done = 'YES'; --Leave both loops EXIT WHEN inner_done = 'YES'; --Leave inner loop only ... END LOOP Inner_loop; ... END LOOP Outer_loop; END; /

2.5 Tipos de datos compuestos.


Pueden retener mltiples valores (distintos tipos escalares)

Hay dos tipos: Registros PL/SQL Colecciones PL/SQL Tablas INDEX BYo arreglos asociativos Tablas anidadas
18

Taller de base de datos 2 19 Extensiones de lenguaje de procedimiento para SQL VARRAY Se usa registros PL/SQL cuando se quiere almacenar valores de diferentes tipos de datos pero slo una ocurrencia en el tiempo. Se usa colecciones PL/SQL cuando se quieren almacenar valores del mismo tipo de dato.

2.5.1 Registros.
Deben contener uno o ms componentes (llamados campos) de cualquier tipo de dato escalar, RECORD, o tabla INDEX BY Son similares a las estructuras en lenguajes 3GL (incluyendo C y C++) Son definidos por el usuario y pueden ser un subconjunto de una fila en una tabla Tratan una coleccin de campos como una unidad lgica Son convenientes para recuperar registros de datos de una tabla para procesarlos TYPE type_nameISRECORD(field_declaration[, field_declaration]); identifiertype_name; field_declaration: field_name {field_type |variable%TYPE |table.column%TYPE

|table%ROWTYPE}[[NOT NULL] {:= | DEFAULT} expr]

2.6. Cursores
Los cursores permiten manejar grupos de datos que se obtienen como resultado de una consulta SQL que retorna una o ms filas. PL/SQL utiliza dos tipos de cursores: implcitos y explcitos. Siempre declara un cursor implcito para cualquier sentencia de manipulacin de datos, incluyendo aquellas que retornan slo una fila. Sin embargo, para las consultas que retornan ms de una fila, usted debe declarar un cursor explcito para ser usado en una instruccin FOR

19

Taller de base de datos 2 20 Extensiones de lenguaje de procedimiento para SQL Los cursores explcitos son aquellos que devuelven cero, una o ms filas, dependiendo de los criterios con que hayan sido construidos. Un cursor puede ser declarado en la primera seccin de un programa PL/SQL (declare). Existen tres comandos para controlar un cursor: OPEN, FETCH y CLOSE. En un principio, el cursor se inicializa con la instruccin OPEN. Enseguida, se utiliza la instruccin FETCH para recuperar la primera fila o conjunto de datos. Se puede ejecutar FETCH repetidas veces hasta que todas las filas hayan sido recuperadas. Cuando la ltima fila ya ha sido procesada, el cursor se puede liberar con la sentencia CLOSE.

Los cursores implcitos se utilizan para realizar consultas SELECT que devuelven un nico registro. Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores implcitos:

Con cada cursor implcito debe existir la palabra clave INTO. Las variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tabla.

Los cursores implcitos solo pueden devolver una nica fila. En caso de que se devuelva ms de una fila (o ninguna fila) se producir una excepcin. No se preocupe si an no sabe que es una excepcin, le valdr conocer que es el medio por el que PL/SQL gestiona los errores.

Ejemplo: declare vdescripcion VARCHAR2(50); begin SELECT DESCRIPCION INTO vdescripcion from PAISES WHERE CO_PAIS = 'ESP';

dbms_output.put_line('La lectura del cursor es: ' || vdescripcion);

20

Taller de base de datos 2 21 Extensiones de lenguaje de procedimiento para SQL

end; Excepciones asociadas a los cursores implcitos.

Los cursores implcitos slo pueden devolver una fila, por lo que pueden producirse determinadas excepciones. Las ms comunes que se pueden encontrar son no_data_found y too_many_rows. La siguiente tabla explica brevemente estas excepciones.

Excepcion

Explicacion

NO_DATA_FOUND Se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna fila satisface sus condiciones. Es decir, cuando "no hay datos" TOO_MANY_ROWS Dado que cada cursor implicito slo es capaz de recuperar una fila , esta excepcin detecta la existencia de ms de una fila.

Los cursores explcitos se emplean para realizar consultas SELECT que pueden devolver cero filas, o ms de una fila. Para trabajar con un cursor explicito necesitamos realizar las siguientes tareas:

Declarar el cursor. Abrir el cursor con la instruccin OPEN. Leer los datos del cursor con la instruccin FETCH. Cerrar el cursor y liberar los recursos con la instruccin CLOSE.

Para declarar un cursor debemos emplear la siguiente sintaxis: CURSOR nombre_cursor IS instruccin_SELECT

Tambin debemos declarar los posibles parametros que requiera el cursor: CURSOR nombre_cursor(param1 tipo1, ..., paramN tipoN) IS
21

Taller de base de datos 2 22 Extensiones de lenguaje de procedimiento para SQL instruccin_SELECT Para abrir el cursor OPEN nombre_cursor; o bien (en el caso de un cursor con parmetros) OPEN nombre_cursor(valor1, valor2, ..., valorN);

Para recuperar los datos en variables PL/SQL. FETCH nombre_cursor INTO lista_variables; -- o bien ... FETCH nombre_cursor INTO registro_PL/SQL;

Para cerrar el cursor: CLOSE nombre_cursor;

El siguiente ejemplo ilustra el trabajo con un cursor explicito. Hay que tener en cuenta que al leer los datos del cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla (o tablas) que trata el cursor. DECLARE CURSOR cpaises IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISES; co_pais VARCHAR2(3); descripcion VARCHAR2(50); continente VARCHAR2(25); BEGIN OPEN cpaises; FETCH cpaises INTO co_pais,descripcion,continente; CLOSE cpaises; END;

22

Taller de base de datos 2 23 Extensiones de lenguaje de procedimiento para SQL El mismo ejemplo pero utilizamos parmetros DECLARE CURSOR cpaises (p_continente VARCHAR2) IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISES WHERE CONTINENTE = p_continente; registro cpaises%ROWTYPE; BEGIN OPEN cpaises('EUROPA'); FETCH cpaises INTO registro; CLOSE cpaises; END;

Cuando trabajamos con cursores debemos considerar:


Cuando un cursor est cerrado, no se puede leer. Cuando leemos un cursor debemos comprobar el resultado de la lectura utilizando los atributos de los cursores.

Cuando se cierra el cursor, es ilegal tratar de usarlo. Es ilegal tratar de cerrar un cursor que ya est cerrado o no ha sido abierto

Atributos de los cursores


Toman los valores TRUE, FALSE o NULL dependiendo de la situacin: Atributo Antes de abrir Al abrir Durante la recuperacin Al finalizar la recuperacin NULL NULL TRUE 0 FALSE TRUE TRUE * TRUE FALSE TRUE ** Despus de cerrar ORA-1001 ORA-1001 FALSE ORA-1001

%NOTFOUND ORA-1001 %FOUND %ISOPEN ORA-1001 FALSE

%ROWCOUNT ORA-1001

23

Taller de base de datos 2 24 Extensiones de lenguaje de procedimiento para SQL * Nmero de registros que ha recuperado hasta el momento

** Nmero de total de registros

Manejo del cursor Por medio de ciclo LOOP podemos iterar a travs del cursor. Debe tenerse cuidado de agregar una condicin para salir del bucle:

Vamos a ver varias formas de iterar a travs de un cursor. La primera es utilizando un bucle LOOP con una sentencia EXIT condicionada: OPEN nombre_cursor; LOOP FETCH nombre_cursor INTO lista_variables; EXIT WHEN nombre_cursor%NOTFOUND; /* Procesamiento de los registros recuperados */ END LOOP; CLOSE nombre_cursor;

2.7. Excepciones
En PL/SQL una advertencia o condicin de error es llamada una excepcin. Las excepciones se controlan dentro de su propio bloque. La estructura de bloque de una excepcin se muestra a continuacin. DECLARE -- Declaraciones BEGIN -- Ejecucion EXCEPTION -- Excepcion END;

24

Taller de base de datos 2 25 Extensiones de lenguaje de procedimiento para SQL Cuando ocurre un error, se ejecuta la porcin del programa marcada por el bloque EXCEPTION, transfirindose el control a ese bloque de sentencias.

El siguiente ejemplo muestra un bloque de excepciones que captura las excepciones NO_DATA_FOUND y ZERO_DIVIDE. Cualquier otra excepcion ser capturada en el bloque WHEN OTHERS THEN. DECLARE -- Declaraciones BEGIN -- Ejecucion EXCEPTION WHEN NO_DATA_FOUND THEN -- Se ejecuta cuando ocurre una excepcion de tipo NO_DATA_FOUND WHEN ZERO_DIVIDE THEN -- Se ejecuta cuando ocurre una excepcion de tipo ZERO_DIVIDE WHEN OTHERS THEN -- Se ejecuta cuando ocurre una excepcion de un tipo no tratado -- en los bloques anteriores END;

Como ya hemos dicho cuando ocurre un error, se ejecuta el bloque EXCEPTION, transfirindose el control a las sentencias del bloque. Una vez finalizada la ejecucin del bloque de EXCEPTION no se contina ejecutando el bloque anterior. Si existe un bloque de excepcin apropiado para el tipo de excepcin se ejecuta dicho bloque. Si no existe un bloque de control de excepciones adecuado al tipo de excepcin se ejecutar el bloque de excepcin WHEN OTHERS THEN (si existe!). WHEN OTHERS debe ser el ltimo manejador de excepciones.

Las excepciones pueden ser definidas en forma interna o explcitamente por el usuario. Ejemplos de excepciones definidas en forma interna son la divisin por cero y la falta de memoria en tiempo de ejecucin. Estas mismas

25

Taller de base de datos 2 26 Extensiones de lenguaje de procedimiento para SQL condiciones excepcionales tienen sus propio tipos y pueden ser

referenciadas por ellos: ZERO_DIVIDE y STORAGE_ERROR.

Las excepciones definidas por el usuario deben ser alcanzadas explcitamente utilizando la sentencia RAISE.

Con las excepciones se pueden manejar los errores cmodamente sin necesidad de mantener mltiples chequeos por cada sentencia escrita. Tambin provee claridad en el cdigo ya que permite mantener las rutinas correspondientes al tratamiento de los errores de forma separada de la lgica del negocio.

Excepciones predefinidas

PL/SQL proporciona un gran nmero de excepciones predefinidas que permiten controlar las condiciones de error ms habituales. Las excepciones predefinidas no necesitan ser declaradas. Simplemente se utilizan cuando estas son lanzadas por algn error determinado.

La siguiente es la lista de las excepciones predeterminadas por PL/SQL y una breve descripcin de cundo son accionadas: Excepcion ACCESS_INTO_NULL COLLECTION_IS_NULL Se ejecuta ... El programa intent asignar valores a los atributos de un objeto no inicializado El programa intent asignar valores a una tabla anidada an no inicializada El programa intent abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automticamente lo abre y ello no se debe especificar con la sentencia OPEN El programa intent almacenar valores duplicados en una columna que se mantiene con restriccin de integridad de un ndice nico (unique index) El programa intent efectuar una operacin no vlida sobre un cursor SQLCODE -6530 -6531

CURSOR_ALREADY_OPEN

-6511

DUP_VAL_ON_INDEX

-1

INVALID_CURSOR

-1001

26

Taller de base de datos 2 27 Extensiones de lenguaje de procedimiento para SQL En una sentencia SQL, la conversin de una cadena de caracteres hacia un nmero INVALID_NUMBER falla cuando esa cadena no representa un nmero vlido El programa intent conectarse a Oracle LOGIN_DENIED con un nombre de usuario o password invlido Una sentencia SELECT INTO no devolvi valores o el programa referenci un NO_DATA_FOUND elemento no inicializado en una tabla indexada El programa efectu una llamada a Oracle NOT_LOGGED_ON sin estar conectado PROGRAM_ERROR PL/SQL tiene un problema interno Los elementos de una asignacin (el valor a asignar y la variable que lo contendr) tienen tipos incompatibles. Tambin se ROWTYPE_MISMATCH presenta este error cuando un parmetro pasado a un subprograma no es del tipo esperado El parmetro SELF (el primero que es SELF_IS_NULL pasado a un mtodo MEMBER) es nulo STORAGE_ERROR La memoria se termin o est corrupta El programa est tratando de referenciar un elemento de un arreglo indexado que se SUBSCRIPT_BEYOND_COUNT encuentra en una posicin ms grande que el nmero real de elementos de la coleccin El programa est referenciando un elemento de un arreglo utilizando un SUBSCRIPT_OUTSIDE_LIMIT nmero fuera del rango permitido (por ejemplo, el elemento -1) La conversin de una cadena de caracteres SYS_INVALID_ROWID hacia un tipo rowid fall porque la cadena no representa un nmero Se excedi el tiempo mximo de espera por TIMEOUT_ON_RESOURCE un recurso en Oracle Una sentencia SELECT INTO devuelve TOO_MANY_ROWS ms de una fila Ocurri un error aritmtico, de conversin o truncamiento. Por ejemplo, sucede cuando VALUE_ERROR se intenta calzar un valor muy grande dentro de una variable ms pequea El programa intent efectuar una divisin ZERO_DIVIDE por cero

-1722

-1017

100

-1012 -6501

-6504

-30625 -6500 -6533

-6532

-1410 -51 -1422

-6502

-1476

27

Taller de base de datos 2 28 Extensiones de lenguaje de procedimiento para SQL PL/SQL permite al usuario definir sus propias excepciones, las que debern ser declaradas y lanzadas explcitamente utilizando la sentencia RAISE.

Las excepciones deben ser declaradas en el segmento DECLARE de un bloque, subprograma o paquete. Se declara una excepcin como cualquier otra variable, asignandole el tipo EXCEPTION. Las mismas reglas de alcance aplican tanto sobre variables como sobre las excepciones. DECLARE -- Declaraciones MyExcepcion EXCEPTION; BEGIN -- Ejecucion EXCEPTION -- Excepcion END; La sentencia RAISE

La sentencia RAISE permite lanzar una excepcin en forma explcita. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepcin. DECLARE -- Declaramos una excepcion identificada por VALOR_NEGATIVO VALOR_NEGATIVO EXCEPTION; valor NUMBER; BEGIN -- Ejecucion valor := -1; IF valor < 0 THEN RAISE VALOR_NEGATIVO; END IF;
28

Taller de base de datos 2 29 Extensiones de lenguaje de procedimiento para SQL EXCEPTION -- Excepcion WHEN VALOR_NEGATIVO THEN dbms_output.put_line('El valor no puede ser negativo'); END; Con la sentencia RAISE podemos lanzar una excepcin definida por el usuario o predefinida, siendo el comportamiento habitual lanzar excepciones definidas por el usuario. Recordar la existencia de la excepcin OTHERS, que simboliza cualquier condicin de excepcin que no ha sido declarada. Se utiliza comnmente para controlar cualquier tipo de error que no ha sido previsto. En ese caso, es comn observar la sentencia ROLLBACK en el grupo de sentencias de la excepcin o alguna de las funciones SQLCODE SQLERRM, que se detallan en el prximo punto.

Uso de SQLCODE y SQLERRM

Al manejar una excepcin es posible usar las funciones predefinidas SQLCode y SQLERRM para aclarar al usuario la situacin de error acontecida. SQLcode devuelve el nmero del error de Oracle y un 0 (cero) en caso de exito al ejecutarse una sentencia SQL. Por otra parte, SQLERRM devuelve el correspondiente mensaje de error. Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones, para aclarar el significado de la excepcin OTHERS. Estas funciones no pueden ser utilizadas directamente en una sentencia SQL, pero s se puede asignar su valor a alguna variable de programa y luego usar esta ltima en alguna sentencia. DECLARE err_num NUMBER; err_msg VARCHAR2(255); result NUMBER; BEGIN SELECT 1/0 INTO result FROM DUAL;
29

Taller de base de datos 2 30 Extensiones de lenguaje de procedimiento para SQL EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; err_msg := SQLERRM; DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num)); DBMS_OUTPUT.put_line(err_msg); END;

Tambin es posible entregarle a la funcin SQLERRM un nmero negativo que represente un error de Oracle y sta devolver el mensaje asociado. DECLARE msg VARCHAR2(255); BEGIN msg := SQLERRM(-1403); DBMS_OUTPUT.put_line(MSG); END;

2.8 SQL Dinmico y metadatos.


Se usa SQL dinmico para crear sentencias SQL cuya estructura puede cambiar en tiempo de ejecucin. SQL Dinmico: Es construido y almacenado como cadena de caracteres dentro de la aplicacin. Es una sentencia SQL con columnas de dato que pueden variar, o diferentes condiciones, y pueden tener o no variables de sustitucin (bind). Permite construir y ejecutar sentencias DDL, DCL, o de control de sesin desde PL/SQL. Es ejecutado mediante una sentencia de SQL Nativo Dinmico o por el paquete DBMS_SQL.

SQL Nativo Dinmico

30

Taller de base de datos 2 31 Extensiones de lenguaje de procedimiento para SQL Suministra soporte nativo para SQL dinmico en el lenguaje PL/SQL. Proporciona la capacidad de ejecutar sentencias SQL cuya estructura se desconoce hasta en tiempo de ejecucin. Es soportado por las siguientes sentencias PL/SQL : EXECUTE IMMEDIATE OPEN-FOR FETCH CLOSE

Metadatos:

El

paquete

DBMS_METADATA

proporciona

la

habilidad

centralizada de extraccin, manipulacin, y replanteamiento del diccionario de metadatos.

Metadatos API El proceso involucra los siguientes pasos: 1. Recuperar como XML metadatos de un objeto. 2. Transformar el XML en una variedad de formas (incluyendo el transformarlo en una sentencia DDL).

2.9 Dependencias.
Las dependencias SQL son las referencias por nombre utilizadas en expresiones SQL para hacer que una entidad definida por el usuario dependa de otra. Una entidad que hace referencia a otra en su definicin, se denominar entidad de referencia (si esa definicin se almacena en el catlogo del sistema). Una entidad a la que hace referencia otra entidad se denomina una entidad a la que se hace referencia. Hay dos tipos de dependencia a la que Motor de base de datos ha realizado un seguimiento.

Dependencia enlazada a esquema

Una Dependencia enlazada a esquema es una relacin entre dos entidades que evita que la entidad a la que se hace referencia se elimine o modifique
31

Taller de base de datos 2 32 Extensiones de lenguaje de procedimiento para SQL mientras exista la entidad de referencia. Se inicia una Dependencia enlazada a esquema cuando se crea una vista o funcin definida por el usuario utilizando la clusula WITH SCHEMABINDING. Tambin se puede crear una

Dependencia enlazada a esquema cuando una tabla hace referencia a otra entidad como, por ejemplo, una funcin definida por el usuario de TransactSQL, un tipo definido por el usuario o una coleccin de esquemas XML en una restriccin CHECK o DEFAULT, o bien en la definicin de una columna calculada. Si se especifica un objeto mediante un nombre de dos partes (schema_name.object_name), no se certifica como una referencia enlazada a un esquema.

Dependencia no enlazada a esquema

Una Dependencia no enlazada a esquema es una relacin entre dos entidades que no evita que la entidad referenciada se elimine o modifique.

2.10. Triggers
Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de una determinada instruccin SQL (una operacin DML: INSERT, UPDATE o DELETE) sobre dicha tabla.

La sintaxis para crear un trigger es la siguiente: CREATE [OR REPLACE] TRIGGER <nombre_trigger> {BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN] [OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]} ON <nombre_tabla> [FOR EACH ROW [WHEN (<condicion>)]] DECLARE -- variables locales BEGIN -- Sentencias [EXCEPTION]
32

Taller de base de datos 2 33 Extensiones de lenguaje de procedimiento para SQL -- Sentencias control de excepcion END <nombre_trigger>;

El uso de OR REPLACE permite sobreescribir un trigger existente. Si se omite, y el trigger existe, se producir, un error.

Los triggers pueden definirse para las operaciones INSERT, UPDATE o DELETE, y pueden ejecutarse antes o despus de la operacin. El

modificador BEFORE AFTER indica que el trigger se ejecutar antes o despues de ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE. Si incluimos el modificador OF el trigger solo se ejecutar cuando la sentencia SQL afecte a los campos incluidos en la lista.

El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH ROW indica que el trigger se disparar cada vez que se realizan operaciones sobre una fila de la tabla. Si se acompaa del modificador WHEN, se establece una restriccin; el trigger solo actuar, sobre las filas que satisfagan la restriccin.

La siguiente tabla resume los contenidos anteriores.

Valor INSERT, DELETE, UPDATE BEFORE , AFTER

Descripcin Define qu tipo de orden DML provoca la activacin del disparador. Define si el disparador se activa antes o despus de que se ejecute la orden. Los disparadores con nivel de fila se activan una vez por cada fila afectada por la orden que provoc el disparo. Los disparadores con nivel de orden se activan slo una vez, antes o despus de la orden. Los disparadores con nivel de fila se identifican por la clusula FOR EACH ROW en la definicin del disparador.

FOR EACH ROW

La clusula WHEN slo es vlida para los disparadores con nivel de fila. Dentro del ambito de un trigger disponemos de las variables OLD y NEW. Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL,
33

Taller de base de datos 2 34 Extensiones de lenguaje de procedimiento para SQL con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despus(NEW) de la accin SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se estn insertando, actualizando o borrando. El siguiente ejemplo muestra un trigger que inserta un registro en la tabla PRECIOS_PRODUCTOS cada vez que insertamos un nuevo registro en la tabla PRODUTOS: CREATE OR REPLACE TRIGGER TR_PRODUCTOS_01 AFTER INSERT ON PRODUCTOS FOR EACH ROW DECLARE -- local variables BEGIN INSERT INTO PRECIOS_PRODUCTOS (CO_PRODUCTO,PRECIO,FX_ACTUALIZACION) VALUES (:NEW.CO_PRODUCTO,100,SYSDATE); END ;

El trigger se ejecutar cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT. INSERT INTO PRODUCTOS (CO_PRODUCTO, DESCRIPCION) VALUES ('000100','PRODUCTO 000100');

Orden de ejecucin de los triggers Una misma tabla puede tener varios triggers. En tal caso es necesario conocer el orden en el que se van a ejecutar. Los disparadores se activan al ejecutarse la sentencia SQL.

34

Taller de base de datos 2 35 Extensiones de lenguaje de procedimiento para SQL

Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de orden.

Para cada fila a la que afecte la orden:


o

Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila.

o o

Se ejecuta la propia orden. Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila.

Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden.

Restricciones de los triggers

El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es legal en el cuerpo de un disparador, con las siguientes restricciones:

Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o SAVEPOINT. El disparador se activa como parte de la ejecucin de la orden que provoc el disparo, y forma parte de la misma transaccin que dicha orden. Cuando la orden que provoca el disparo es confirmada o cancelada, se confirma o cancela tambin el trabajo realizado por el disparador.

Por razones idnticas, ningn procedimiento o funcin llamado por el disparador puede emitir rdenes de control de transacciones.

El cuerpo del disparador no puede contener ninguna declaracin de variables LONG o LONG RAW

Utilizacin de: OLD y: NEW

Dentro del mbito de un trigger disponemos de las variables OLD y NEW. Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despus(NEW) de la accin SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger.
35

Taller de base de datos 2 36 Extensiones de lenguaje de procedimiento para SQL Utilizando esta variable podemos acceder a los datos que se estn insertando, actualizando o borrando.

La siguiente tabla muestra los valores de OLD y NEW.

ACCION SQL INSERT UPDATE DELETE

OLD

NEW

No definido; todos los campos toman Valores que sern insertados cuando se valor NULL. complete la orden. Valores originales de la fila, antes de Nuevos valores que sern escritos cuando la actualizacin. se complete la orden. Valores, antes del borrado de la fila. No definidos; todos los campos toman el valor NULL.

Los registros OLD y NEW son slo vlidos dentro de los disparadores con nivel de fila. Podemos usar OLD y NEW como cualquier otra variable PL/SQL. Utilizacin de predicados de los triggers: INSERTING, UPDATING y DELETING. Dentro de un disparador en el que se disparan distintos tipos de rdenes DML (INSERT, UPDATE y DELETE), hay tres funciones booleanas que pueden emplearse para determinar de qu operacin se trata. Estos predicados son INSERTING, UPDATING y DELETING.

Su comportamiento es el siguiente: Predicado INSERTING UPDATING DELETING Comportamiento TRUE si la orden de disparo es INSERT; FALSE en otro caso. TRUE si la orden de disparo es UPDATE; FALSE en otro caso. TRUE si la orden de disparo es DELETE; FALSE en otro caso.

36

Taller de base de datos 2 37 Extensiones de lenguaje de procedimiento para SQL

2.11 Compilacin nativa e interpretada.


Considere lo siguiente para la compilacin nativa: Herramientas para depuracin de cdigo de PL/SQL no pueden depurar cdigo compilado nativamente. El cdigo nativamente compilado es ms lento al compilar que el cdigo interpretado. Grandes cantidades de subprogramas compilados nativamente pueden afectar el rendimiento del sistema operativo cuando existe un manejo de libreras compartido. Las limitaciones del SO puede ser administradas configurando los parmetros de inicializacin de la base de datos: PLSQL_NATIVE_LIBRARY_SUBDIR_COUNT y PLSQL_NATIVE_LIBRARY_DIR

37

Taller de base de datos 2 38 Extensiones de lenguaje de procedimiento para SQL

Conclusiones:
Como conclusin tenemos que el PL/SQL tiene distintos tipos de bloques, pero primero se debe aprender el bloque bsico que como vimos va desde la declaracin, begin, exception y end para que luego podamos aprender los bloques annimo, procedimiento y de funcin. As como tambin debemos de tener en cuenta y debemos de saber los tipos de variables que se pueden utilizar, los triggers, y las herramientas de programacin de Pl/Sql que van desde el bloque annimo hasta el tipo de dato.

Bibliografa
http://eduardo.homelinux.net/pdfs/Tema7-PLSQL_Oracle.pdf http://www.devjoker.com/contenidos/Tutorial-PLSQL/60/Tipos-de-datos-en-PLSQL.aspx http://www.falconmarbella.com/esigranada/dmdocuments/PL_SQL.pdf http://www.mundoracle.com/pl-sql.html?Pg=sql_plsql_11.htm

38

You might also like