Está en la página 1de 49

CURSO DE PL/SQL

Qu es PL/SQL?

PL/SQL provee una manera muy cmoda de relacionar los conceptos de bases
de datos y manejarlos mediante ciertas estructuras de control, dentro del
contexto de una herramienta netamente de programacin.

Su utilizacin es dentro del administrador de bases de datos "Oracle" y sus


principales caractersticas son la posibilidad que brinda de utilizar sentencias
SQL para manipular datos en Oracle y sentencias de control de flujo para
organizar esta manipulacin de datos.

Dentro del lenguaje, es posible declarar constantes y variables, definir


procedimientos y funciones y atrapar errores en tiempo de ejecucin. As visto,
PL/SQL combina el poder de la manipulacin de datos, con SQL, y las
facilidades del procesamiento de los mismos, tal como en los ms modernos
lenguajes de programacin.

Estructuras de Bloque

PL/SQL es un lenguaje estructurado en bloques, lo que quiere decir que la


unidad bsica de codificacin son bloques lgicos, los que a su vez pueden
contener otros sub-bloques dentro de ellos, con las mismas caractersticas.

Un bloque (o sub-bloque) permite agrupar en forma lgica un grupo de


sentencias. De esta manera se pueden efectuar declaraciones de variables que
slo tendrn validez en los bloques donde stas se definan.

Un bloque PL/SQL tiene tres partes: una seccin de declaracin, una seccin de
ejecucin y otra de manejo de excepciones. Slo el bloque de ejecucin es
obligatorio en un programa PL/SQL.

PL/SQL ESTRUCTURA DE BLOQUES

DECLARE Opcional

Variables, cursores, excepciones

BEGIN-Obligatorio

1
Sentencias sql

Sentencias de control PLSQL

EXCEPTION-Opcional

Acciones a ejecutar cuando ocurre un error

END;-Obligatorio

ESTRUCTURA DE UN BLOQUE PLSQL

2
TIPOS DE BLOQUES

PRIMER_PROG.SQL

Todas las unidades de PLSQL estn compuestos de uno o ms bloques. Estos


bloques pueden estar completamente separados o anidados dentro de otros.
Las unidades bsicas (procedimientos, funciones, tambin conocidas como
subprogramas, y bloques annimos) que hacen un programa PLSQL son
bloques lgicos, lo cuales pueden contener varios sub-bloques anidados. De
este modo un bloque puede representar partes pequeas de otro bloque.

BLOQUES ANONIMOS

Los bloques annimos son bloques sin nombre. Se declaran en algn punto de
la aplicacin donde son ejecutados y pasados a el PLSQL engine para su
ejecucin en runtime.
Los triggers en Developer-2000 consisten de tales bloques.

SUBPROGRAMAS

Son bloques PLSQL con nombre, que pueden tomar parmetros y ser
invocados. Se pueden declarar procedimientos o funciones. Generalmente se
usa un procedimiento para para ejecutar una accin y una funcin para calcular
un valor.

3
Variables y Constantes

PL/SQL permite declarar constantes y variables para ser utilizadas en cualquier


expresin dentro de un programa. La nica condicin exigida por PL/SQL es que
cada variable (o constante) debe estar declarada antes de ser utilizada en una
expresin.

ALMACENAMIENTO TEMPORAL DE DATOS

Los datos pueden ser almacenados temporalmente en una o ms variables para


usarse cuando se procesan datos de entrada para un proceso posterior en el
proceso de flujo de datos.

MANIPULACION DE VALORES ALMACENADOS

Las variables se pueden utilizar para clculos y otros tipos de manipulaciones


que accedan la base de datos.

REUSABILIDAD

Una vez declaradas, las variables pueden ser usadas repetidamente dentro de
una aplicacin simplemente referenciandolas en otras sentencias, incluyendo
otras sentencias declarativas.

MANEJO DE VARIABLES EN PLSQL

Declara e inicializa variables dentro de la seccin declarativa


Asigna nuevos valores a las variables en la seccin ejecutable.

Pasa valores dentro de los bloques plsql a travs de parmetros.

Ve resultados a travs de variables de salida.

Tipos de Datos y Conversiones

Cada constante y variable posee un tipo de dato el cual especifica su forma de


