Pl SQL Bloques

download Pl SQL Bloques

of 67

Transcript of Pl SQL Bloques

  • 8/18/2019 Pl SQL Bloques

    1/67

    ETSISI

    ETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•

    Excepciones• Estructuras de control

  • 8/18/2019 Pl SQL Bloques

    2/67

    ETSISI

    ETSISI

    PL/SQL, Introducción

    PL/SQL:Es un lenguaje de programación estructurado deORACLE que amplia el SQL estándar:Permite:

    Manipular datos de una BD Oracle Crear procedimientos estructurados: Usando técnicas de programación como bucles

    For, While, etc.

    Controlar errores con excepciones definidaspor el usuario o propias de Oracle Controlar las filas de una consulta una a una Crear disparadores/ triggers

  • 8/18/2019 Pl SQL Bloques

    3/67

    ETSISI

    ETSISI

    PL/SQL, Introducción

    PL/SQL:Es un lenguaje de programación proceduralestructurado en bloques

    Los programas se pueden dividir en bloques lógicos.Permite bloques anidados.Puede declarar variables localmente al bloque que lasutiliza.

  • 8/18/2019 Pl SQL Bloques

    4/67

    ETSISI

    ETSISI

    PL/SQL, BloquesSe distingue entre bloques:Compilados y guardados

    • Subprogramas: procedimientos, paquetes, funciones:– Se compilan y guardan en la BD– Se ejecutan mediante llamadas explicitas.

    Compilados en tiempo de ejecución

    • Triggers, el código fuente se guarda y se compila al

    llamarle, se ejecutan implícitamente• Bloques anónimos, se compilan en el momento, no se

    guardan.

  • 8/18/2019 Pl SQL Bloques

    5/67

    ETSISI

    ETSISI

    PL/SQL, Bloques

    Bloque: es la unidad más pequeña de un programaPL/SQL.Estructura de bloque:Cada estructura PL/SQL comprende uno o más

    bloques. Éstos pueden estar separados o anidados[DECLARE]........BEGIN

    ......[EXCEPTION]........END;

  • 8/18/2019 Pl SQL Bloques

    6/67

    ETSISI

    ETSISI

    PL/SQL, Bloques

    DECLARE(No es obligatoria) 

    Debe de contener todas las constantes, variables yexcepciones definidas por el usuario y que se referenciana lo largo de las siguientes secciones.BEGINSección obligatoria, parte ejecutable, contiene lassentencias SQL para manipular datos de la BD ysentencias PL/SQL para manipular datos del bloque.EXCEPTION

    Sección no obligatoria, controla los errores de ejecución,ofrece una salida controlada a las condiciones anormalesde la sección ejecutable.END; (Obligatorio, cierra el bloque) 

  • 8/18/2019 Pl SQL Bloques

    7/67

    ETSISIETSISI

    BLOQUES, AnidamientoBEGIN

    DECLAREVar X...............BEGIN

    DECLARE

    Var Y............BEGIN...........EXCEPTION..............END;...........

    EXCEPTION..............END;

    END;

    Ámbito de la

    variable XÁmbito de la

    variable Y

  • 8/18/2019 Pl SQL Bloques

    8/67

    ETSISIETSISI

    PL/SQL, BloquesBloques Anónimos

    DECLAREDefine objetos PL/SQL que utiliza la parte Begin o 

    Exception de este mismo bloque.

    BEGIN obligatorio Sentencias

    EXCEPTION

    Control de errores END; obligatorio 

  • 8/18/2019 Pl SQL Bloques

    9/67

    ETSISIETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•

    Excepciones• Estructuras de control•

  • 8/18/2019 Pl SQL Bloques

    10/67

    ETSISIETSISI

    PL/SQL: Bloques, Variables

    Variables

    • Variables PL/SQLDefinidas por el lenguaje 

    • Variables de sesión o usuarioDefinidas por el usuario en una sesión 

    EXEC DBMS_SESSION.SET_CONTEXT('CLIENTCONTEXT', 'myvar', 'myvalue'); 

    SELECT SYS_CONTEXT('CLIENTCONTEXT', 'myvar') FROM dual; 

  • 8/18/2019 Pl SQL Bloques

    11/67

    ETSISIETSISI

    Variables PL/SQLDefinidas por el lenguajeTipos de variables:

    – Escalares. Definidos por el lenguaje

    • NUMBER, CHAR, VARCHAR, VARCHAR2, DATE,BOOLEAN (TRUE, FALSE, NULL)– Compuestos: Definidos por el usuario

    • Registros• Tablas y matrices. Pueden almacenar registros y

    escalares

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    12/67

    ETSISIETSISI

    PL/SQL: Bloques, VariablesVariables PL/SQLDefinidas por el lenguajeSintaxisNombre_V [CONSTANT] tipo de datos 

    [NOT NULL] [:= expresión | := DEFAULT expresion];Expresion   puede ser un literal, otra variable o unaexpresión aritmética.

    Tipos de expresiones:

    – Aritméticas: + - * /– Comparativas: = != > > >=

  • 8/18/2019 Pl SQL Bloques

    13/67

    ETSISIETSISI

    Variables PL/SQLEjemplos

    V_fecha DATE;

    V_departamento NUMBER (3) NOT NULL :=15;

    V_ciudad VARCHAR2(15) :=‘MADRID’;

    C_constante CONSTANT NUMBER :=100;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    14/67

    ETSISIETSISIdic-15 Concepción M. Gascueña 14

    PL/SQL: Bloques, Variables

    SECUENCIASUna secuencia genera números únicos de forma automática.Puede ser compartida por varios usuariosCrear una secuencia

    CREATE SEQUENCE seq_nombre[INCREMENT BY n], (n es el incremento, por defecto es 1) [START WITH n], (n es el número por el que empieza la

    secuencia ) [MAXVALUE n], (n es el máximo valor que puede alcanzar) [MINVALUE n], (n es el mínimo valor que puede alcanzar) 

    ................. ;

  • 8/18/2019 Pl SQL Bloques

    15/67

    ETSISIETSISIdic-15

    SECUENCIAS: NEXTVAL Y CURRVAL NEXTVAL:

    seq_nombre.NEXTVAL se utiliza para obtener el

    próximo número de una secuenciaCURRVAL:seq_nombre.CURRVAL hace referencia al últimonúmero generado de la secuencia

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    16/67

    ETSISIETSISIdic-15

    SECUENCIAS: NEXTVAL Y CURRVAL 

    Para modificar la estructura de la secuencia

    ALTER SEQUENCE seq_nombre

    INCREMENTE BY n

    MAXVALUE m

    MINVALUE p;Borrar una secuencia

    DROP SEQUENCE seq_nombre;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    17/67

    ETSISIETSISI

    PL/SQL: Bloques, VariablesVariables PL/SQL

    Se pueden declarar variables basadas en:– Otras variables previamente declaradas. Para ello se

    utiliza %TYPE, precedido por nombre de la variable

    – Basadas en una columna de una tabla existente en laBD, con %TYPE precedido del nombre de la tabla ycolumna.

    Ejemplo:

    – Var_inventario Number(7,2) ;

    – Var_ media_inventario Var_inventario.% TYPE:=0;La variable Var_inventario debe de existir 

  • 8/18/2019 Pl SQL Bloques

    18/67

    ETSISIETSISI

    Variables PL/SQLEjemploV_nif proveedores.CODPROV %TYPE;

    Variable del mismo tipo que la columna codprov dela tabla proveedoresVar_articulo Almacenes.articulo.%TYPE 

    Las tablas y columnas debe de existir en la BD 

    Los nombres de las variables no deben ser iguales quelos de las columnas de las tablas utilizadas en elbloque.

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    19/67

    ETSISIETSISI

    Variables PL/SQL

    %ROWTYPESe puede declarar una variable registro basándose enuna colección de columnas de una tabla existente en la

    base de datosLos campos toman los nombres y tipos de datos de lascolumnas de dicha tabla.Var_registro tabla%ROWTYPE;

    EjemploRegistroAlmacen Almacen%ROWTYPE;

    Variable de tipo registro de la tabla almacén 

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    20/67

    ETSISIETSISI

    Variables PL/SQL

    Utilidades: INTOPara recoger el resultado de un Select en unavariable se utiliza INTO.SELECT * INTO variableTiporegistroFROM tabla

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    21/67

    ETSISIETSISI

    Variables PL/SQLEjemploIntroduce en el registro Vr_proveedor todos losvalores del proveedor 101; 

    Vr_proveedor proveedores.%ROWTYPESELECT * INTO Vr_proveedorFROM proveedores

    WHERE codprov=101;Si la consulta devolviera más de un registro daría unerror.

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    22/67

    ETSISIETSISI

    Variables PL/SQLEjemplo

    Introduce en la variable precio_arti, de tipo precio, elvalor del precio manipulado, para el articulo 104 .precio_arti proveedores. precio %TYPE;

    SELECT precio *15 INTO precio_arti

    FROM articulos WHERE codart=104;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    23/67

    ETSISIETSISI

    Función DescripciónTo_Number(argumento) Convierte el argumento en tipo Number

    To_Char(argumento) Convierte el argumento en tipo Varchar2

    To_Date(argumento) Convierte el argumento en tipo Date

    PL/SQL: Bloques, VariablesVariables PL/SQLConversiones de datos• Entre escalares se pueden convertir datos de unos

    tipos de datos a otros:

  • 8/18/2019 Pl SQL Bloques

    24/67

    ETSISIETSISI

    Variables de usuarioVariables usadas desde el editor de SQLDEFINE variable1= 31; (crea una variable y asigna valor

    31) SELECT * FROM AlumnoWHERE Cod_grupo =&variable1;

    UNDEFINE variable1; (borra la variable) DEFINE variable1 = 'C01';

    SELECT * FROM conductores

    WHERE Codc = '&variable1';

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    25/67

    ETSISIETSISI

    Variables de usuario

    SELECT *FROM AlumnoWHERE Cod_grupo =&variable1;

    Pide valor por pantalla para Cod_grupo en tiempo deejecución, si la variable variable1 no existe la crea, siexiste toma el valor de ésta.SELECT *

    FROM conductores

    WHERE Codc ='&variable2';

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    26/67

    ETSISIETSISI

    Variables de usuario

    Ejemplos:SELECT *FROM Alumno

    WHERE Ciudad =‘&ciud’;SELECT &colum, NombreFROM AlumnoWHERE Cod_matricula =&cod_ma;

    SELECT &codgru, CiudadFROM AlumnoWHERE &condicion;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    27/67

    ETSISIETSISI

    Variables de usuarioLas variables de sesión deben referenciarse con &.DEFINE; presenta todas las variables de usuario de la

    sesiónCrear un fichero interactivo que pida al usuario losdatos para crear una vista, utilizar los comandosACCEPT variable PROMT para comunicar al usuario lo

    que se quiere.

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    28/67

    ETSISIETSISI

    Variables de usuario

    Crear un fichero en el bloc de notas con lassiguientes sentencias:ACCEPT profe PROMPT ‘proporciona un nombre deprofesor: ‘

    SELECT *FROM ProfesorWHERE Nombre = ‘&profe’

    Guardar en C con el nombreINTERACTIVOProfesor.sqlAbrir desde SQL*PlusEjecutar con Start INTERACTIVOProfesor.sql;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    29/67

    ETSISIETSISI

    Variables de usuarioPodemos crear una vista sobre una tabla pidiendo losdatos al usuario.ACCEPT nombrevista PROMPT 'introduce un nombre

    para la vista:'ACCEPT nombretabla PROMPT 'introduce un nombrepara la tabla:'Create or replace view &nombrevista asSELECT * FROM &nombretabla;

    PL/SQL: Bloques, Variables

  • 8/18/2019 Pl SQL Bloques

    30/67

    ETSISIETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones•

    Excepciones• Estructuras de control•

  • 8/18/2019 Pl SQL Bloques

    31/67

    ETSISIETSISI

    PL/SQL, BloquesEstructura de Bloque en Subprogramas PL/SQLCabecera (procedimiento o función, nombre, lista deparámetros de entrada IN, salida OUT,entrada/salida IN OUT)

    IS variablesDeclaración de objetos: constantescursores, etc..

    BEGIN

    Sentencias ejecutables[RETURN] (sólo para funciones) EXCEPTIONSección de excepcionesEND;

  • 8/18/2019 Pl SQL Bloques

    32/67

    ETSISIETSISI

    PL/SQL, Procedimientos

    Subprogramas, programas compilados yguardados en la BD.

    – Mejoran el Mantenimiento

    – Mejoran la Seguridad e Integridad de losdatos– Mejoran el Rendimiento

  • 8/18/2019 Pl SQL Bloques

    33/67

    ETSISIETSISI

    PL/SQL, Programas

    REGLASAcabar los procedimientos creados directamente en SQLcon un punto para salir de las sentencias, después/EXECUTE Nombre_Procedimiento; (ejecuta el

     procedimiento) Si acaba bien avisa:Procedimiento PL/SQL terminado con éxito.

    Si hay errores avisa:

    Errores para PROCEDURE Nombre_Procedimiento.Si tiene algún error: sale lista de errores, llamando aSHOW ERRORS; ( presenta los errores de compilación) 

  • 8/18/2019 Pl SQL Bloques

    34/67

    ETSISIETSISI

    PL/SQL, Procedimientos

    CREATE OR REPLACE PROCEDURENombre_Procedure (parametros no obligatorios)IS........

    BEGIN...............EXCEPTION-----END Nombre_Procedure;

  • 8/18/2019 Pl SQL Bloques

    35/67

    ETSISIETSISI

    Ejemplo Dada la tabla prueba:PRUEBA ( cod_prueba Number(3),Fecha Date,Primary key (cod_prueba ));

    Crear un bloque Anónimo, directamente en SQL con lo

    siguiente:DECLAREBEGININSERT INTO PRUEBA VALUES (1,SYSDATE);

    END;Se crea compila y ejecuta si no tiene errores de sintaxisComprobar que se ha ejecutado correctamente con

    SELECT * FROM PRUEBA;

    PL/SQL, Procedimientos

  • 8/18/2019 Pl SQL Bloques

    36/67

    ETSISIETSISI

    Ejemplo:Crear un procedimiento que al llamarlo inserte valores(número secuencial, usuario conectado y fecha delsistema) en la tabla Usuarioconex.

    Crear previamente una tabla que recoja el usuario y lafecha de conexión.CREATE TABLE Usuarioconex (

    numero NUMBER(3),usuario VARCHAR2 (10),fecha DATE,Primary key (numero ));

    CREATE SEQUENCE SEC_USER;

    PL/SQL, Procedimientos

  • 8/18/2019 Pl SQL Bloques

    37/67

    ETSISIETSISI

    Procedimiento que al llamarlo inserte valores (número secuencial,

    usuario conectado y fecha del sistema) en la tabla Usuarioconex.

    CREATE OR REPLACE PROCEDURE Conexiones ISBEGIN

    INSERT INTO Usuarioconex VALUES(SEC_USER.NEXTVAL, USER, SYSDATE);

    END Conexiones;

    Ejecutar el procedimiento:EXECUTE Conexiones;SELECT * FROM Usuarioconex; ( para ver si se ha ejecutado )

    PL/SQL, Procedimientos

  • 8/18/2019 Pl SQL Bloques

    38/67

    ETSISIETSISI

    Ejemplo: Crear un procedimiento que inserte un registro en latabla AlmacenesCREATE OR REPLACE PROCEDURE PRO_Almacenes( codigo IN VARCHAR2 ,ciudad IN VARCHAR2, provinciaIN VARCHAR2, articulo IN NUMBER, unidades INNUMBER) ISBEGININSERT INTO ALMACENES VALUES (codigo, ciudad,provincia, articulo, unidades);

    END PRO_Almacenes; . /EXECUTE PRO_Almacenes (&codigo,‘&ciudad’, ‘&provincia’,&articulo, &unidades);Con & delante de la variable pide por panatlla los valores al

    usuario 

    PL/SQL, Procedimientos

  • 8/18/2019 Pl SQL Bloques

    39/67

    ETSISIETSISI

    Procedimientos y Funciones

    Borrar procedimientos y funcionesDROP PROCEDURE Nombre_Procedure;

    DROP FUNCTION Nombre_Funcion;

  • 8/18/2019 Pl SQL Bloques

    40/67

    ETSISIETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control

  • 8/18/2019 Pl SQL Bloques

    41/67

    ETSISIETSISI

    PL/SQL, Funciones

    Las funciones devuelven siempre un valor que hay querecoger en una variable.Solo se introducen los argumentos de entrada.

    EjemploCrear una función PRECIOTOTAL que devuelva lasuma de los precios de los artículos de un determinadoproveedor de la tabla POVEEDORES, el cual se

    introducirá por argumento.

  • 8/18/2019 Pl SQL Bloques

    42/67

    ETSISIETSISI

    CREATE OR REPLACE FUNCTION F_preciototal(cod IN proveedores.codprov%type)RETURN NUMBER IStot number;

    BEGINSELECT Sum(precio) INTO totFROM proveedores, articulosWHERE codprov= cod

    AND codprov=pro_codprov;RETURN (tot);END F_preciototal; ./(compilar sin errores o corregir éstos con Show errors) 

    PL/SQL, Funciones

  • 8/18/2019 Pl SQL Bloques

    43/67

    ETSISIETSISI

    EJECUTAR LA FUNCIÓN

    Crear una variable de enlace de tipo Number, en elSQL PLUS:

    VARIABLE VAR1 NUMBER;

    Ejecutar la funciónEXECUTE :VAR1:=F_preciototal(103);

    Avisa:

    Procedimiento PL/SQL terminado con éxito.Imprimir por pantalla el valor de la funciónPRINT :VAR1;

    PL/SQL, Funciones

  • 8/18/2019 Pl SQL Bloques

    44/67

    ETSISIETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control

  • 8/18/2019 Pl SQL Bloques

    45/67

    ETSISIETSISI

    Excepciones:– Una excepción se produce cuando ocurre un error en

    un programa PL/SQL– Ocurre un error se lanza una excepción

    • Si está controlada por el programa se trata en la zona de

    Excepciones del bloque PL/SQL.• Si no está controlada el programa se detiene.

    – Se pueden declarar por el usuario en la zonaDECLARE, se lanzan durante la ejecución con RAISE

     y se tratan como el resto en la zona EXCEPTION– Hay excepciones definidas por ORACLE que selanzan automáticamente.

    – Utilizan las funciones de error de SQL y PL/SQL

    PL/SQL, Excepciones

  • 8/18/2019 Pl SQL Bloques

    46/67

    ETSISIETSISI

    Excepciones predefinidas por OracleEjemplo

    DECLARE….

    BEGIN…………..EXCEPTIONWHEN NO_DATA_FOUND THENsentencias que quiero realizar

    END

    PL/SQL, Excepciones

  • 8/18/2019 Pl SQL Bloques

    47/67

    ETSISIETSISI

    Excepciones definidas por el usuarioEjemploDECLAREUser_exception  EXCEPTION;BEGIN

    If var>8 then RAISE User_exception …………..EXCEPTIONWHEN User_exception THEN

    Rollback;DBMS_OUTPUT.PUT(‘Mensaje’);

    WHEN OTHER THEN----------

    END

    PL/SQL, Excepciones

    Se declara la

    excepción

    Se produce el error y se

    genera la excepción con

    RAISE

    Se trata la excepción

  • 8/18/2019 Pl SQL Bloques

    48/67

    ETSISIETSISI

    Mensajes de error cuando se provoca una excepción:

    DBMS_OUTPUT.put_line(‘Mensaje aviso al usuario’)

    Para los mensajes de error definidos por el usuario

    RAISE_APPLICATION_ERROR(,)Donde:

    error_num es un entero negativo comprendido entre

    -20000 y -20999mensaje: que avisa al usuario de lo que ocurre

    PL/SQL, Excepciones

    /

  • 8/18/2019 Pl SQL Bloques

    49/67

    ETSISIETSISI

    La excepción Other

    WHEN OTHERS THENRutina especial que se ejecuta para todas las excepciones no

    tratadas con anterioridad en la zona EXCEPTION. Debe deir la última dentro de ella

    Con SQLCODE se recupera el código de error contempladopor Oracle que provoda la excepciónSQLERRM permite recuperar el texto asociado al codigo

    de error actual que ha provocado la excepción.Por ejemploDBMS_OUTPUT.put_line('Error'||SQLCODE||SQLERRM)

    PL/SQL, Excepciones

    / E

  • 8/18/2019 Pl SQL Bloques

    50/67

    ETSISIETSISI

    Ejemplo 1

    CREATE FUNCTION divide(dividendo NUMBER, divisorNUMBER) IS Return Number;DECLARE

    resul Number;BEGIN

    resul=dividendo/divisor;EXCEPTIONWHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero) 

    DBMS_OUTPUT.PUT_LINE(‘No puedes dividir por cero’);

    WHEN OTHERS THENRAISE_APPLICATION_ERROR(-20001, ‘Hay un error no definido');END;

    PL/SQL, Excepciones

    PL/ L E

  • 8/18/2019 Pl SQL Bloques

    51/67

    ETSISIETSISI

    Ejemplo 2

    CREATE FUNCTION divide(dividendo NUMBER, divisorNUMBER) IS Return Number;DECLARE

    resul Number;errNum Number;

    BEGINresul=dividendo/divisor;

    EXCEPTIONWHEN ZERO_DIVIDE THEN --(Se ejecuta cuando divisor es cero) 

    DBMS_OUTPUT.PUT_LINE(‘No puedes dividir por cero’);WHEN OTHERS THENerrNum := SQLCODE; /*NUMERO DE ERROR DE sql*/RAISE_APPLICATION_ERROR(-20000, errNum);

    END;

    PL/SQL, Excepciones

    PL/ QL E

  • 8/18/2019 Pl SQL Bloques

    52/67

    ETSISIETSISI

    Algunas excepciones predefinidas por OracleDUP_VAL_ON_INDEXEsta excepción se crea cuando se intenta almacenar unvalor duplicado en la clave primaria o en una columna conrestricción UNIQUE. SQL_CODE= -1 (ORA-00001)INVALID_NUMBEREn una sentencia SQL, una cadena de caracteres norepresenta un número válido. SQL_CODE= -1722NO_DATA_FOUNDNo se encuentran valores en alguna acción SQL pedida.SQL_CODE= 100

    NOTA : SQL_CODE: es el número de error interno de

    Oracle. Está asociado a un mensaje.

    PL/SQL, Excepciones

    PL/SQL E i

  • 8/18/2019 Pl SQL Bloques

    53/67

    ETSISIETSISI

    Algunas excepciones predefinidas por OracleTOO_MANY_ROWSUna sentencia SELECT INTO devuelve más de una fila.SQL_CODE= -1422ZERO_DIVIDE THENS e ejecuta cuando se intenta dividir por cero. SQL_CODE=-1476VALUE_ERROR

    Ocurre un error aritmético, de conversión o truncamiento.Por ejemplo cuando se intenta introducir un valor mayor queel tamaño de la variable SQL_CODE= -6502

    PL/SQL, Excepciones

    PL/SQL

  • 8/18/2019 Pl SQL Bloques

    54/67

    ETSISIETSISI

    PL/SQL

    • Bloques PL/SQL• Introducción• Variables• Procedimientos• Funciones• Excepciones• Estructuras de control

  • 8/18/2019 Pl SQL Bloques

    55/67

    ETSISIETSISI

    PL/SQL, Estructuras de Control

    BUCLES• Bucles simples (LOOP).

    • Bucles condicionales (WHILE)

    • Bucles numéricos (FOR)

  • 8/18/2019 Pl SQL Bloques

    56/67

    ETSISIETSISI

    IF THEN sentencias; END IF;IF THEN sentencias 1ELSE sentencias 2

    END IF;

    IF THEN sentencias 1ELSIF THEN sentencias 2;…………………

    ELSIF THEN Sentencias n;END IF;

    PL/SQL, Estructuras de Control

  • 8/18/2019 Pl SQL Bloques

    57/67

    ETSISIETSISI

    Bucles: Repiten una sentencia o una secuencia desentencias varias vecesTres tipos de bucles

    – Bucle Básico LOOP, acciones repetitivas sin

    condiciones. EXIT condición (para salir del bucle)– Bucle FOR, control iterativo de acciones un

    número determinado de veces– Bucle WHILE, control iterativo basándose en una

    condición.– END terminan los bucles;

    PL/SQL, Estructuras de Control

  • 8/18/2019 Pl SQL Bloques

    58/67

    ETSISIETSISI

    LOOPSentencia 1;………………

    EXIT [WHEN condición];

    END LOOP;Condición es una expresión o variable booleana (TRUE,FALSE, NULL);Mientras no se cumpla la condición el bucle se sigue

    ejecutando

    PL/SQL, Estructuras de Control

  • 8/18/2019 Pl SQL Bloques

    59/67

    ETSISIETSISI

    Bloque anónimo:DeclareVar_contador NUMBER :=1;SALIR BOOLEAN :=FALSE;BEGIN

    LOOPVar_contador:= Var_contador+1;INSERT INTO PRUEBA VALUES (Var_contador,SYSDATE);IF Var_contador = 5 THENSALIR:=TRUE;END IF;

    EXIT WHEN SALIR;END LOOP;

    END;

    PL/SQL, Estructuras de Control

  • 8/18/2019 Pl SQL Bloques

    60/67

    ETSISIETSISI

    PL/SQL, Bucle FORFOR Var_contador IN [REVERSE] Mínimo…Máximo

    LOOPSentencias1;………………..Sentencias n;

    END LOOP;– Var_contador, variable que no hace falta declararpreviamente, actúa como variable contador, con INaumenta de uno en uno y no hay que actualizar.

    – Cuando recorre todos los valores del rango acaba elbucle.

    – Var_contador , con Reverse, empieza en Máximo ydecrementa de uno en uno hasta Mínimo

  • 8/18/2019 Pl SQL Bloques

    61/67

    ETSISIETSISI

    PL/SQL, Bucle FOREjemplo

    Bloque anónimo utilizando FORDECLARE

    BEGIN

    FOR i IN 1..4LOOP

    INSERT INTO USUARIOCONEX VALUES(SEC_USER.NEXTVAL, USER, SYSDATE);

    END LOOP;

    END;

    Realiza el bucle cuatro veces 

  • 8/18/2019 Pl SQL Bloques

    62/67

    ETSISIETSISI

    PL/SQL, Bucle WHILE

    WHILE condiciónLOOPSentencia 1;

    ……………..Sentencia n;

    END LOOP;

    La condición es evaluada en cada iteración y mientrassea TRUE, se ejecutan las sentencias reiteradamente.

  • 8/18/2019 Pl SQL Bloques

    63/67

  • 8/18/2019 Pl SQL Bloques

    64/67

    ETSISIETSISI

    PL/SQL, Estructuras de Control

    Ejecutar el procedimiento llamándoloEXECUTE Preciomaximo(5);EXECUTE Preciomaximo(50);HACER COMMIT;

    Select* from articulos;Select * from prueba;

    Realiza un procedimiento llamado MAXIMOPROV,que controle un error en la sección EXCEPTION

    CREATE OR REPLACE PROCEDURE MAXIMOPROV (MAXIM

  • 8/18/2019 Pl SQL Bloques

    65/67

    ETSISI

    E E E L E EDU E M X M V (M X MIN NUMBER ) ISPRECIOMAX ARTICULOS.PRECIO%TYPE :=0;

    BEGINWHILE PRECIOMAX < MAXIM loopSELECT MAX(ARTICULOS.PRECIO) INTO PRECIOMAX

    FROM ARTICULOS GROUP BY PRO_CODPROV;INSERT INTO PRUEBA VALUES (MAXIM, SYSDATE);PRECIOMAX := MAXIM;

    END LOOP;EXCEPTION

    WHEN TOO_MANY_ROWS THENRAISE_APPLICATION_ERROR(-20000, 'HOLAhay Demasiados registros');

    END MAXIMOPROV;

  • 8/18/2019 Pl SQL Bloques

    66/67

    ETSISI

    create or replace

    PROCEDURE XXXXXXX as

    ide SE.id_e% TYPE;

    cantidad integer;

    CURSOR cursor_1 IS SELECT Id_E , COUNT(*) as cantidad

    FROM SEGROUP BY Id_E

    HAVING COUNT(*) = (

    SELECT NE FROM E

    WHERE E.id_E = SE.Id_E

    );

    fila cursor_1%ROWTYPE;

    BEGIN

    DBMS_OUTPUT.PUT_LINE('Resultado de la consulta');

    OPEN cursor_1;

    LOOP

    FETCH cursor_1 INTO fila;

    EXIT WHEN cursor_1%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE('Id= '|| to_Char(fila.Id_E)||' cantidad= '||to_Char(fila.cantidad));

    END LOOP;

    CLOSE cursor_1;

    END XXXXXXX;

  • 8/18/2019 Pl SQL Bloques

    67/67

     Nota: El punto y barra que aparecen al final de

    los procedimientos y funciones ./ son

    opcionales y significan el punto archiva en

     procedimiento y la barra comprueba la

    sintaxis.