Upload
gio-escobar
View
223
Download
0
Embed Size (px)
Citation preview
8/3/2019 BDa-p8
1/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 1
PRCTICA: 8. PL/SQL
OBJETIVOS:
Conocer los fundamentos bsicos de PL/SQL y aprender los componentes principales de unbloque PL/SQL.Aprender a crear y usar procedimientos almacenados y utilizar cursores dentro de bloquesPL/SQL.
MATERIAL:
ORACLE 9i versin para WINDOWS XP
BIBLIOGRAFIA:
ORACLE: Introduction to ORACLE 9i: PL/SQL. Student Guide. 2001.OREILLY: ORACLE PL/SQL Programming 2nd Edition. 2000.
8/3/2019 BDa-p8
2/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 2
CONTENIDO:
1. Introduccin
2. Variables2.1. Declaracin de variables2.2. Asignacin de valores a variables2.3. Atributo %TYPE2.4. Variables BOOLEANAS
3. rdenes ejecutables PL/SQL3.1. Comentarios PL/SQL3.2. Funciones PL/SQL3.3. Conversin de tipos3.4. Operadores
4. Entrada/Salida4.1. Entrada de datos4.2. Salida de datos
5. rdenes SQL en PL/SQL5.1. SELECT5.2. INSERT, DELETE, UPDATE
6. Estructuras de control6.1. IF-THEN-ELSE6.2. LOOP6.3. FOR6.4. WHILE
7. Procedimientos y Funciones PL/SQL7.1. Procedimientos PL/SQL7.2. Funciones PL/SQL
8. Cursores8.1. Uso de cursores8.2. Cursores parametrizados8.3. Bucles de cursor FOR
Despus de completar esta prctica, el alumno debera ser capaz de:- Escribir bloques PL/SQL
- Manejar instrucciones SQL dentro de bloques PL/SQL.- Escribir Procedimientos y Funciones PL/SQL- Usar cursores PL/SQL.
8/3/2019 BDa-p8
3/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 3
Esquema de Trabajo
Los ejemplos mostrados en esta prctica estn basados en el siguiente esquema relacional:
DEPARTAMENTOS (codigo, nombre)AREAS (codigo, nombre, departamento)PROFESORES (codigo, apellido1, apellido2, nombre_pila, activo, categoria, dedicacion, area)ASIGNATURAS (siglas, nombre, creditos, curso, anualidad, clase, horas_teoria, horas_practica,
grupos_teoria , grupos_practica, alumnos)LOCALES (codigo, nombre, docente, capacidad, edificio, situacion)GRUPOS (curso, clase, codigo, nombre)DOCENCIA (id, curso, clase, grupo, siglas, profesor, local, dia, hora, periodicidad)
areas.departamento departamentosprofesores.area areas
docencia.curso, clase, grupo gruposdocencia.profesor profesoresdocencia.local localesdocencia.siglas asignaturas
8/3/2019 BDa-p8
4/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 4
1. Introduccin
PL/SQL es un lenguaje de programacin estructurado. Es un lenguaje procedimental queampla la funcionalidad de SQL, aadiendo estructuras habituales en otros lenguajes deprogramacin, entre las que se encuentran:
Variables y Tipos Estructuras de control Procedimientos y Funciones Tipos de Objetos y Mtodos.
La unidad bsica en PL/SQL es el bloque. Todos los programas PL/SQL estncompuestos por bloques que pueden estar anidados. Un bloque PL/SQL est compuesto
de tres partes principales:
seccin declarativa (opcional). Contiene las variables, constantes ... seccin ejecutable (obligatoria). Contiene rdenes SQL para manipular datos
de la base de datos y rdenes PL/SQL para manipular los datos del bloque seccin de excepciones (opcional). Especifica las acciones a realizar en caso
de error o cuando se producen excepciones en la ejecucin.
La estructura general es:
[DECLARE
variables, constantes, excepciones de usuario...]BEGIN
rdenes SQLrdenes PL/SQL
[EXCEPTIONacciones a realizar al ocurrir un error]
END;/
Para ejecutar un bloque PL/SQL siempre hay que colocar al final la barra /.
Podemos crear diferentes tipos de bloques: Bloques annimos: Se construyen de forma dinmica y se suelen ejecutar una sola
vez. Bloques nominados: Igual que los annimos pero con una etiqueta que les da
nombre. Subprogramas: Procedimientos, paquetes y funciones, almacenados en la base de
datos y que se ejecutan en mltiples ocasiones. Los subprogramas se ejecutarnmediante una llamada.
8/3/2019 BDa-p8
5/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 5
Disparadores (Triggers): Bloques nominados que se almacenan en la base dedatos y que se ejecutan ante algn suceso.
Para poner nombre a un bloque se le pone una etiqueta antes del DECLARE encerrado por. Por ejemplo para darle el nombre Mi_Bloque a un bloque PL/SQL pondramos:
DECLAREBEGINEND;
/
2. Variables
Las variables se definen en la seccin declarativa de los bloques PL/SQL dnde tambinpueden inicializarse.
La asignacin de nuevos valores a las variables puede hacerse en la parte ejecutable delbloque.
Pueden utilizarse para pasar valores como argumentos a subprogramas. Estas podrn serde tipo IN (variable de entrada, OUT, variable de salida o INOUT, variable de
entrada/salida).
Tambin podrn utilizarse para almacenar valores devueltos o requeridos por una ordenSQL.
Todas las variables tienen un tipo. Los posibles tipos de una variable son:
Escalar. Almacenan un valor nico. Son los mismos que los de las columnas de lastablas (VARCHAR2, NUMBER, DATE, CHAR, LONG, LONG_RAW,BINARY_INTEGER, LAW_INTEGER) ms el BOOLEAN
Compuesto. Grupos de datos: tablas PL/SQL, registros... Puntero. Designan elementos de otros programas. LOB (Large OBjects). Almacenan gran cantidad de informacin. Las variables de tipo
LOB permiten almacenar datos no estructurados (imgenes, texto...) de hasta 4 GB detamao
8/3/2019 BDa-p8
6/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 6
2.1. Declaracin de variables
Sintaxis:
[CONSTANT] [NOT NULL] [{:= | DEFAULT}];
Ejemplo:
DECLAREfecha DATE;dep_num NUMBER(2) NOT NULL := 10;
ciudad VARCHAR2(10) := Ciudad Real;Km_a_milla CONSTANT NUMBER := 1.4;
Las variables declaradas como NOT NULL siempre deben ser inicializadas.La inicializacin puede hacerse utilizando := o la palabra reservada DEFAULT.Si una variable no se inicializa contendr el valor NULL.Las constantes deben ser inicializadas.
2.2. Asignacin de valores a variables
Sintaxis:
:= ;
2.3. Atributo %TYPE
El atributo %TYPE se utiliza para declarar una variable con el mismo tipo que unacolumna de una tabla o que otra variable definida anteriormente.
Sintaxis:
{. | }%TYPE;
Ejemplo:
var_nombre Empleados.nombre%TYPE;balance NUMBER;balance_minimo balance%TYPE := 10;
8/3/2019 BDa-p8
7/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 7
2.4. Variables BOOLEANAS
Las variable BOOLEANAS pueden tomar el valor TRUE, FALSE o NULL.Las variables pueden combinarse mediante operadores lgicos (NOT, AND, OR).Las expresiones pueden devolver valores BOOLEANOS utilizando operadoresrelacionales (
8/3/2019 BDa-p8
8/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 8
4. Entrada/Salida
Los programas PL/SQL suelen realizar operaciones especficas sin interactuar con eloperador. Sin embargo, existen algunas funciones que nos pueden ayudar a depurarprogramas y a interactuar con el usuario mostrando datos por pantalla y pidiendo datos alusuario.
4.1. Salida de datos
Para mostrar una cadena por pantalla podemos utilizar:
DBMS_OUTPUT.PUT_LINE();
Si los datos a mostrar no son cadenas puede utilizarse la function TO_CHAR() paratransformarlo, y el operador || para concatenar. Con tipos de datos estndar (p. ej.Nmeros) puede no ser necesario usar la funcin TO_CHAR()
El paquete DBMS_OUTPUT implementa una cola, en la cual se van almacenando losmensajes de salida. Si queremos que los mensajes aparezcan por pantallas tenemos queactivar la opcin SERVEROUTPUT:
SET ServerOutput ON;
4.2. Entrada de datos
Cuando trabajamos pidiendo datos al usuario es habitual especificar la opcin SET VERIFYOFF para evitar que el sistema nos muestre el valor que tena la variable antes y que nosconfirme el nuevo valor que toma.
Para pedir datos al usuario se utiliza una variable de substitucin, dentro del cdigofuente del bloque PL/SQL, si esta variable no est inicializada, se le pedir el valor alusuario:
SET ServerOutput ON;SET VERIFY OFF;DECLARE
vv NUMBER :=&v;BEGIN
DBMS_OUTPUT.PUT_LINE('Valor de v: '||vv);END;
/
8/3/2019 BDa-p8
9/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 9
5. rdenes SQL en PL/SQL
Podemos utilizar instrucciones SQL dentro de los bloques PL/SQL para recuperar datos dela base de datos o para actualizar los datos que contiene.
5.1.SELECTSintaxis:
SELECT INTO {[, , ...] | }FROM
WHERE ;
El SELECT almacenar los valores que obtenga en las variables indicadas tras INTO y enel mismo orden.Es obligatorio incluir la clusula INTO.El SELECT debe prepararse para que slo devuelva una fila.
Ejemplo:
DECLAREv_apellidos VARCHAR2(50);
v_nombre VARCHAR2(30);BEGINSELECT apellidos, nombreINTO v_apellidos, v_nombreFROM EmpleadosWHERE id=5;END;
5.2.INSERT, UPDATE, DELETELa sintaxis no vara:
INSERT INTO tabla VALUES(...);
UPDATE tablaSET valor = expresinWHERE condicin;
DELETE FROM tabla WHERE condicin;
8/3/2019 BDa-p8
10/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 10
La nica novedad es que en las expresiones y en las condiciones podemos utilizar variablesPL/SQL.
6. Estructuras de control
6.1. Orden IF
El funcionamiento de la estructura IF es el habitual. Su Sintaxis es la siguiente:
IF THEN;
[ELSIF THEN;]
.[ELSE;]
END IF;
Ejemplo:
SET ServerOutput ON;SET VERIFY OFF;DECLARE
v_num NUMBER := &v;
BEGINIF v_num < 50 THEN
DBMS_OUTPUT.PUT_LINE('Valor pequeo');ELSIF v_num < 100 THEN
DBMS_OUTPUT.PUT_LINE('Valor mediano');ELSE
DBMS_OUTPUT.PUT_LINE('Valor grande');END IF;
END;/
8/3/2019 BDa-p8
11/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 11
6.2. Orden LOOPLos bucles LOOP son bucles que se ejecutan siempre, para salir de ellos tendremos que
poner una instruccin de salida dentro del bucle.
Su Sintaxis es:LOOP[EXIT WHEN ]
END LOOP;
Ejemplo:
SET ServerOutput ON;
SET VERIFY OFF;DECLAREnum NUMBER :=1;
BEGINLOOP
DBMS_OUTPUT.PUT_LINE('Valor: '|| num);num := num +1;EXIT WHEN num > 10;
END LOOP;END;
/
6.3. rden FORLos bucles FOR se repiten un nmero determinado de veces.Sintaxis:
FOR IN [REVERSE] .. LOOP...END LOOP;
Ejemplo:SET ServerOutput ON;
SET VERIFY OFF;DECLARE
num NUMBER;BEGIN
FOR num IN 1..10 LOOPDBMS_OUTPUT.PUT_LINE('Valor: '|| num);
END LOOP;END;
/
8/3/2019 BDa-p8
12/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 12
6.4. rden WHILE
Los bucles WHILE son iguales que en otro lenguajes de programacin.
Sintaxis:
WHILE LOOP...END LOOP;
Ejemplo:SET ServerOutput ON;SET VERIFY OFF;
DECLAREnum NUMBER:=1;BEGIN
WHILE num
8/3/2019 BDa-p8
13/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 13
Cuando se crea un procedimiento, ste se compila en primer lugar y queda almacenado en labase de datos de forma compilada. El cdigo compilado puede ser posteriormente utilizado
por cualquier bloque PL/SQL.
Para modificar un procedimiento creado debemos reemplazarlo por el nuevo volviendo acompilarlo aadiendo las palabras clave OR REPLACE. Podemos eliminar unprocedimiento mediante la orden DROP PROCEDURE
Ejemplo:
SET SERVEROUTPUT ON;CREATE OR REPLACE PROCEDURE Muestra (Cad IN Varchar(20)) AS
BEGINDBMS_OUTPUT.PUT_LINE (Cad);END;
DECLAREMens := &Mensaje
BEGINMuestra(Mens);
END Muestra;
7.2. Funciones PL/SQL
Las funciones son iguales que los procedimientos pero adems devuelven un valor, por loque la llamada a una funcin debe realizarse dentro de una expresin.
La estructura general de una funcin es:
CREATE OR REPLACE FUNCTION nombre (param [IN | OUT | INOUT] [, param [IN|OUT|INOUT] ,]RETURN {IS|AS}
[DECLARE]BEGIN
RETURN
[EXCEPTION]END;
La orden RETURN dentro de una funcin devuelve el valor que la funcin debe devolver, elcual se convierte al tipo especificado en la cabecera de la funcin. Puede haber ms de unainstruccin RETURN, pero solo se ejecutar la primera que se encuentre dentro de la lgicadel programa.
8/3/2019 BDa-p8
14/19
8/3/2019 BDa-p8
15/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 15
Para poder abrir un cursor utilizaremos:OPEN
Para recoger los datos que devuelve un cursor utilizaremos la orden FETCH de la siguientemanera:
FETCH INTO {|}
Despus de utilizar el FETCH se incrementa el puntero del conjunto activo para que apunteal siguiente registro, de tal manera que en un bucle, cada FETCH devolver filas sucesivasdel conjunto activo. El atributo de cursores %NOTFOUND se utiliza para saber cuando seha terminado de recorrer el conjunto activo.
Para cerrar un cursor utilizaremos:
CLOSE ;Los cursores tienen cuatro atributos:
%FOUND devuelve TRUE si la ultima instruccin FETCH devolvi una fila%NOTFOUND es la contraria a %FOUND%ISOPEN nos indica si el cursor est abierto%ROWCOUNT nos dice el nmero de registros extrados por el cursor hasta el momento.
8/3/2019 BDa-p8
16/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 16
Ejemplo:SET SERVEROUTPUT ON;DECLARE
v_CODIGO AREAS.CODIGO%TYPE;v_NOMBRE AREAS.NOMBRE%TYPE;
CURSOR c_AREAS ISSELECT CODIGO, NOMBREFROM AREASORDER BY CODIGO;
BEGINOPEN c_AREAS;
LOOP FETCH c_AREAS INTO v_CODIGO, v_NOMBRE;EXIT WHEN c_AREAS%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_CODIGO || ' - ' ||v_NOMBRE);
END LOOP;CLOSE c_AREAS;
END;/
8.2. Cursores parametrizados
Permiten utilizar la orden OPEN para enviar las variables de acoplamiento de un cursor. Porejemplo, el siguiente cdigo crea un cursor para las reas cuyo cdigo se pasa por parmetroen la orden OPEN:
8/3/2019 BDa-p8
17/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 17
SET SERVEROUTPUT ON;DECLARE
v_CODIGO AREAS.CODIGO%TYPE;
v_NOMBRE AREAS.NOMBRE%TYPE;
CURSOR c_AREAS (v_COD AREAS.CODIGO%TYPE) ISSELECT CODIGO, NOMBREFROM AREASWHERE CODIGO = v_CODORDER BY CODIGO;
BEGINOPEN c_AREAS ('ATC');
LOOP FETCH c_AREAS INTO v_CODIGO, v_NOMBRE;EXIT WHEN c_AREAS%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_CODIGO || ' - ' ||v_NOMBRE);
END LOOP;CLOSE c_AREAS;
END;/
8/3/2019 BDa-p8
18/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 18
8.3. Bucles de cursor FOR
Ya hemos visto como podemos utilizar los cursores para recorrer los resultados de una
consulta mediante el uso de bucles LOOP y podemos realizar las mismas operacionesutilizando bucles WHILE. Cuando utilizamos bucles FOR podemos usar un procesamientomucho ms sencillo con los bucles de cursor FOR, los cuales abren, recuperan los datos ycierran el cursor de forma implcita, haciendo su uso ms sencillo.
Su sintaxis es la siguiente:FOR IN LOOPEND LOOP;
Ejemplo:SET SERVEROUTPUT ON;DECLARE
CURSOR C_PROFES ISSELECT nombre_pilaFROM profesoresORDER BY codigo;
BEGINFOR VP IN C_PROFES LOOP
DBMS_OUTPUT.PUT_LINE ('Nombre: ' || VP.nombre_pila);
END LOOP ;END ;/
8/3/2019 BDa-p8
19/19
DEP. TECNOLOGAS Y SISTEMAS DE INFORMACIN BASES DE DATOS
PRACTICA 8. PL/SQL 19
EJERCICIOS PRCTICA 8 PL/SQL
Para realizar estos ejercicios es necesario recordar la estructura del esquema de la base de
datos ACADEM empleada en prcticas anteriores:
DEPARTAMENTOS (codigo, nombre)AREAS (codigo, nombre, departamento)PROFESORES (codigo, apellido1, apellido2, nombre_pila, activo, categoria, dedicacion, area)ASIGNATURAS (siglas, nombre, creditos, curso, anualidad, clase, horas_teoria, horas_practica,
grupos_teoria , grupos_practica, alumnos)LOCALES (codigo, nombre, docente, capacidad, edificio, situacion)GRUPOS (curso, clase, codigo, nombre)DOCENCIA (id, curso, clase, grupo, siglas, profesor, local, dia, hora, periodicidad)
areas.departamento departamentos
profesores.area areasdocencia.curso, clase, grupo gruposdocencia.profesor profesoresdocencia.local localesdocencia.siglas asignaturas
1. Escribir un bloque PL/SQL que calcule la media de dos nmeros dados por el usuario.2. Escribir un bloque PL/SQL que pida dos identificadores de profesores y determine
cual de los dos est ms cerca de cero o si son iguales3. Escribir un bloque PL/SQL que convierta una determinada cantidad expresada en
segundos a horas, minutos y segundos.4. Mostrar el contenido de una variable que contenga la capacidad total de todas lasaulas del edificio de Informtica (EUI)
5. Insertar una fila en la tabla local con la capacidad total de los espacios de magisterio(EGB) (poner como nombre de edificio TOT, inventarse el contenido del resto delas columnas). Obtener la capacidad mxima de entre todas las clases del edificio deInformtica (EUI). Restar, de la capacidad de la fila insertada, el ltimo valorobtenido actualizar la fila correspondiente en la tabla. Eliminar las filas del edificioTOT.
6. Cree una funcin que calcule la media de dos nmeros. Compruebe sufuncionamiento.
7. Mostrar, ordenados por el cdigo, el nombre de todos los profesores, utilizando uncursor.
8. Utilizando un cursor muestre las asignaturas cuyo ID sea par.