BDa-p8

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.