plsql(1).introducción

24
PROGRAMACIÓN DE BASES DE DATOS PL/SQL Introducción Teoría y práctica.

Upload: leilani-henderson

Post on 18-Oct-2015

20 views

Category:

Documents


0 download

TRANSCRIPT

  • PROGRAMACIN DE BASES DE DATOS

    PL/SQL IntroduccinTeora y prctica.

  • PL/SQL

    SQL es un lenguaje de consulta para los sistemasde bases de datos relacionales, pero que no poseela potencia de los lenguajes de programacin.Cuando se desea realizar una aplicacin completapara el manejo de una base de datos relacional,resulta necesario utilizar alguna herramienta quesoporte la capacidad de consulta del SQL y laversatilidad de los lenguajes de programacintradicionales.

    PL/SQL es el lenguaje de programacin queproporciona Oracle para extender el SQL estndarcon otro tipo de instrucciones.

    Profesor Orlando Seplveda

  • Bloques en PL/SQL

    El elemento principal del PL/SQL es el bloque,

    que contendr sentencias condicionales,

    bucles, llamadas a procedimientos y/o

    funciones, otros bloques (bloques anidados),

    etc...

    Si el bloque se declara usando las palabras

    reservadas PROCEDURE o FUNCTION se

    habla de un bloque nominado o nombrado. Si

    el bloque no se declara como procedimiento o

    funcin se trata de un bloque annimo.

    Profesor Orlando Seplveda

  • Estructura de un bloque

    Los bloques PL/SQL presentan una estructura especfica

    compuesta de tres partes bien diferenciadas:

    La seccin declarativa en donde se declaran todas las

    constantes y variables que se van a utilizar en la ejecucin

    del bloque.

    La seccin de ejecucin que incluye las instrucciones que

    se ejecutarn en el bloque PL/SQL.

    La seccin de excepciones en donde se definen los

    manejadores de errores que soportar el bloque PL/SQL.

    Cada una de las partes anteriores se delimita por una

    palabra reservada, de modo que un bloque PL/SQL se

    puede representar como sigue:

    Profesor Orlando Seplveda

  • Bloque PL/SQL

    DECLARE

    /* Seccin de Declaraciones */

    BEGIN

    /* Seccin de Ejecucin */

    EXCEPTION

    /* Seccin de Excepciones */

    END;

    De las anteriores, nicamente la seccin de ejecucin es obligatoria,

    que queda delimitada entre las clusulas BEGIN y END.

    Profesor Orlando Seplveda

  • Normas

    Normas bsicas

    La mayor parte de las normas de escritura en PL/SQL proceden de SQL, por ejemplo:

    Las palabras clave, nombres de tabla y columna, funciones, no distinguen entre maysculas y minsculas

    Todas las instrucciones finalizan con el signo de punto y coma (;), excepto las que encabezan un bloque.

    Las instrucciones pueden ocupar varias lneas

    Comentarios:

    Comentarios de varias lneas. Comienzan con /* y terminan con */

    Comentarios de lnea simple. Son los que utilizan los signos -- (doble guin). El texto a la derecha de los guiones se considera comentario (el de la izquierda no).

    Profesor Orlando Seplveda

  • Ejemplo de bloque annimo genrico

    DECLARE

    nombre_variable VARCHAR2(5);

    nombre_excepcion EXCEPTION;

    BEGIN

    SELECT nombre_columna

    INTO nombre_variable

    FROM nombre_tabla;

    EXCEPTION --Control de errores

    WHEN nombre_excepcion THEN ...

    END;

    Profesor Orlando Seplveda

  • Variables

    Las variables se declaran en el apartado

    DECLARE del bloque. La sintaxis de la

    declaracin de variables es:identificador [CONSTANT] tipoDeDatos [NOT NULL] [:=

    valorInicial] ;

    [siguienteVariable]

    El operador := se usa para asignar valores a una variable.

    Con l se inicializa la variable con un valor determinado. En

    caso contrario sta contendr el valor NULL.

    La palabra CONSTANT indica que la variable no puede ser

    modificada (es una constante).

    Profesor Orlando Seplveda

  • Variables

    Ejemplos

    pi CONSTANT NUMBER(9,7) := 3.1415927;

    radio NUMBER(5);

    cadena varchar2 := Juan

    Los identificadores de Oracle deben tener 30

    caracteres, empezar por letra y continuar con letras,

    nmeros o guiones bajos (_) (tambin es vlido el signo

    de dlar ($) y la almohadilla (#). No deben coincidir con

    nombres de columnas de las tablas ni con palabras

    reservadas (como SELECT).

    En PL/SQL slo se puede declarar una variable por

    lnea. Profesor Orlando Seplveda

  • Tipos de datos

    Profesor Orlando Seplveda

  • Declaraciones implcitas: Expresin %TYPE y

    %ROWTYPE

    Se utiliza para dar a una variable el mismo tipo de otra variable, el tipode una columna de una tabla de la base de datos, o las propiedades dela fila completa de una tabla. La sintaxis es:

    Identificador variable|tabla.columna%TYPE;

    Identificador tabla.%ROWTYPE;

    Ejemplos:

    nom personas.nombre%TYPE;

    precio NUMBER(9,2);

    precio_iva precio%TYPE;

    lFila persona%ROWTYPE;

    La variable precio_iva tomar el tipo de la variable precio (es decirNUMBER(9,2)) la variable nom tomar el tipo de datos asignado a lacolumna nombre de la tabla personas.

    Profesor Orlando Seplveda

  • El paquete DBMS_OUTPUT

    PL/SQL no dispone de funciones de E/S, no es unlenguaje creado para interactuar con el usuario, sinopara trabajar con la base de datos.

    Oracle incorpora una serie de paquetes para serutilizados dentro del cdigo PL/SQL. Es el caso delpaquete DBMS_OUTPUT que sirve para utilizarfunciones y procedimientos de escritura comoPUT_LINE.

    DBMS_OUTPUT.PUT_LINE(Hola Mundo)

    Profesor Orlando Seplveda

  • Metamos las manos

    DECLARE

    a NUMBER := 17;

    BEGIN

    DBMS_OUTPUT.PUT_LINE(a);

    END;

    Profesor Orlando Seplveda

  • Ejemplo 2

    SET SERVEROUTPUT ON

    DECLARE

    saludar VARCHAR2(20) := 'Hola Mundo';

    BEGIN

    DBMS_OUTPUT.PUT_LINE(saludar);

    END;

    Profesor Orlando Seplveda

  • Uso de may/min en identificadores

    DECLARE

    "variable muy extraa" NUMBER := 10;

    BEGIN

    DBMS_OUTPUT.PUT_LINE("variable muy

    extraa");

    END;

    Profesor Orlando Seplveda

  • Alcance de las variables

    En PL/SQL puede haber un bloque dentro de

    otro bloque. Un bloque puede anidarse dentro

    de:

    - Un apartado BEGIN

    - Un apartado EXCEPTION

    Hay que tener en cuenta que las variables

    declaradas en un bloque concreto, son

    eliminadas cuando ste acaba (con su END

    correspondiente).

    Profesor Orlando Seplveda

  • Ejemplo alcance variables

    SET SERVEROUTPUT ON

    DECLARE

    varexterna NUMBER := 2;

    BEGIN

    varexterna := varexterna * 2;

    DECLARE

    varinterna NUMBER := 3;

    BEGIN

    varinterna := varexterna * 3;

    DBMS_OUTPUT.PUT_LINE(varinterna); -- escribe 12

    DBMS_OUTPUT.PUT_LINE(varexterna); -- escribe 4

    END;

    DBMS_OUTPUT.PUT_LINE(varexterna * 2); -- escribe 8

    --DBMS_OUTPUT.PUT_LINE(varinterna); -- producir un error

    END;Profesor Orlando Seplveda

  • Un ejemplo ms complejo

    SET SERVEROUTPUT ON

    DECLARE

    sFecha varchar2(40);

    BEGIN

    select to_char(sysdate, 'dd/mm/yyyy

    hh24:mm:ss')

    into sFecha from dual;

    DBMS_OUTPUT.PUT_LINE('Hoy es: ' || sFecha);

    END;

    Profesor Orlando Seplveda

  • Tarea

    Crear un bloque annimo que declare paterno,

    materno y nombre y luego muestre el nombre

    completo concatenado.

    Crear un bloque annimo que muestre la

    suma de tres nmeros enteros.

    Profesor Orlando Seplveda

  • Preparando el espacio para el siguiente ejemplo.

    Cree la secuencia y tabla que se indican:

    CREATE SEQUENCE ESTUD_SEQUENCE;

    START WITH 1

    INCREMENT BY 1

    MAXVALUE 999999

    MINVALUE 1;

    CREATE TABLE ESTUDIANTE (

    IDESTUDIANTE NUMBER NOT NULL,

    RUT VARCHAR2(10) NOT NULL,

    PATERNO VARCHAR2(15) NOT NULL,

    MATERNO VARCHAR2(15) NOT NULL,

    NOMBRE VARCHAR2(20) NOT NULL,

    CURSO VARCHAR2(25),

    CONSTRAINT PK_ESTUDIANTE PRIMARY KEY (IDESTUDIANTE)

    );

    Profesor Orlando Seplveda

  • Ejemplo 5: Interactuando con la tabla

    DECLARE

    v_curso VARCHAR2(25) := 'Master';

    v_paterno VARCHAR2(15) := 'Rivera';

    v_materno VARCHAR2(15) := 'Soto';

    v_nombre VARCHAR2(20) := 'Marcos';

    v_rut VARCHAR(10) := '103456783';

    BEGIN

    UPDATE estudiante

    SET curso = v_curso

    WHERE rut = v_rut;

    IF SQL%NOTFOUND THEN

    INSERT INTO estudiante (IdEstudiante, Rut, Paterno, Materno, Nombre, Curso)

    VALUES(ESTUD_SEQUENCE.NEXTVAL, v_rut, v_paterno, v_materno, v_nombre, v_curso);

    END IF;

    END;

    Se puede utilizar SQL%Atributo para

    verificar la ejecucin de una sentencia

    SQL, donde atributo puede ser:

    Found: Devuelve TRUE si la sentencia

    tuvo xito

    NotFound: Devuelve TRUE si la

    sentencia no tuvo xito

    Profesor Orlando Seplveda

  • Ejemplo 6: Recuperando datos de una tabla

    DECLARE

    v_rut VARCHAR(10) := '103456783';

    v_paterno VARCHAR2(15);

    v_materno VARCHAR2(15);

    v_nombre VARCHAR2(15);

    BEGIN -- Recupera los datos del estudiante con el rut indicado

    SELECT paterno, materno, nombre

    INTO v_paterno, V_MATERNO, V_NOMBRE

    FROM estudiante

    WHERE rut = v_rut;

    DBMS_OUTPUT.PUT_LINE('Nombre del alumno: ' || v_paterno || ' ' ||

    v_materno || ' ' || v_nombre);

    END;Profesor Orlando Seplveda

  • SQL auxilia a PL/SQL (Variables de sustitucin)

    PL/SQL no posee comandos ni funciones deentrada/salida de datos. Sin embargo, como yavimos el semestre pasado, SQL tiene la posibilidadde incluir parmetros en sus consultas con el signo&, lo que se conoce como variable de sustitucin.PL/SQL acepta el uso de dichos parmetros en lasvariables.

    Efecte las correcciones siguientes en el bloque:

    v_rut VARCHAR(10);

    WHERE rut = '&v_rut';

    Ejecute el bloque y proporcione el dato solicitado.

    Profesor Orlando Seplveda

  • Controlando errores

    Sin embargo. Si Ud. proporciona un rut inexistente, se

    producir un error. Ese error es posible interceptarlo.

    Agregue antes del END el cdigo siguiente:

    EXCEPTION

    /* Inicio de la seccin de excepciones */

    WHEN NO_DATA_FOUND THEN

    -- Manejamos la condicin de error

    DBMS_OUTPUT.PUT_LINE('Alumno no encontrado');

    Profesor Orlando Seplveda