almacenamiento, restricciones y rango de valores vlidos. Con PL/SQL se
proveen diferentes tipos de datos predefinidos. Un tipo escalar no tiene
componentes internas; un tipo compuesto tiene otras componentes internas que
pueden ser manipuladas individualmente. Un tipo de referencia almacena
valores, llamados punteros, que designan a otros elementos de programa. Un
tipo lob (large object) especifica la ubicacin de un tipo especial de datos que se
almacenan de manera diferente.

4
DECLARACION DE VARIABLES PLSQL

SINTAXIS

5
DECLARACION DE CONSTANTES

Es como declarar una constante, excepto que se debe aadir la palabra


CONSTANT e inmediatamente asigna un valor a la constante. Posteriormente no
se permiten ms asignaciones a la constante.

Credit_limit CONSTANT := REAL 5000.00

Alcance y Visibilidad

Las referencias a un identificador son resueltas de acuerdo a su alcance y


visibilidad dentro de un programa. El alcance de un identificador es aquella
regin de la unidad de programa (bloque, subprograma o paquete) desde la cual
se puede referenciar al identificador.

Un identificador es visible slo en las regiones en que se puede referenciar.

La figura 3-2 muestra el alcance y visibilidad de la variable x, la cual est


declarada en dos bloques cerrados diferentes.

Los identificadores declarados en un bloque de PL/SQL se consideran locales al


bloque y globales a todos sus sub-bloques o bloques anidados. De esto se
desprende que un mismo identificador no se puede declarar dos veces en un
mismo bloque pero s en varios bloques diferentes, cuantas veces se desee.

Este ejemplo ilustra el alcance y visibilidad (o posibilidad de ser referenciada) de


una determinada variable x, que ha sido declarada en dos bloques anidados. La
variable ms externa tiene un alcance ms amplio pero cuando es referenciada
en el bloque en que se ha declarado otra variable con el mismo nombre, es esta
ltima la que puede ser manipulada y no la primera.

TIPOS NUMERICOS

BINARY_INTEGER

6
ALCANCE.SQL
NUMBER

Se utiliza para almacenar nmero de punto fijo y nmeros de punto flotante. Su


rango es de 1E-130..10E125.
Se puede especificar la precisin, la cual es el nmero total de dgitos, y escala
la cual es el nmero de dgitos a la derecha del punto decimal.

SINTAXIS

NUMBER(precision,scale)

La precisin mxima de un tipo number es de 38 dgitos. La escala puede tener


un rango de -84 a 127 y determina donde ocurre el redondeo. Una escala de 2
redondea al centsimo ms cercano (3.456 redondea a 3.46) .Una escala
negativa redondea al milsimo ms cercano. Por ejemplo una escala de -3 (3456
se vuelve 3000).

TIPOS CARCTER

Permiten almacenar datos alfanumricos, representan palabras y texto y


manipulan cadenas de caracteres.

CHAR

Se utiliza para almacenar datos de tipo carcter de longitud fija. El tipo de datos
char toma un parmetro opcional que permite especificar un tamao mximo de
32767 bytes. Se puede especificar el tamao en trminos de bytes o caracteres,
donde cada carcter contiene uno o ms bytes.

SINTAXIS

CHAR (maximum_size char | byte )


Si no se especifica el tamao mximo el default es 1.

LONG

Se utiliza es tipo para almacenar cadenas de caracteres de longitud variable. El


tipo LONG es como VARCHAR2, excepto que el tamao mximo de LONG es
de 32760 bytes.

7
VARCHAR2

Se utiliza para almacenar cadenas de caracteres de longitud variable.

TIPOS LOB

BFILE,BLOB, CLOB y NCLOB permite almacenar bloques de datos no


estructurados ( tales como texto, imgenes grficas, video clips y sonidos) con
tamaos superiores a 4 gigabytes.

TIPO BOOLEAN

Se utiliza el tipo de datos boolean para almacenar valores lgicos TRUE,


FALSE y NULL. Slo se permite operaciones lgicas en variables booleanas.
No se pueden insertar valores de TRUE o FALSE en una columna de la base de
datos. Tampoco se puede seleccionar o hacer fetch de columnas en variables
tipo BOOLEAN.

TIPO FECHA

