Está en la página 1de 24

PROGRAMACIN DE BASES DE DATOS

PL/SQL Introduccin
Teora y prctica.

PL/SQL

SQL es un lenguaje de consulta para los sistemas de bases de datos relacionales, pero que no posee la potencia de los lenguajes de programacin. Cuando se desea realizar una aplicacin completa para el manejo de una base de datos relacional, resulta necesario utilizar alguna herramienta que soporte la capacidad de consulta del SQL y la versatilidad de los lenguajes de programacin tradicionales. PL/SQL es el lenguaje de programacin que proporciona Oracle para extender el SQL estndar con 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 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

Comentarios:

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 Profesor Orlando Seplveda lnea.

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 tipo de una columna de una tabla de la base de datos, o las propiedades de la 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 decir NUMBER(9,2)) la variable nom tomar el tipo de datos asignado a la columna nombre de la tabla personas.
Profesor Orlando Seplveda

El paquete DBMS_OUTPUT

PL/SQL no dispone de funciones de E/S, no es un lenguaje creado para interactuar con el usuario, sino para trabajar con la base de datos. Oracle incorpora una serie de paquetes para ser utilizados dentro del cdigo PL/SQL. Es el caso del paquete DBMS_OUTPUT que sirve para utilizar funciones y procedimientos de escritura como PUT_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'; Se puede utilizar SQL%Atributo para v_materno VARCHAR2(15) := 'Soto'; verificar la ejecucin de una sentencia v_nombre VARCHAR2(20) := 'Marcos'; SQL, donde atributo puede ser: v_rut VARCHAR(10) := '103456783'; Found: Devuelve TRUE si la sentencia BEGIN tuvo xito UPDATE estudiante NotFound: Devuelve TRUE si la SET curso = v_curso sentencia no tuvo xito 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;
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 de entrada/salida de datos. Sin embargo, como ya vimos el semestre pasado, SQL tiene la posibilidad de 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 las variables. 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

También podría gustarte