plsql(1).introducción
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