DATE

Se utiliza para almacenar datetime, los cuales incluyen el tiempo del da en


segundos desde la media noche. La porcin de fecha tiene como default el
primer da del mes actual, la porcin de tiempo tiene como default la media
noche. La funcin de fecha SYSDATE retorna la fecha y hora actual.

Conversiones

Algunas veces se hace necesario convertir un valor desde un tipo de dato a otro.
En PL/SQL se aceptan las conversiones de datos implcitas y explcitas.

Una conversin explcita es aquella que se efecta utilizando las funciones


predefinidas. Por ejemplo, para convertir un valor de carcter a fecha o nmero
se utiliza TO_DATE o TO_NUMBER.

Existe una cantidad limitada de funciones de conversin, que implementan esta


caracterstica de conversin explcita.

Cuando se hace necesario, PL/SQL puede convertir un tipo de dato a otro en


forma implcita. Esto significa que la interpretacin que se dar a algn dato ser

8
el que mejor se adecue dependiendo del contexto en que se encuentre.
Tampoco significa que todas las conversiones son permitidas. Algunos ejemplos
de conversin implcita ms comunes se dan cuando variables de tipo char se
operan matemticamente para obtener un resultado numrico.

Si PL/SQL no puede decidir a qu tipos de dato de destino puede convertir una


variable se generar un error de compilacin.

Tabla de conversiones implcitas

Hasta BIN_IN CHA DAT LON NUMBE PLS_IN RA ROWI VARCHA


T R E G R T W D R2

Desde

BIN_INT X X X X X

CHAR X X X X X X X X

DATE X X X

LONG X X X

NUMBER X X X X X

PLS_INT X X X X X

RAW X X X

ROWID X X

VARCHA X X X X X X X X
R2

9
Uso de %TYPE

El atributo %TYPE define el tipo de una variable utilizando una definicin previa
de otra variable o columna de la base de datos.

Ejemplo:

DECLARE

credito REAL(7,2);

debito credito%TYPE;

Tambin se podra declarar una variable siguiendo el tipo de un campo de


alguna tabla, como por ejemplo en:

debito cuenta.debe%TYPE;

La ventaja de esta ltima forma es que no es necesario conocer el tipo de dato


del campo "debe" de la tabla "emp", manteniendo la independencia necesaria
para proveer ms flexibilidad y rapidez en la construccin de los programas.

Uso de %ROWTYPE

El atributo %ROWTYPE precisa el tipo de un registro (record) utilizando una


definicin previa de una tabla o vista de la base de datos. Tambin se puede
asociar a una variable como del tipo de la estructura retornada por un cursor.

Ejemplo:

DECLARE

emp_rec emp%ROWTYPE;

CURSOR c1 IS SELECT deptno, dname, loc FROM dept;

dept_rec c1%ROWTYPE;

En este ejemplo la variable emp_rec tomar el formato de un registro completo


de la tabla emp y la variable dept_rec se define por una estructura similar a la
retornada por el cursor c1.

10
Uso_type.sql

Uso_rowtype.sql

Fundamentos del lenguaje

Este captulo se centra en pequeos aspectos del lenguaje, tal como el grupo de
caracteres vlidos, las palabras reservadas, signos de puntuacin y otras reglas
de formacin de sentencias que es preciso conocer antes de empezar a trabajar
con el resto de funcionalidades.

Set de Caracteres y Unidades Lxicas

Las instrucciones del lenguaje deben ser escritas utilizando un grupo de


caracteres vlidos. PL/SQL no es sensible a maysculas o minsculas. El grupo
de caracteres incluye los siguientes:

Letras maysculas y minsculas de la A a la Z


Nmeros del 0 al 9
Los smbolos ( ) + - * / < > = ! ~ ^ ; . @ % , " # $ & _ | { } ? [ ]
Tabuladores, espacios y saltos de carro

Una lnea de texto en un programa contiene lo que se conoce como unidades


lxicas, los que se clasifican como sigue:

Delimitadores (smbolos simples y compuestos)


Identificadores (incluye palabras reservadas)
Literales
Comentarios

Por ejemplo en la instruccin:

bonus := salary * 0.10; -- clculo del bono

Se observan las siguientes unidades lxicas:

