PDF Manual PLSQL Basico Compress
PDF Manual PLSQL Basico Compress
PL/SQL
Básico
INTRODUCCIÓN
Prólogo
PL/SQL, bajo este nombre se esconde el Lenguaje de manipulación de
datos propietario de Oracle. Conceptualmente, Oracle lo define como
una extensión procedimental del SQL… en realidad, y para entenderlo
mejor, se trata de un potente lenguaje de acceso a Bbdd, mediante el cual
podemos estructurar y controlar las sentencias SQL que definamos para
nuestra Bbdd.
PL/SQL sigue la filosofía de los modernos lenguajes de programación,
es decir, permite definir y manipular distintos tipos de datos, crear
procedimientos, funciones, contempla recursividad, etc… Quizás la
diferencia más importante, y algo que debemos tener siempre muy en
cuenta, es que la eficiencia de un programa en PL/SQL se mide sobre
todo por la eficiencia de los accesos a Bbdd.
La consecuencia más inmediata de lo dicho anteriormente, es que para
poder programar de manera óptima en PL/SQL, se debe tener un
dominio notable del propio SQL; cumpliendo esta premisa, y algunas
otras que veremos más adelante, obtendremos una mejora sustancial en
nuestras aplicaciones que interactuen con Bbdd.
ÍNDICE
INTRODUCCIÓN.................................................................3
......................................................................................................... 3
Prólogo...............................................................................................................
Prólogo......
ÍNDICE ..............................................................................4
FICHA INFORMATIVA DEL MÓDULO. ..........
...............
.........
.........
..........
.........
...... 6
Nombre .............................................................................................................. 6
Nombre..............................................................................................................
Meta .................................................................................................................... 6
Requisitos del alumno ...................................................................................... 6
Bibliografía......................................................................................................... 6
1 UNIDAD 4:INTRODUCCIÓN A PL/SQL
PL/SQL.....
.........
.........
.........
.........
.........
...... 7
Objetivo general de la unidad ......................................................................... 7
Objetivos específicos........................................................................................ 7
Contenidos......................................................................................................... 7
notas ............................................................................................ 8
Cuaderno de notas............................................................................................
1.1 Introducción.................... ........................................................................... 10
Introducción...............................................................................................
Datos...................................................................... ..................... 16
1.2 Tipos de Datos...........................................................................................
1.4 Ám
Ámbito
bito y Visibilidad.................................................................................. 32
Visibilidad..................................................................................
1.5 Asignaciones ............................................................................................... 34
Asignaciones...............................................................................................
1.6 Ex
Expresiones
presiones y Co mparaciones................................................................. 35
Comparaciones.................................................................
1.7 Funciones Soportadas ............................................................................... 39
Soportadas...............................................................................
2 UNIDAD 5:ESTRUCTURAS DE CONTROL .....
..........
..........
..........
..........
..... 41
Objetivo general de la unidad ....................................................................... 41
Objetivos específicos...................................................................................... 41
Contenidos....................................................................................................... 41
notas .......................................................................................... 42
Cuaderno de notas..........................................................................................
2.1 Introducción.................... ........................................................................... 44
Introducción...............................................................................................
2.2 Control Condicional.................................................................................. 44
4.4 Ex
Excepciones
cepciones definidas por el usuar usuario io ..................................................... 82
5 UNIDAD 8: SUBPROGRAMAS Y PACKAGES ...................
........................
..... 88
Objetivo general de la unidad ....................................................................... 88
Objetivos específicos...................................................................................... 88
Contenidos....................................................................................................... 88
notas .......................................................................................... 89
Cuaderno de notas..........................................................................................
5.1 Ventajas de los subprogramas.................................................................. 91
5.4 Concep
Concepto
to ddee Package y def inición .......................................................... 93
definición
5.5 Ventajas de los Packages........................................................................... 96
6 A NEXO
A NEXO 3:E JERCICIOS.....................
.........................................
................................
............ 98
6.1 Ejercicios de la Unidad
Ejercicios Unidad 4.................. ........................................................ 98
4..........................................................................
6.2 Ejercicios de la Unidad 5.................. ...................................................... 104
5........................................................................
6.3 Ejercicios de la Unidad 6.................. ...................................................... 106
6........................................................................
6.4 Ejercicios de la Unidad 7.................. ...................................................... 108
7........................................................................
6.5 Ejercicios de la Unidad 8.................. ...................................................... 108
8........................................................................
Nombre
PL/SQL Básico
Meta
Que el Alumno adquiera los conocimientos básicos sobre estructuras
de datos y sentencias, necesarios para el desarrollo de aplicaciones que
llamen a subprogramas PL/SQL en el acceso a Bbdd.
Bibliografía
PL/SQL User’s Guide and Reference, y varios artículos sobre
PL/SQL obtenidos de Internet.
1 UNIDAD 4:INTRODUCC
NTRODUCCIÓN
IÓN A
PL/SQL
Objetivos específicos
Conocer los tipos de datos soportados por PL/SQL, así como la
sintaxis básica de las sentencias que utiliza.
Contenidos
Introducción
Tipos de Datos
Declaraciones
Ámbito y Visibilidad
Visibilidad
Asignaciones
Expresiones y Comparaciones
Funciones Soportadas
Cuaderno de notas
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
1.1 Introducción
Cuando escribimos un programa en PL/SQL, utilizamos un conjunto
específico de caracteres. El conjunto de caracteres soportado es el
siguiente:
• Los caracteres mayúsculas y minúsculas A … Z, a … z
• Los números 0 … 9
• Literales
• Comentarios
Por ejemplo, la siguiente sentencia:
bonificacion := salario * 0.10; -- Cálculo de Bonus
contiene las siguientes unidades léxicas:
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
IF x>y THEN
max:=x;
ELSE
max:=y;
END IF;
1.1.2 Delimitadores
Un delimitador es un símbolo simple o compuesto, que tiene un
significado especial en PL/SQL.
Veamos cada uno de los tipos.
1.1.2.1
Símbolos simples
La lista y significado de los símbolos simples son los siguientes:
+ Operador de suma
% Indicador de Atributo
‘ Carácter delimitador de String
. Selector
/ Operador de división
( Expresión o delimitador de lista
) Expresión o del
delimitador
imitador de lista
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
1.1.3 Identificadores
Los identificadores se utilizan para dar nomenclatura a unidades e
items de un programa PL/SQL, el cual puede incluir constantes,
variables, excepciones, cursores, cursores con variables, subprogramas y
packages.
Un identificador consiste en una letra seguida, de manera opcional, de
más letras, números, signos de dólar, underscores, y signos numéricos.
Algunos caracteres como
como % - / y espacios son
son ilegales.
Ejemplo:
mi_variable -- Identificador legal
mi variable -- Identificador Ilegal
mi-variable -- Identificador Ilegal
Se pueden usar mayúsculas, minúsculas, o mezcla de ambas… ya
hemos comentado que PL/SQL no es ‘case sensitive’, con lo cual no las
diferenciará, exceptuando el caso en que estemos ante tratamiento de
Strings, o bien literales de un solo carácter.
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE
end BOOLEAN; -- Ilegal
DECLARE
end_film BOOLEAN; -- Legal
1.1.3.2
Identificadores Predefinidos
Los identificadores globales declarados en el package STANDAR,
como por ejemplo la excepción INVALID_NUMBER, pueden ser
redeclarados… sin embargo, la declaración de identificadores
predefinidos es un error, puesto que las declaraciones locales prevalecen
sobre las globales.
1.1.3.3 Identificadores con Comillas Dobles
Por Flexibilidad, PL/SQL permite incluir identificadores con dobles
comillas. Estos identificadores no son necesarios muy a menudo, pero a
veces pueden ser de gran
gran ayuda.
Pueden contener cualquier secuencia de caracteres, incluyendo
espacios, pero excluyendo las comillas dobles. Veamos algunos ejemplos:
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
“X+Y”
“ultimo nombre”
“switch on/off”
1.1.4 Literales
Un literal es un valor explícito de tipo numérico, carácter, string o
booleano, no representado por un identificador. El literal numérico 147,
y el literal booleano FALSE, son ejemplos de esto.
1.1.4.1 Literales Numéricos
Podemos utilizar dos clases de literales numéricos en expresiones
aritméticas: enteros y reales.
Un literal Entero, es un número Entero, al que podemos
opcionalmente poner signo. Ejemplos:
30, 6, -14, 0, +32000, …
Un literal Real, es un número Entero o fraccional, con un punto
decimal. Ejemplos son:
6.667, 0.0, -12.0, +86.55, …
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL considera como reales a los números de este tipo 12.0, 25. ,
aunque tengan valores enteros. Es muy importante tener esto en cuenta,
básicamente porque debemos evitar al máximo trabajar con reales si
podemos hacerlo con enteros, ya que eso disminuye la eficiencia
de nuestro programa.
Los literales numéricos no pueden tener los signos dólar o coma, sin
embargo, pueden ser escritos en notación científica. Ejemplo:
2E5, 1.0E-7, …
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
1.1.5 Comentarios
El compilador de PL/SQL ignora los comentarios, sin embargo
nosotros no debemos hacerlo. La inserción de comentarios es muy útil a
la hora de entender un programa.
PL/SQL soporta dos tipos de comentarios: los de una línea, y los de
múltiples líneas.
1.1.5.1 Comentarios de una línea
Se definen mediante dos signos menos consecutivos (--), que se ponen
al principio de la línea a comentar… a partir de ahí, y hasta la línea
siguiente, se ignora todo. Ejemplo:
-- Comienzo mi Select
SELECT * FROM mitabla
mit_mitkey=p_codigo ; -- Solo los de mi código
WHERE mit_mitkey=p_codigo
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE
SUBTYPE Acumulador IS NUMBER;
cantidad NUMBER(7,2);
total Acumulador;
BEGIN
…
total := cantidad;
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
Bin_Int
Bin_Int Char Datee
Dat Longg
Lon Number
Number Pls_Int
Pls_Int Raw Rowid Varchar
Varchar22
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
Varchar2 X X X X X X X X
1.3 Declaraciones
En PL/SQL se pueden declarar tanto constantes como variables;
recordemos que las variables pueden cambiar en tiempo de
ejecución, mientras que las constantes permanecen con el mismo
valor de forma continua.
Se pueden declarar constantes y variables en la parte de declaración de
cualquier bloque PL/SQL, subprograma, o package. Las declaraciones
reservan espacio para un valor en función de su tipo.
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
La declaración
inicialización. utilizando
Veamos %TYPE, puede incluir una claúsula de
un ejemplo:
balance NUMBER(7,2);
balance_minimo balance%TYPE := 10.00;
De todas formas, el uso de %TYPE es especialmente útil en el caso de
definir variables que sean del tipo de una columna de la Bbdd. Veamos
un ejemplo:
el_nombre globalweb.usuarios.usu_nomusu%TYPE;
Fijémonos en que la utilización de este tipo de declaración tiene dos
claras ventajas: por un lado no es necesario conocer el tipo de dato
que tiene la columna de la tabla, y por otro, si cambiamos el tipo de
dato de la columna, no deberemos modificar el PL/SQL .
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE
emp_rec emp%ROWTYPE;
…
BEGIN
SELECT * INTO emp_rec
FROM emp
WHERE ROWNUM=1;
…
END;
Para referenciar los valores almacenados en un registro, utilizaremos la
notación siguiente:
nombre_registro.nombre_campo
Por ejemplo, en el caso anterior referenciaríamos al campo nombre de
la siguiente manera:
IF emp_rec.emp_nomemp='Perico' THEN …
DECLARE
dept_rec1 dept%ROWTYPE;
dept_rec2 dept%ROWTYPE;
CURSOR c1 IS
SELECT num_dept, nom_dept, dir_dept
FROM dept;
dept_rec3 c1%ROWTYPE;
BEGIN
…
dept_rec1 := dept_rec2;
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
FROM dept
WHERE num_dept=30;
…
END;
Sin embargo, no se puede asignar una lista de valores de columnas a un
registro utilizando una sentencia de asignación. Por lo tanto, la siguiente
sentencia no es válida:
nombre_registro := (valor1, valor2, valor3, …); -- No Válido…
Por último, decir que aunque podemos recuperar registros de forma
completa, no podemos realizar inserts o updates utilizando los mismos.
Veamos un ejemplo:
ejemplo:
INSERT INTO dept VALUES (dept_re
(dept_rec);
c); -- No Válido…
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
mi_rec mi_cursor%ROWTYPE;
BEGIN
OPEN mi_cursor;
LOOP
FETCH mi_cursor INTO mi_rec;
EXIT WHEN mi_cursor%NOTFOUND;
mi_cursor%NOTFOUND;
IF mi_rec.wages>2000 THEN
INSERT INTO temp VALUES (NULL, mi_rec.wages,
mi_rec.nom_emp);
END IF;
END LOOP;
CLOSE mi_cursor;
END;
1.3.5 Restricciones
PL/SQL no permite referencias de tipo forward , es decir, se debe
crear una variable o constante antes de referenciarla en otras sentencias,
incluyendo las sentencias de tipo declaración. Veamos un ejemplo:
maxi INTEGER := 2*mini; -- No válido…
mini INTEGER := 15;
Sin embargo, PL/SQL sí que permite la declaración de tipo
forward para
para subprogramas.
Otra
este tipo:restricción de PL/SQL, es que no permite una declaración de
i, j, k SMALL
SMALLINT;
INT; -- No válido…
Debemos declararlo de la siguiente manera:
i SMALLINT;
j SMALLINT;
k SMALLINT;
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
incluyendo exceptiones,
variables, esto a las constantes, variables,
procedimientos, cursores,
funciones cursores con
y packages. Los
nombres pueden ser: simples, referenciando a un usuario o package
(lo llamaremos qualified ),
), remotos, o bien uniendo qualified y el
hecho de que sea remoto. Por ejemplo, podemos usar el
procedimiento llamado calcular_salario, de cualquiera de las siguientes
formas:
calcular_salario( … ); -- Simple
acciones_emp.calcular_salario(
acciones_emp.calcular_salario( … ); -- Qualified
calcular_salario@bbdd_remota(
calcular_salario@bbdd_remota( … ); -- Remota
salario@bbdd_remota( … ); -- Qualified y Remota…
acciones_emp.calcular_salario@bbdd_remota(
acciones_emp.calcular_
En el primer caso, simplemente llamamos al procedimiento que se
encuentra en nuestro usuario. En el segundo, utilizamos la notación del
punto, puesto que el procedimiento se encuentra almacenado en el
Package llamado acciones_emp. En el tercero, llamamos al
procedimiento que se encuentra almacenado en una Bbdd remota, a la
que hemos llamado bbdd_remota. En último lugar, llamamos a un
procedimiento que se encuentra en la bbdd_remota, y además contenido
en el package acciones_emp.
1.3.7 Sinónimos
Se pueden crear sinónimos para proporcionar transparencia en el
acceso a un esquema remoto de sus tablas, secuencias, vistas,
subprogramas y packages. Sin embargo, y como es lógico, no podemos
crear sinónimos para los objetos declarados en subprogramas o
packages; esto incluye constantes, variables, cursores, cursores con
variables, excepciones y procedures de un package (de form
formaa individual).
1.3.8 Ámbito
En el mismo ámbito, todos los identificadores que se declaren deben
ser únicos. Por lo tanto, e incluso aunque sus tipos difieran, las variables
y parámetros no pueden tener el mismo nombre. Veamos un par de
ejemplos:
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE
id_valido BOOLEAN;
id_valido VARCHAR2(5); -- No válido, nombre repetido…
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE DECLARE
X REAL; X REAL;
BEGIN BEGIN
...
.. . ...
X Exterior DECLARE DECLARE
X REAL; X REAL;
BEGIN BEGIN
... ..
....
END; END;
...
.. . ...
END; END;
DECLARE DECLARE
BEGIN
X REAL; BEGIN
X REAL;
... ...
X Interior DECLARE DECLARE
X REAL; X REAL;
BEGIN BEGIN
...
.. . ..
....
END; END;
... ...
END; END;
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
DECLARE
a CHAR;
b REAL;
BEGIN
-- Identificadores accesibles aquí: a (CHAR), b
DECLARE
a INTEGER;
c REAL;
BEGIN
-- Identificadores accesibles aquí: a (INTEGER), b, c
END;
…
END;
Si quisiéramos referenciar a identificadores del mismo ámbito, pero
más externos, deberíamos utilizar etiquetas. Veamos un ejemplo de esto:
<<externo>>
DECLARE
cumple DATE;
BEGIN
DECLARE
cumple DATE;
BEGIN
…
IF cumple = exterior.cumple THEN …
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
1.5 Asignaciones
Las variables y constantes se inicializan cada vez que se entra en un
bloque o subprograma. Por defecto, las variables se inicializan a NULL,
por lo tanto,
variable a menos. Veamos
es indefinido que se leunasigne expresamente, el valor de una
caso curioso:
DECLARE
contador INTEGER;
…
BEGIN
contador := contador+1; -- Contador sigue valiendo NULL…
…
END;
Efectivamente, la suma de NULL+1 es siempre NULL, la asignación
debe
la cualrealizarse
uno dede manera expresa. Ensea
los operandos general,
NULL, cualquier operación un
nos devolverá en
NULL… es algo que deberemos tener muy en cuenta.
Lo que siga al operador de asignación, puede ser tanto un valor simple
(literal numérico), como una expresión compleja… lo único que
debemos tener siempre en cuenta es que debe tratarse de un valor del
mismo tipo, o por lo menos convertible de forma implícita.
…
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
variable NUMBER(7,2);
BEGIN
…
SELECT nom_emp, sal+com INTO mi_nomemp, variable
FROM emp
WHERE num_emp=mi_numemp;
Sin embargo, no podemos seleccionar valores de una columna en una
variable de tipo BOOLEAN.
1.6
Expresiones y Comparaciones
Las expresiones se construyen utilizando operandos y operadores. Un
operando es una variable, constante, literal, o una llamada a una función,
que contribuye con un valor a la expresión. Un ejemplo de una expresión
aritmética simple sería:
-x / 2 + 3
Los operadores unarios, como por ejemplo la negación (-), actúan
sobre un operando, mientras que los binarios, como la división, lo
hacen sobre dos operandos. PL/SQL no soporta operadores ternarios.
PL/SQL evalúa una expresión mediante la combinación de los valores
de los operandos, y la prioridad de los operadores. Veremos esto más en
detalle en los siguientes apartados.
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
OR Disyunción
Los operadores que tienen más prioridad se ejecutan en primer lugar.
Cuando los operadores tienen la misma prioridad, se ejecutan en
cualquier orden.
Si se desea controlar el orden de ejecución, se deberá utilizar paréntesis
para indicarlo.
x y x AND y x OR y NOT x
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE FALSE TRUE
TRUE NULL NULL TRUE
FALSE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE
FALSE NULL FALSE NULL
NULL TRUE NULL TRUE NULL
NULL FALSE FALSE NULL
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
Operador Significado
= Igual a…
<>, !=, ~= Diferente a…
< Menor que…
> Mayor que…
<= Menor o igual a…
>= Mayor o igual a…
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
IF variable = NULL
NULL THEN … -- Jamás debemos utilizarlo
En lugar de esto, debemos escribir…
IF variable IS NULL THEN …
1.6.3.5 Operador IN
El operador IN, comprueba si un valor pertenece a un conjunto. El
significado literal sería ‘igual a cualquier miembro de…’.
El conjunto de valores puede contener nulos, pero son ignorados. Por
ejemplo, la siguiente sentencia no borraría los registros de la tabla que
tuvieran la columna nom_emp a null.
DELETE FROM emp WHERE nom_emp IN (NULL, ’PEPE’,
’PEDRO’);
Es más, expresiones del tipo
valor NOT IN conjunto
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
• numéricas
• carácter
• conversión
• fecha
• misceláneas
PL/SQL Básico
Unidad 4: Introducción a PL/SQL
POWER NLS_UPPER
ROUND NLSSORT
SIGN REPLACE
SIN RPAD
SINH RTRIM
SQRT SOUNDEX
TAN SUBSTR
TANH SUBSTRB
TRUNC TRANSLATE
UPPER
2 UNIDAD 5:ESTRUCTURAS DE
CONTROL
Objetivos específicos
Que el alumno conozca y sepa utilizar en el momento adecuado, todas
las estructuras de control aportadas por PL/SQL.
Contenidos
Introducción
Control Condicional
Control Iterativo
Control Secuencial
Cuaderno de notas
PL/SQL Básico
Unidad 5 Estructuras de Control
2.1 Introducción
Cualquier programa puede ser escrito utilizando las siguientes
estructuras de control básicas.
T F F
2.2.1 IF-THEN
Es la forma más sencilla de una sentencia IF. Asocia una secuencia de
sentencias a una condición. Veamos un ejemplo:
IF condicion THEN
secuencia_de_sentencias;
END IF;
PL/SQL Básico
Unidad 5: Estructuras de Control
2.2.2 IF-THEN-ELSE
Esta segunda variedad añade la palabra clave ELSE, seguida de un
conjunto de sentencias. Veamos un ejemplo:
IF condicion THEN
secuencia_1;
ELSE
secuencia_2;
END IF;
Si la condición es TRUE, se ejecutará la secuencia de instrucciones 1,
en caso contrario se ejecutará la 2.
Las claúsulas THEN y ELSE pueden incluir sentencias IF, es decir,
podemos agrupar sentencias de tipo IF. Veamos un ejemplo:
IF tipo_transaccion = ‘CR’ THEN
UPDATE cuentas SET balance=balance+credito WHERE…
ELSE
IF nuevo_balance >= balance_minimo THEN
UPDATE cuentas SET balance=balance-debito WHERE…
ELSE
RAISE fondos_insuficientes;
END IF;
END IF;
2.2.3 IF-THEN-ELSIF
Como hemos visto, podemos agrupar sentencias de tipo IF… sin
embargo, nos podemos encontrar el caso en que existan muchas posibles
alternativas a evaluar, y para cada ELSE tendríamos que abrir una
PL/SQL Básico
Unidad 5: Estructuras de Control
secuencia_1;
ELSIF condicion2 THEN
secuencia_2;
ELSE
secuencia_3;
END IF;
De esta manera, podemos evaluar tantas como queramos, y sólo
deberemos cerrar una sentencia IF con el END IF correspondiente. La
última sentencia ELSE se ejecutará cuando no se cumpla ninguna de las
anteriores, aunque si no queremos ponerla, pues no pasa nada.
Podemos agrupar tantos ELSIF como deseemos si ningún tipo de
problema.
Para entender mejor la utilidad de ELSIF, vamos a ver dos ejemplos,
en el primero programaríamos las condiciones utilizando sentencias IF-
THEN-ELSE normales, mientras que en el segundo utilizaríamos
ELSIF… así podremos apreciar realmente lo que ganamos en cuanto a
comodidad y a facilidad de lectura e interpretación posterior.
PL/SQL Básico
Unidad 5: Estructuras de Control
2.3.1 LOOP
Se trata de la variedad más simple de la sentencia LOOP, y se
corresponde con el bucle básico (o infinito), el cual incluye una secuencia
de sentencias entre las palabras claves LOOP y END LOOP. Veamos
un ejemplo
LOOP
secuencia_de_sentencias;
END LOOP;
En cada iteración del bucle, se ejecutan todas las sentencias de forma
secuencial. Evidentemente es raro que deseemos tener un bucle infinito
en un programa, por tanto existe una manera de forzar la salida, y es la
utilización de la palabra clave EXIT. Para esta palabra también tenemos
dos variedades posibles: EXIT y EXIT-WHEN. Vamos a verlas en
detalle.
2.3.1.1 EXIT
La sentencia EXIT provoca la salida de un bucle de forma
incondicional. Cuando se encuentra un EXIT, el bucle acaba
inmediatamente y el control pasa a la siguiente instrucción que esté fuera
del bucle. Veamos un ejemplo:
LOOP
…
IF limite_credito < 3 THEN
…
EXIT; -- Fuerza la salida inmediata…
END IF;
END LOOP;
-- El control pasaría a esta instrucción…
PL/SQL Básico
Unidad 5: Estructuras de Control
2.3.1.2 EXIT-WHEN
La sentencia EXIT-WHEN, nos va a permitir salir de un bucle de
forma condicional. Cuando PL/SQL encuentra una sentencia de este
tipo, la condición del WHEN será evaluada… en caso de devolver
TRUE, se provocará la salida del bucle… en caso contrario, se
continuará la iteración. Veamos un ejemplo:
LOOP
FETCH c1 INTO …
EXIT WHEN c1%NOTFOUND; -- Salir si se ccumple
umple la condición
…
END LOOP;
CLOSE c1;
De forma parecida a lo que ocurría con los IF y los ELSIF, también
podríamos controlar la salida de un bucle de otra forma, y no mediante
un EXIT-WHEN… lo que ocurre es que, al igual que en el caso anterior,
la utilización de esta sentencia facilitará la programación y lectura de
nuestro código. Veamos un ejemplo:
PL/SQL Básico
Unidad 5: Estructuras de Control
PL/SQL Básico
Unidad 5: Estructuras de Control
2.3.2 WHILE-LOOP
La sentencia WHILE-LOOP, asocia una condición a una secuencia de
instrucciones que se encuentran entre las palabras claves LOOP y END
LOOP. Veamos un ejemplo:
WHILE condicion LOOP
secuencia_de_instrucciones;
END LOOP;
Antes de cada iteración del LOOP, la condición se evalúa… si
devuelve TRUE se continúa iterando, en caso de que devuelva FALSE o
NULL, se forzará la salida del bucle.
El número de iteraciones depende de la condición, y es desconocido
hasta que el bucle termina. Puede haber 0 o N iteraciones hasta que la
condición sea FALSE.
Algunos lenguajes tienen estructuras como LOOP UNTIL, o
REPEAT UNTIL, las cuales evalúan la condición al final y no al
principio de todo. PL/SQL no tiene esta estructura, sin embargo sería
muy fácil simularla. Veamos un ejemplo:
LOOP
secuencia_de_instrucciones;
EXIT WHEN expresion_booleana;
END LOOP;
Para asegurarnos que un bucle de tipo WHILE se ejecuta por lo
menos una vez, podemos implementarlo mediante una variable booleana
de la siguiente forma:
hecho:=FALSE;
WHILE NOT hecho LOOP
secuencia_de_instrucciones;
hecho:=expresion_booleana;
END LOOP;
INNOVA Desarrollos Informáticos, SL Pág. 50
PL/SQL Básico
Unidad 5: Estructuras de Control
2.3.3 FOR-LOOP
Al contrario que
que en el caso de un bucle WHIL
WHILE,
E, en el cual recordemo
recordemoss
que el número de iteraciones era desconocido a priori, en un bucle FOR
este número
FOR es conocido
iteran un número deantes
vecesdeque
comenzar la iteraciónen. Los
está comprendido bucles
un rango.
Veamos la sintaxis mediante
mediante un ejemplo:
FOR contador IN [REVERSE] valor_minimo..valor_maximo LOOP
secuencia_de_instrucciones;
END LOOP;
El rango es evaluado cuando se entra por primera vez en el bucle, y
nunca más se vuelve a evaluar.
Vemos unos cuantos ejemplos que pongan de manifiesto la utilización
del bucle FOR:
FOR i IN 1..3 LOOP -- Asigna los valor
valores
es 1, 2, 3 a i
secuencia_de_instrucciones;
secuencia_de_instrucciones; -- Se ejec
ejecutan
utan tres vece
veces…
s…
END LOOP;
FOR i IN 3..3 LOOP – Asigna el valor 3 a i
secuencia_de_instrucciones;
secuencia_de_instrucciones; -- Se ejecutan una vez…
END LOOP;
FOR i IN REVERSE 1..3 LOOP
LOOP -- Asigna los valores 3, 2, 1 a i
secuencia_de_instrucciones;
secuencia_de_instrucciones; -- Se ejec
ejecutan
utan tres vece
veces…
s…
END LOOP;
Dentro de un bucle FOR, el contador del bucle puede ser referenciado
END LOOP;
INNOVA Desarrollos Informáticos, SL Pág. 51
PL/SQL Básico
Unidad 5: Estructuras de Control
PL/SQL Básico
Unidad 5: Estructuras de Control
PL/SQL Básico
Unidad 5: Estructuras de Control
<<principal>>
DECLARE
ctr INTEGER;
BEGIN
…
FOR ctr IN 1..25 LOOP
…
IF principal.ctr>10 THEN … -- Referenciará a la variable global…
END LOOP;
END principal;
PL/SQL Básico
Unidad 5: Estructuras de Control
BEGIN
…
GOTO insercion_fila;
…
<<insercion_fila>>
INSERT INTO emp VALUES …
END;
En el ejemplo anterior, hemos visto un salto ‘hacia abajo’… veamos
ahora un salto ‘hacia arriba’:
BEGIN
…
<<actualizar_fila>>
BEGIN
UPDATE emp SET …
…
END;
…
GOTO actualizar_fila;
…
END;
PL/SQL Básico
Unidad 5: Estructuras de Control
<<fin_loop>> -- No válido…
END LOOP; -- Sentencia No ejecutable…
END;
2.4.1.1 Restricciones
Algunos destinos en un salto de tipo GOTO no están permitidos. De
forma específica, una sentencia GOTO no puede saltar a:
• Una sentencia IF
PL/SQL Básico
Unidad 5: Estructuras de Control
3 UNIDAD 6:INTERACCIÓN
CON RACLE
O
Objetivo general de la unidad
Clarificar como PL/SQL interactua con la Bbdd Oracle, permitiendo
que el lenguaje sea una extensión procedimental del SQL propietario de
Oracle.
Objetivos específicos
Que el alumno conozca como PL/SQL soporta las funciones de SQL,
permite SQL dinámico, y que además sepa definir y controlar cursores
sobre Bbdd.
Contenidos
Soporte SQL
Manejando Cursores
Empaquetando Cursores
Utilización de Cursores con bucles FOR
Cuaderno de notas
PL/SQL Básico
Unidad 6: Interacción con Oracle
INNOVA Desarrollos Informáticos, SL Pág. 60
PL/SQL Básico
Unidad 6: Interacción con Oracle
NEXTVAL devuelve
especifique… hay que eltener
siguiente valor deque
en cuenta unaademás
secuenciade que se le
hacerlo,
actualizará el nuevo valor dentro de la secuencia , ya que se trata de
una sentencia que realiza el COMMIT de forma implícita. Esto es debido
a que de esta forma soluciona el problema del acceso concurrente a la
secuencia. Veamos un ejemplo:
Valor actual de mi_secuencia=3
SELECT mi_secuencia.NEXTVAL FROM sys.dual;
Devuelve 4, y además el valor actual de mi_secuencia=4.
INNOVA Desarrollos Informáticos, SL Pág. 62
PL/SQL Básico
Unidad 6: Interacción con Oracle
3.1.4.2 LEVEL
Se utiliza LEVEL con la sentencia SELECT CONNECT BY, para
organizar los registros de una tabla de Bbdd en una estructura tipo árbol.
LEVEL
árbol. Eldevuelve
nivel raízelesnúmero de nivel
1, sus hijos son de
de un nodo
nivel en una
2, sus estructura
nietos de nivel tipo
3, y
así sucesivamente…
3.1.4.3 ROWID
ROWID devuelve el rowid (dirección
(dirección binaria física) de una fila en una
tabla de la Bbdd. Recordemos que PL/SQL tiene un tipo de datos
llamado ROWID; se puede utilizar var variables
iables de este tip
tipo,
o, para almacenar
los rowids en
en un formato legible.
Cuando se selecciona una rowid dentro
dentro de un tipo ROWID, se debe
usar la función ROWIDTOCHAR, la cual convertirá el valor binario a
un string de caracteres de 18-bytes. Una vez hecho esto, podremos
comparar el valor de una variable ROWID con la pseudocolumna
ROWID en una claúsula WHERE de una sentencia UPDATE o
DELETE, para identificar el último registro recuperado en un cursor (Es
un ejemplo).
3.1.4.4 ROWNUM
ROWNUM devuelve el número lógico que nos indica el orden en el
cual una fila ha sido recuperada de una tabla por una sentencia SELECT.
PL/SQL Básico
Unidad 6: Interacción con Oracle
PL/SQL Básico
Unidad 6: Interacción con Oracle
END;
id_cursor INTEGER;
BEGIN
/* Abrimos un nuevo cursor y devuelve su identificador */
id_cursor := DBMS_SQL.OPE
DBMS_SQL.OPEN_CURSOR;
N_CURSOR;
/* Efectuamos un Parse de la sentencia, en la cual concatenaremos un
DROP TABLE, con el nombre de la tabla */
DBMS_SQL.PARSE(id_cursor, 'DROP TABLE '||nombre_tabla,
dbms_sql.native);
/* La ejecutamos */
DBMS_SQL.EXECUTE;
/* Cerramos el Cursor */
INNOVA Desarrollos Informáticos, SL Pág. 65
PL/SQL Básico
Unidad 6: Interacción con Oracle
DBMS_SQL.CLOSE_CURSOR(id_cursor);
EXCEPTION
/* Si se ejecuta la excepción, cerramos el cursor antes de salir */
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(id_cursor);
END drop table;
El SQL dinámico tiene mucha más potencia, y permite la ejecución de
sentencias que pueden ser simples, o incluso funciones y procedimientos
parametrizados. No es el objetivo del curso entrar en detalle sobre el
funcionamiento del SQL dinámico, puesto que es un tema bastante más
extenso y complicado. Una buena referencia sobre su funcionamiento lo
podemos encontrar en el libro Oracle 8 Application Developer's Guide .
3.2
Manejando Cursores
El conjunto de filas que devuelve una consulta, puede ser 0, 1 o N,
dependiendo de a cuantas filas afecte la condición de búsqueda. Cuando
una consulta devuelve múltiples filas, se debe declarar un cursor para
procesarlas. Se puede declarar un cursor en la parte de declaraciones de
cualquier bloque, subprograma o package PL/SQL.
Se utilizan tres instrucciones para controlar un cursor: OPEN,
FETCH, y CLOSE. En primer lugar, se inicializa el cursor con la
sentencia OPEN, la cual identifica al conjunto resultante. Entonces, se
usa la sentencia FETCH para recuperar la primera fila; se puede ejecutar
FETCH de manera repetida hasta que todas las filas han sido tratadas,
cuando se procesa la última, se debe cerrar el cursor con la sentencia
CLOSE.
declarandoSey abriendo
pueden múltiples
procesarcursores.
varias consultas de forma paralela,
donde
Bbdd, tiene la ,siguiente
tipo_que_devuelve
y parametro representa un registro o fila de una tabla de
sintaxis:
INNOVA Desarrollos Informáticos, SL Pág. 66
PL/SQL Básico
Unidad 6: Interacción con Oracle
nombre_parametro_cursor
nombre_parametro_cursor [IN] tipo_de_dato [{:= | DEFAULT} expresion ]
Por ejemplo, podemos declarar dos cursores llamados c1 y c2, de la
siguiente forma:
DECLARE
CURSOR c1 IS
SELECT num_emp, nom_emp, trab_emp, sal_emp FROM emp
WHERE sal_emp>2000;
CURSOR c2 RETURN dept%ROWTYPE IS
SELECT * FROM dept WHERE num_dept=10;
El nombre de un cursor, es un identificador que no debe ser declarado,
no el nombre de una variable de PL/SQL. No se pueden asignar valores
a un nombre de un cursor, ni usarlo en una expresión. Sin embargo, los
cursores y las variables siguen las mismas reglas de ámbito y
visibilidad. Se permite dar a un cursor el mismo nombre que una tabla
de Bbdd… sin embargo se recomienda no hacerlo.
Un cursor puede tener parámetros, los cuales deben aparecer en la
consulta asociada. Los parámetros son de tipo IN, ya que no pueden
devolver ningún valor. Tampoco podemos imponer la constraint de
NOT NULL a un parámetro de un cursor.
Veamos un ejemplo de definición de un cursor, en la cual asignamos
valores por defecto
defecto a los parámetr
parámetros
os de dicho cursor:
cursor:
DECLARE
CURSOR c1 (Minimo INTEGER DEFAULT 0,
Maximo INTEGER DEFAULT 99) IS
SELECT …
El ámbito de los parámetros de un cursor es local al cursor, es decir,
que pueden ser referenciados solo en la consulta especificada en la
declaración del cursor. Los valores de los parámetros del cursor son
usados por la consulta asociada cuando se abre el cursor.
PL/SQL Básico
Unidad 6: Interacción con Oracle
DECLARE
CURSOR c1 IS
SELECT nom_emp, trab_emp
FROM emp
WHERE sal_emp<3000;
…
BEGIN
OPEN c1;
…
END;
Las filas del conjunto resultante no son recuperadas cuando se ejecuta
la sentencia OPEN, sino que lo serán más tarde cuando se ejecute la
sentencia FETCH.
PL/SQL Básico
Unidad 6: Interacción con Oracle
END LOOP;
La consulta puede referenciar a variables de PL/SQL que estén en su
ámbito. Sin embargo, algunas variables de la consulta se evalúan tan sólo
cuando se abre el cursor. En el siguiente ejemplo que veremos, cada
salario recuperado se multiplica por 2, aunque factor se vaya
incrementando después de cada fetch :
DECLARE
mi_sal emp.sal_emp%TYPE;
mi_trabajo emp.trab_emp%TYPE;
factor INTEGER:=2;
CURSOR c1 IS
SELECT factor*sal_emp FROM emp
WHERE trab_emp=mi_trabajo;
BEGIN
…
OPEN c1; -- Aquí factor vale 2…
LOOP
FETCH c1 INTO mi_sal;
EXIT WHEN c1%NOTFOUND;
factor:=factor+1; -- No Afecta al Fetch…
END LOOP;
INNOVA Desarrollos Informáticos, SL Pág. 69
PL/SQL Básico
Unidad 6: Interacción con Oracle
END;
Para cambiar el resultado del conjunto, o los valores de las variables de
la consulta, se debe cerrar y abrir el cursor con las variables conteniendo
los nuevos valores.
Se puede utilizar un lista INTO diferente en fetches separados
separados para el
mismo cursor. Veamos un ejemplo:
DECLARE
CURSOR c1 IS
SELECT nom_emp FROM emp;
nombre1 emp.nom_emp%TYPE;
nombre2 emp.nom_emp%TYPE;
nombre2 emp.nom_emp%TYPE;
BEGIN
OPEN c1;
FETCH c1 INTO nombre1;
nombre1; -- Recupera la primera fila…
FETCH c1 INTO nombre2;
nombre2; -- Recupera la segunda fila…
FETCH c1 INTO nombre3;
nombre3; -- Recupera la tercera fifila…
la…
…
CLOSE c1;
END;
Si se realiza un fetch después
después de haber recuperado la última fila de la
consulta, los valores de las variables son indeterminados.
PL/SQL Básico
Unidad 6: Interacción con Oracle
PL/SQL Básico
Unidad 6: Interacción con Oracle
END acciones_emp;
PL/SQL Básico
Unidad 6: Interacción con Oracle
BEGIN
FOR c1_rec IN c1 LOOP
/* Calculamos y almacenamos los resultados */
resultado:=c1_rec.n2 / (c1_rec.n1+c1_rec
(c1_rec.n1+c1_rec.n3);
.n3);
INSERT INTO temp VALUES (resultado, NULL, NULL);
END LOOP;
COMMIT;
END;
Cada Iteración del bucle, lleva implícito un fetch de la consulta
asociada a un cursor. Al entrar en el bucle se abre el cursor, y al salir se
cierra.
La manera de referenciar a los elementos del cursor, es mediante el
nombre del identificador que hemos asociado al bucle FOR, y después
un punto y el nombre del campo de la consulta que queramos
referenciar.
PL/SQL Básico
Unidad 6: Interacción con Oracle
DECLARE
bonus REAL;
BEGIN
FOR emp_rec IN (SELECT num_emp, sal_emp, com_emp FROM
emp) LOOP
bonus:=(emp_rec.sal_emp*0.05)
bonus:=(emp_rec.sal_emp*0.05) + (emp_rec.com_emp*0.25)
(emp_rec.com_emp*0.25);;
INSERT INTO bonus_emp VALUES (emp_rec.num_emp, bonus);
END LOOP;
COMMIT;
END;
De todas formas, y aunque esto en ocasiones puede ser práctico para
evitarnos definir el cursor, se debe tener mucho cuidado al utilizarlo,
puesto que puede dificultar mucho la lectura del código fuente, e incluso
su mantenimiento posterior.
INNOVA Desarrollos Informáticos, SL Pág. 74
4 UNIDAD 7: M ANEJO DE
ERRORES
Objetivo general de la unidad
Explicar como PL/SQL resuelve los temas relacionados con el manejo
de errores y excepciones.
Objetivos específicos
Que el alumno conozca las excepciones predefinidas por PL/SQL, y
sepaprogramas.
sus a su vez, crear excepciones nuevas para el tratamiento de errores en
Contenidos
Introducción
Ventajas de la Excepciones
Excepciones
Excepciones Predefinidas
Excepciones definidas por el usuario
Cuaderno de notas
PL/SQL Básico
Unidad 7: Manejo de Errores
INNOVA Desarrollos Informáticos, SL Pág. 77
4.1 Introducción
En PL/SQL, a un warning o una condición de error, se le llama
excepción Las excepciones pueden ser Internas (definidas por el propio
sistema), o . definidas por el usuario. Ejemplos de excepciones definidas
de forma interna son division by zero y out of memory . Las excepciones
internas más comunes tienen nombres predefinidos, como por ejemplo
ZERO_DIVIDE y STORAGE ERROR. De todas formas a las
excepciones internas que no lo tienen, se les puede dar uno sin
problemas.
El usuario puede definir excepciones propias en la parte declarativa del
cualquier bloque, subprograma o package PL/SQL. Por ejemplo,
podríamos definir una excepción llamada fondos_insuficientes para
para controlar
las transacciones de un banco. Al contrario que el caso de las
excepciones internas, a las excepciones definidas por el usuario se les
debe dar un nombre.
Cuando ocurre un error, la excepción se dispara ( isis raised ), es decir, la
ejecución normal se detiene, y se transfiere el control a la parte de
tratamiento de errores del bloque PL/SQL o subprograma. Las
excepciones internas son disparadas de forma implícita (automática)
por el propio sistema, sin embargo las excepciones definidas por el
usuario deben ser disparadas de forma explícita mediante
sentencias RAISE, las cuales pueden disparar también excepciones
predefinidas.
Para el manejo de excepciones que se disparan, se deben escribir
rutinas separadas que tienen el nombre de exception handlers . Cuando una
rutina de este tipo de ejecuta, se detiene el funcionamiento del bloque
que la ha disparado, y posteriormente el control pasa al bloque de nivel
superior… en caso de no existir, el control pasaría al sistema (es decir,
terminaría la ejecución del programa PL/SQL)
PL/SQL)..
PL/SQL Básico
Unidad 7: Manejo de Errores
DECLARE
pe_ratio NUMBER(3,1);
BEGIN
SELECT precio/ganancias INTO pe_ratio FROM stocks
WHERE simbolo=’XYZ’;
simbolo=’XYZ’; -- Esto puede causar el error de división
entre cero…
INSERT INTO estadis (simbolo,ratio) VALUES (‘XYZ’,pe_ratio);
COMMIT;
EXCEPTION
WHEN ZERO_DIVIDE THEN -- Controla la excepción…
INSERT INTO estadis (simbolo,ratio) VALUES (‘XYZ’,NULL);
COMMIT;
…
WHEN OTHERS THEN
THEN -- Controla el resto de exc
excepciones…
epciones…
ROLLBACK;
END; -- El manejador de errores y el bloque acaban aquí…
errores
Este último ejemplo ilustra el manejo de errores, no la óptima
utilización del INSERT, puesto que nos podríamos haber ahorrado la
excepción simplemente escribiendo la sentencia de la siguiente forma:
INSERT INTO estadis (simbolo,ratio)
SELECT simbolo, DECODE(ganancias,0,NU
DECODE(ganancias,0,NULL,precio/ganancias)
LL,precio/ganancias)
FROM stocks WHERE simbolo=’XYZ’;
PL/SQL Básico
Unidad 7: Manejo de Errores
SELECT …
-- Controlamos el error ‘no data found’…
El procesamiento de errores no está claramente diferenciado del
proceso normal… no es una programación robusta.
Veamos como deberían
deberían escribirse estas líneas ddee código…
BEGIN
SELECT …
SELECT …
SELECT …
…
EXCEPTION
WHEN NO_DATA_FOUND
NO_DATA_FOUND THEN -- Controla el error…
…
END;
Las excepciones mejoran la lectura del código, ya que las rutinas
principales no se ven mezcladas con las rutinas de manejo de errores.
Además el hecho de utilizar excepciones nos asegura que si se dispara
alguna excepción de ese tipo, nuestro programa en PL/SQL la tratará.
PL/SQL Básico
Unidad 7: Manejo de Errores
DUP_VAL_ON_INDEX ORA-00001 -1
PL/SQL Básico
Unidad 7: Manejo de Errores
INVALID_CURSOR Se intenta realizar una operación no válida sobre un cursor, como por
ejemplo cerrar un cursor que no ha sido abierto.
NOT_LOGGED_ON El programa PL/SQL realiza una llamada a Bbdd sin estar conectado
a Oracle.
ROWTYPE_MISMATCH La variable del cursor del host, y la variable del cursor de PL/SQL,
implicados en una sentencia de asignación, tienen tipos
incompatibles.
PL/SQL Básico
Unidad 7: Manejo de Errores
4.4.2
Reglas de ámbito y visibilidad
No se puede declarar la misma excepción dos veces en el mismo
bloque, sin embargo sí que se puede declarar la misma excepción en dos
bloques distintos.
Las excepciones declaradas en un bloque se consideran locales a ese
bloque, y globales para todos sus subbloques. Debido a que un bloque
puede referenciar tan solo a excepciones locales o globales, los bloques
incluidos en otros no pueden referenciar a excepciones declaradas en un
subbloque.
Si se vuelve a declarar una excepción global en un subbloque, la
declaración local prevalecerá sobre la global, por lo tanto el
subbloque
declarado ennounpodrá referenciar
bloque a la en
etiquetado… excepción
ese caso global a menos
la siguiente que será
sintaxis sea
válida:
Etiqueta_bloque.nombre_excepcion
Etiqueta_bloque.nombre_excepcion
Vemos un ejemplo
ejemplo que ilustra las reglas ddee ámbito y visibilid
visibilidad.
ad.
DECLARE
excepcion1 EXCEPTION;
num_acct NUMBER;
BEGIN
…
DECLARE -- E
Empieza
mpieza el subbloque
INNOVA Desarrollos Informáticos, SL Pág. 83
PL/SQL Básico
Unidad 7: Manejo de Errores
excepcion1 EXCEPTION;
EXCEPTION; -- Esta declaración prevalec
prevalece…
e…
num_acct NUMBER;
BEGIN
…
IF … THEN
RAISE excepcion1;
excepcion1; -- Si se dispara no se tratará…
END IF;
…
END; -- Fin del subbloque…
EXCEPTION
WHEN excepcion1 THEN -- No tratará a la excepción interior…
…
END;
La excepción interior al subbloque que se dispara nunca se tratará,
puesto que la definición local prevalece sobre la global. Debemos tener
cuidado en ese aspecto.
Número_de_error_de_Oracle);
Número_de_error_de_Oracle);
INNOVA Desarrollos Informáticos, SL Pág. 84
PL/SQL Básico
Unidad 7: Manejo de Errores
PL/SQL Básico
Unidad 7: Manejo de Errores
PL/SQL Básico
Unidad 7: Manejo de Errores
…
trata_salario(numero_empleado,
trata_salario(numero_empleado, incremento);
EXCEPTION
WHEN salario_nulo THEN
INSERT INTO auditoria_emp VALUES (numero_empleado,…);
COMMIT;
…
END;
INNOVA Desarrollos Informáticos, SL Pág. 87
5 UNIDAD 8: SUBPROGRAMAS Y
PACKAGES
Objetivos específicos
Que el alumno sepa definir Procedimientos y Funciones, así como
agruparlos
modularidadposteriormente
del aplicativo. en Packages para mejorar la eficiencia y
Contenidos
Ventajas de los Subprogramas
Subprogramas
Procedimientoss y Funciones
Procedimiento
Recursividad en PL/SQL
Concepto de Package
Ventajas de los Packages
Cuaderno de notas
PL/SQL Básico
Unidad 8: Subprogramas y Packages
INNOVA Desarrollos Informáticos, SL Pág. 90
5.1.1
PL/SQL Básico
Unidad 8: Subprogramas y Packages
5.2.1 Funciones
Una función es un subprograma que calcula un valor. Las funciones y
los procedimientos se estructuran igual, excepto que las funciones deben
tener una claúsula RETURN, es decir, deben devolver un valor. La
sintaxis general de una función es la siguiente:
FUNCTION nombre [ (parametro[, parametro, …])] RETURN
tipo_de_dato IS
[declaraciones_locales]
BEGIN
sentencias_ejecutables
[EXCEPTION
manejadores de excepciones]
END [nombre];
Donde parametro sigue la siguiente sintaxis:
nombre_parametro [IN | OUT | IN OUT] tipo_de_dato [{:= |
DEFAULT} expresion]
PL/SQL Básico
Unidad 8: Subprogramas y Packages
END IF;
END fac;
PL/SQL Básico
Unidad 8: Subprogramas y Packages
Especificación
Cuerpo
PL/SQL Básico
Unidad 8: Subprogramas y Packages
PACKAGE mi_package IS
-- Declaraciones públicas…
…
PROCEDURE proc1(…);
FUNCTION fun1(…) RETURN tipo_de_dato;
END mi_package;
END proc2;
PROCEDURE proc1(…) IS
BEGIN
…
proc2(…); -- Este será privado…
END proc1;
FUNCTION fun1(…) RETURN tipo_de_dato IS
BEGIN
…
RETURN …
END fun1;
END mi_package;
INNOVA Desarrollos Informáticos, SL Pág. 95
PL/SQL Básico
Unidad 8: Subprogramas y Packages
5.5.1 Modularidad
Los packages permiten encapsular de manera lógica tipos, objetos y
subprogramas relacionados, en modulos PL/SQL con un mismo
nombre. Cada package es sencillo de entender, y los interfaces entre los
packages son simples, transparentes y bien definidos. Esto mejora el
desarrollo de la aplicación.
5.5.2
Diseño
Cuando sedediseña
aplicaciones más
una aplicación, se sencillo
debe inicializar toda la
información del interface en la especificación… sin embargo no es
necesario implementar todo el cuerpo, se puede ir haciendo poco a poco.
Esto facilita mucho las cosas a la hora de realizar el diseño de
aplicaciones.
PL/SQL Básico
Unidad 8: Subprogramas y Packages
PL/SQL Básico
Anexo 3: Ejercicios
6 A NEXO
NEXO 3:E JERCICIOS
JERCICIOS
identificador1 INTEGER;
IdEntificador_1 INTEGER;
IDENTIFICADOR1 INTEGER;
PL/SQL Básico
Anexo 3: Ejercicios
END;
PL/SQL Básico
Anexo 3: Ejercicios
PL/SQL Básico
Anexo 3: Ejercicios
PL/SQL Básico
Anexo 3: Ejercicios
i, j INTEGER, INTEGER;
13.- Supongamos que tenemos un procedimiento llamado
calculo_integral, el cual está incluido en un package llamado
el_package_de_los_calculos,
Bbdd llamada ORCL. ¿Comoque su vez
se haría sellamar
para encuentra en la
a dicho instancia de
procedimiento
en el caso de encontrarse conectado a la Bbdd ORCL con un usuario
que tuviera acceso al procedimiento?, ¿Y en el caso de no estar en
ORCL?
BEGIN
FOR dept IN 1..10 LOOP
UPDATE dept SET nom_dept=base+dept
WHERE cod_dept=base+dept;
END LOOP;
END;
DECLARE
ap1_emp VARCHAR2(40):='Fernandez';
BEGIN
DELETE FROM emp WHERE ap1_emp=ap1_emp;
COMMIT;
END;
PL/SQL Básico
Anexo 3: Ejercicios
17.- ¿Qué valor contendrá la variable 'sumador' al salir del bucle?, ¿Por
qué?
DECLARE
sumador PLS_INTEGER;
BEGIN
FOR i IN 1..100 LOOP
sumador:=sumador+i;
END LOOP;
END;
PL/SQL Básico
Anexo 3: Ejercicios
PL/SQL Básico
Anexo 3: Ejercicios
cadena:='10*9*8*7*6*5*4*3*2*1'
No es necesario definirlo como un procedimiento o función, pero sí
declarar todas las variables necesarias para su correcto funcionamiento.
PL/SQL Básico
Anexo 3: Ejercicios
PL/SQL Básico
Anexo 3: Ejercicios
3.- ¿Qué tipo de binding para las variables utiliza PL/SQL?, ¿Qué
limitaciones tiene?, ¿Cómo las soluciona?.
4.- ¿Qué dos métodos generales tenemos para trabajar con Cursores en
PL/SQL?, ¿Cual es más cómodo?
PL/SQL Básico
Anexo 3: Ejercicios
6.5
Ejercicios de la Unidad 8
1.- ¿Qué tipo de Subprogramas soporta PL/SQL?, ¿Qué diferencias
existen entre ellos?