Los identificadores bonus y salary


El smbolo compuesto :=
Los smbolos simples * y ;
El literal numrico 0.10
El comentario "clculo del bono"

Para asegurar la fcil comprensin del cdigo se pueden aadir espacios entre
identificadores o smbolos. Tambin es una buena prctica utilizar saltos de lnea
e indentaciones para permitir una mejor legibilidad.

11
Ejemplo:

IF x>y THEN max := x; ELSE max := y; END IF;

Puede reescribirse de la siguiente manera para mejorar el aspecto y legibilidad:

IF x > y THEN

max := x;

ELSE

max := y;

END IF;

Delimitadores e Identificadores

Un delimitador es un smbolo simple o compuesto que tiene un significado especial


dentro de PL/SQL. Por ejemplo, es posible utilizar delimitadores para representar
operaciones aritmticas, por ejemplo:

Smbolo Significado

+ operador de suma

% indicador de atributo

delimitador de caracteres

. selector de componente

/ operador de divisin

( expresin o delimitador de lista

12
) expresin o delimitador de lista

: indicador de variable host

, separador de tems

* operador de multiplicacin

" delimitador de un identificador entre comillas

= operador relacional

< operador relacional

> operador relacional

@ indicador de acceso remoto

; terminador de sentencias

- negacin u operador de substraccin

Los delimitadores compuestos consisten de dos caracteres, como por ejemplo:

Smbolo Significado

:= operador de asignacin

=> operador de asociacin

|| operador de concatenacin

13
** operador de exponenciacin

<< comienzo de un rtulo

>> fin de un rtulo

/* comienzo de un comentario de varias lneas

*/ fin de un comentario de varias lneas

.. operador de rango

<> operador relacional

!= operador relacional

^= operador relacional

<= operador relacional

>= operador relacional

-- comentario en una lnea

Los identificadores incluyen constantes, variables, excepciones, cursores,


subprogramas y paquetes. Un identificador se forma de una letra, seguida
opcionalmente de otras letras, nmeros, signo de moneda, underscore y otros
signos numricos.

La longitud de un identificador no puede exceder los 30 caracteres. Se


recomienda que los nombres de los identificadores utilizados sean descriptivos.

14
Algunos identificadores especiales, llamados palabras reservadas, tienen un
especial significado sintctico en PL/SQL y no pueden ser redefinidos. Son
palabras reservadas, por ejemplo, BEGIN, END, ROLLBACK, etc.

IDENTIFICADORES

Se utilizan identificadores para nombrar programas PLSQL, y unidades lo cual


incluye constantes, variables, exceptions, cursores, subprogramas, packages,
por ejemplo :

t2

v_nombre

v_costo

El identificador consiste de una letra seguida de manera opcional por, mas


letras, nmeros, signo de dollar, guin bajo.

EJEMPLO DE DECLARACIONES INCORRECTAS

Debe&pagar no vlido por el ampersand

Debe-pagar no vlido por el guin

Debe/pagar no vlido por el slash

Debe pagar no vlido por el espacio

Se pueden utilizar maysculas, minsculas, combinacin de ambas, ya que


PLSQL no es sensible al contexto.

Lastname

lastname

LASTNAME

En el ejemplo anterior PLSQL considera que es la misma variable.

15
El tamao de un identificador no puede exceder los 30 caracteres.

LITERALES

Una literal es un valor explcitico de tipo carcter, numrico, string o booleano no


representado por un identificador.

LITERALES NUMERICAS

Se pueden utilizar 2 clases de literales numricas en operaciones aritmticas,


integer y reales. Una literal de tipo integer tiene de manera opcional un signo y
no tiene punto decimal por ejemplo:

6 -13 0

Una literal real, es un entero con signo opcional, o un nmero fraccional con
punto decimal.

66.56 -50.89 .090

Las literales numricas no deben contener el signo de dollar o comas, pero se


puede utilizar notacin cientfica. Poniendo como sufijo el signo E o e seguido
de manera opcional por un entero con signo.

2e5 1.0e.-7 -1e38

LITERALES TIPO CARCTER

Una literal tipo carcter es un carcter individual encerrado por comillas simples
(apostrofes). Ejemplo:

PLSQL se vuelve sensitivo en el caso de literales tipo carcter. Por ejemplo


PLSQL considera a las literales z y Z como diferentes.

LITERALES TIPO CADENA

Un valor tipo carcter puede ser representado por un identificador o


explcitamente escrito como una cadena literal, que es una secuencia de cero o
ms caracteres encerrados por comillas simples. Ejemplo:

16
Hola Mundo

$100.00

02-ENE-06

Para representar una comilla simple dentro de una cadena se escriben 2


comillas simples dentro de la cadena. Ejemplo:

'hola' ' mundo cruel'

select 'hola ''mundo'' cruel' from dual;

PLSQL es sensitivo dentro de las literales de tipo cadena. Ejemplo:

baker

Baker son consideradas diferentes por PLSQL.

LITERALES BOOLEANAS

Son los valores predefinidos de TRUE, FALSE y NULL. Las literales booleanas
son valores no cadenas.

COMENTARIOS

PLSQL ignora los comentarios. Aadir comentarios a los programas proporciona


legibilidad y compresin.

Comentarios simples

Se utiliza -- (doble guin) al inicio de la lnea. Ejemplo:

SELECT count(valor) Cuenta todos los valores de la tabla

FROM contabilidad

WHERE cta = 1; --Slo para la cuenta 1

Comentarios multilnea

Inician con /* (diagonal asterisco) y terminan con */ , y se pueden expandir a


mltiples columnas. Ejemplo:

17
/* Cursor para validar el usuario */

CURSOR cur_user IS

SELECT user_id

FROM fnd_user

WHERE user_name = p_user_name;

/* Valida que todos los productos existan en la lista de precios del cliente */

OPEN cur_list_headers;

FETCH cur_list_headers INTO v_list_header_id;

IF cur_list_headers%FOUND THEN

DECLARACIONES

Los programas almacenan valores en variables y constantes. Cuando el


programa se ejecuta los valores de las variables pueden cambiar, pero los
valores de las constantes no.

Por default las variables se inicializan a NULL. Ejemplo :

Birthday DATE;

Birthday DATE := NULL;

En la declaracin de una constante se puede anteponer la palabra CONSTANT


al tipo de dato. Ejemplo:

limite_credito CONSTANT number := 500 000;

Utilizando DEFAULT

Se puede utilizar la palabra DEFAULT en vez de asignar el operador para


inicializar las variables. Ejemplo:

tipo_sangre char := O; se puede reescribir como

tipo_sangre char DEFAULT O;

18
Se utiliza DEFAULT para variables que tienen un valor tpico. El operador de
asignacin se utiliza para variables que tienen un valor no tpico (contadores,
acumuladores). Ejemplo:

Horas_trabajadas integer DEFAULT 40;

Contador number := 0;

Utilizando NOT NULL

Las variables definidas como NOT NULL no pueden tomar el valor de nulo. Si
esto sucede PLSQL dispara una exception de VALUE_ERROR. Ejemplo :

Acc_id INTEGER NOT NULL = 9999;

RESTRICCIONES EN LAS DECLARACIONES

En PLSQL se debe de declarar las variables o constantes antes de


referenciarlas. Por ejemplo la siguiente declaracin no es permitida :

Maxi integer := 2 *min;

min integer := 15;

PLSQL no permite el siguiente tipo de declaraciones :

I,j,k integer;

Por lo que la declaracin tiene que ser de la manera siguiente :

i integer;

j integer;

k integer;

PRECEDENCIA DE OPERADORES

La siguiente tabla muestra la precedencia de operadores de mayor a menor.

OPERACION
OPERADOR

19
** exponenciacin

+,- Identidad, negacin

*, / Multiplicacin, divisin

+, - , | | Suma, resta, concatenacin

=,<,>,<=,>=,<>,!=,IS NULL, LIKE Comparacin


,BETWEEN, IN

NOT Negacin lgica

And Conjuncin

OR Inclusin

Los operadores con alta precedencia se aplican primero. Ejemplo :

5 + 12/4 y 12/4 + 5, en ambos casos se obtiene 8

Para cambiar el sentido de la precedencia se utilizan parntesis. Ejemplo :

(8+6)/2 da como resultado 7

100 + (20/5 + (7-3)) da como resultado 108

OPERADORES LOGICOS

x Y x AND y x OR y NOT
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE FALSE TRUE FALSE
TRUE NULL NULL TRUE FALSE
FALSE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE TRUE
FALSE NULL FALSE NULL TRUE
NULL TRUE NULL TRUE NULL
NULL FALSE FALSE NULL NULL
NULL NULL NULL NULL NULL

OPERADORES RELACIONALES

20
Los operadores relacionales permiten comparar expresiones complejas.

OPERADOR SIGNIFICADO
= Igual a
!=,<>,^=, No igual a
< Menor que
> Mayor que
<= Menor o igual
>= Mayor o igual

OPERADOR IS NULL

El operador IS NULL retorna un valor booleano TRUE si el operando es NULL o


FALSE si el operando no es NULL. Ejemplo :

IF variable IS NULL THEN..

OPERADOR LIKE

Se utiliza para comparar cadenas, caracteres de acuerdo a un patrn. LIKE


devuelve el valor booleano TRUE, si el patrn hace match y FALSE en caso
contrario.

Los patrones comparados por LIKE pueden incluir 2 caracteres de propsito


especial llamados wildcard. El guin bajo (_) que hace match con exactamente
un carcter y el signo de % que hace match con cero o ms caracteres.

OPERADOR BETWEEN

EL operador BETWEEN examina si los valores estn dentro de un rango.


Ejemplo :

Val1 between 1 and 30

OPERADOR IN

Examina un conjunto de miembros. Esto hace igual a alguno de los miembros. El


conjunto puede contener nulos, pero estos son ignorados. Ejemplo :

Where nombre in (LUIS,MARIO,CLAUDIA)

OPERADOR CONCATENACION

21
Dos barras verticales | | sirven como operador de concatenacin los cuales
aaden una cadena a otra. Ejemplo :

CURSO|| ||DE PLSQL Da como resultado


CURSO DE PLSQL

CURSORES

Para procesar un una orden SQL, Oracle asigna un rea de memoria que recibe
el nombre de rea de contexto. Esta rea contiene informacin sobre el
procesamiento, como el nmero de filas procesadas por la orden y en caso de
consultas el conjunto activo, que es el conjunto de filas resultado de la consulta.

Un cursor es un puntero al rea de contexto. Mediante un cursor, un programa


PLSQL puede controlar el rea de contexto, se utiliza un cursor, por ejemplo,
para procesar las distintas filas de datos que devuelva una consulta.

PLSQL utiliza 2 tipos de cursores, implcitos y explcitos. El servidor de Oracle


usa cursores implcitos para analizar y ejecutar las rdenes SQL.
Los cursores explcitos se declaran por el programador explcitamente.

CURSORES IMPLICITOS

Todas las rdenes SQL se ejecutan dentro de un rea de contexto y tienen, por
tanto, un cursor asociado. Este cursor se conoce con el nombre de cursor SQL y
sirve para procesar las rdenes INSERT, UPDATE, DELETE, y las rdenes
SELECT-INTO de una sola fila. Este se abre y se cierra automticamente, sin
embargo se puede acceder a sus atributos.

CURSORES EXPLICITOS

Los cuatro pasos PLSQL necesarios para el procesamiento de un cursor


explcito son :

1. Declaracin del cursor.


2. Apertura del cursor para una consulta.
3. Recogida de los resultados en variables PLSQL
4. Cierre del cursor.

La declaracin del cursor es el nico paso que se lleva a cabo en la seccin


declarativa de un bloque.

Declaracin del cursor

Define su nombre y asocia el cursor con una orden SELECT. La sintaxis es :

22
CURSOR nombre_cursor IS orden SELECT;

Una declaracin de cursor puede hacer referencia a variables PLSQL en la


clusula WHERE, cumplindose las reglas de mbito y visibilidad conocidas.

Apertura de un cursor

La sintaxis para abrir un cursor es:

OPEN nombre_cursor;

Al abrir un cursor suceden tres cosas:

Se examinan los valores de la variables acopladas


Se determina el conjunto activo
Se hace apuntar el puntero del conjunto activo a la primara fila.

Se puede reabrir un cursor que ya estaba abierto, PLSQL ejecutar


implcitamente una orden CLOSE antes de reabrirlo. Tambin se pueden tener
varios cursores abiertos al mismo tiempo.

Extraccin de los datos de un cursor

La clusula INTO de la consulta se incluye en la orden FETH. Esta orden tiene


dos formas posibles:

FETCH nombre cursor INTO lista_variables;


FETCH nombre cursor INTO registro;

Despus de cada FETCH, se incrementa el punto del conjunto activo para que
apunte a la siguiente fila. De esta forma con un bucle cada FETCH devolver
filas sucesivas del conjunto activo.

Cierre de un cursor

Cuando se ha terminado de extraer el conjunto activo, debe cerrarse el cursor.


La sintaxis para el cierre de cursor es:

CLOSE nombre_cursor;

Atributos de los cursores

23
Existen cuatro atributos en PLSQL que pueden aplicarse a los cursores para
obtener valores sobre ellos. Los atributos son %FOUND, %NOTFOUND,
%ISOPEN, y %ROWCOUNT.

Cursores parametrizados

Permiten utilizar la orden OPEN para enviar las variables de acoplamiento en un


cursor.

CURSOR c_students (v_major students.major%TYPE) IS


SELECT id,first_name,last_name
FROM students
WHERE major = v_major;

/* Se utiliza la orden OPEN para enviar el valor de v_major */

OPEN c_students(Computer science);


Uso_cursor.sql

ESTRUCTURAS DE CONTROL

De acuerdo al teorema de estructura, cualquier programa de computadora


puede ser escrito usando el control bsico de estructuras. Estas pueden ser
combinadas de forma necesaria para dar la solucin a un problema.

24
`

25
Sentencia CASE

Como la sentencia IF, la sentencia CASE selecciona una secuencia de


sentencias para ejecutar. Sin embargo, para seleccionar la secuencia, la
sentencia CASE utiliza un rango de seleccin de mltiples expresiones
bolanos.

Ejemplo de sentencia IF y sentencia CASE

Consideremos el siguiente ejemplo de sentencias:

26
Utilizando la sentencia CASE

La sentencia CASE es ms legible y ms eficiente. As es que cuando sea


posible, se puede reescribir una escala IF-THEN-ELSE en una sentencia CASE.

Esta sentencia iniciaron la palabra CASE. La palabra es seguida por un selector,


el selector puede tan sencillo o tan complejo como se desee. La expresin del
selector se evala solo una vez.

El selector es seguido por una o ms clusulas WHEN, las cuales se checan


secuencialmente. El valor del selector determina que clusula se ejecuta. Si el
valor del selector es igual al valor de WHEN , entonces la clusula WHEN se
ejecuta.

Cuando sea posible, utilizar la clusula ELSIF en lugar de IF anidados. Esto


hace que el cdigo sea ms fcil de leer y entender. Ejemplo:

27
IF condicion1 THEN IF condicion1 THEN
Sentencia1; sentencia1;
ELSE ELSIF condicion2 THEN
IF condicion2 THEN sentencia2;
Sentencia2; ELSIF condicion3 THEN
ELSE sentencia3;
IF condicion3 THEN END IF;
Sentencia3;
END IF;
END IF;
END IF;

CONTROL ITERATIVO

28
Bucle_basico.sql

29
EXIT

La sentencia EXIT forza al loop a completarse de manera incondicional. Cuando


la sentencia EXIT es encontrada, el loop completa inmediatamente y pasa el
control a la siguiente sentencia.

LOOP

IF credit_rating < 3 THEN



EXIT; --Sale inmediatamente del loop

END IF;

END LOOP;
--El control continua aqu.

EXIT-WHEN

30
La sentencia EXIT-WHEN permite al loop completar condicionalmente. When la
se encuentra la sentencia EXIT, la condicin en la clusula WHEN se evala. Si
la condicin es TRUE, el loop se completa y el control pasa a la siguiente
sentencia despus del loop. Ejemplo:

LOOP
FETCH c1 INTO
EXIT WHEN c1%NOTFOUND; --Sale del loop si la condicin es TRUE

END LOOP;
Close c1;
Ex_when.sql

Ejemplo:

31
Uso_while_loop.sql

32
33
FOR i in reverse 1..12 loop

End loop;

34
MANEJO DE ERRORES

En PL/SQL una advertencia o condicin de error es llamada una excepcin.


Estas pueden ser definidas en forma interna (en tiempo de ejecucin de un
programa) 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 condiciones excepcionales tienen sus nombres propios
y pueden ser referenciadas con ellos: zero_divide y storage_error.

Cuando ocurre un error se alcanza la excepcin, esto quiere decir que se


ejecuta la porcin del programa donde sta se encuentra implementada,
transfirindose el control a ese bloque de sentencias. 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 desde el momento en que permite mantener las
rutinas correspondientes al tratamiento de los errores en forma separada de la
lgica del negocio.

35
Excepciones predefinidas

Las excepciones predefinidas no necesitan ser declaradas. Simplemente se


utilizan cuando estas son disparadas por algn error determinado.

La siguiente es la lista de las excepciones predeterminadas por PL/SQL y una


breve descripcin de cundo son accionadas:

36
Nombre Excepcin Accionada cuando SQLCODE

ACCESS_INTO_NULL El programa intent -6530


asignar valores a los
atributos de un objeto no
inicializado

COLLECTION_IS_NULL El programa intent -6531


asignar valores a una tabla
anidada an no inicializada

CURSOR_ALREADY_OPEN El programa intent abrir -6511


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

DUP_VAL_ON_INDEX El programa intent -1


almacenar valores
duplicados en una
columna que se mantiene
con restriccin de
integridad de un ndice
nico (unique index)

INVALID_CURSOR El programa intent -1001


efectuar una operacin no
vlida sobre un cursor

INVALID_NUMBER En una sentencia SQL, la -1722


conversin de una cadena
de caracteres hacia un
nmero falla cuando esa
cadena no representa un
nmero vlido

LOGIN_DENIED El programa intent -1017


conectarse a Oracle con
un nombre de usuario o
password invlido

NO_DATA_FOUND Una sentencia SELECT +100 37


INTO no devolvi valores o
el programa referenci un
elemento no inicializado en
Excepciones definidas por el usuario

PL/SQL permite al usuario definir sus propias excepciones, las que debern ser
declaradas y disparadas explcitamente utilizando otros comandos del lenguaje.

Declaracin

Las excepciones slo pueden ser declaradas en el segmento "Declare" de un


bloque, subprograma o paquete. Se declara una excepcin escribiendo su
nombre seguida de la palabra clave EXCEPTION. Las declaraciones son
similares a las de variables, pero recuerde que una excepcin es una condicin
de error, no un tem de datos. Aun as, las mismas reglas de alcance aplican
tanto sobre variables como sobre las excepciones.

Reglas de Alcance

Una excepcin no puede ser declarada dos veces en un mismo bloque. Tal
como las variables, una excepcin declarada en un bloque es local a ese bloque
y global a todos los sub-bloques que comprende.

La sentencia "RAISE"

La sentencia RAISE permite disparar una excepcin en forma explcita. Es


factible utilizar esta sentencia en cualquier lugar que se encuentre dentro del
alcance de la excepcin.

38
Finalmente, cabe destacar la existencia de la excepcin OTHERS, que simboliza
cualquier condicin de excepcin que no ha sido declarada. Se utiliza
comnmente al final del bloque de excepciones para absorber cualquier tipo de
error que no ha sido previsto por el programador. En ese caso, es comn
observar la sentencia ROLLBACK en el grupo de sentencias de la excepcin o

39
alguna de las funciones SQLCODE SQLERRM, que se detallan en el prximo
punto.

Uso de SQLCODE y SQLERRM

Al manejar una excepcin es posible apoyarse con las funciones predefinidas


SQLCode y SQLErrm para aclarar al usuario la situacin de error acontecida.

Sqlcode siempre retornar el nmero del error de Oracle y un "0" (cero) en caso
exitoso al ejecutarse una sentencia SQL.

Por otra parte, Sqlerrm retornar el correspondiente mensaje de error para la


situacin ocurrida. Tambin es posible entregarle a la funcin SQLERRM un
nmero negativo que represente un error de Oracle y sta devolver el mensaje
asociado.

Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones,


para aclarar el significado de la excepcin OTHERS, cuando sta ocurre.

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.

40
41
42
43
44
45
46
47
48
49