Академический Документы
Профессиональный Документы
Культура Документы
Introduccin a
PL/SQL
Cap.1
Declarando Variables
P
R
O
Y
E
C
T
O
hrueda@telebucaramanga.com.co
PL/SQL
I
N
T
E
L
I
G
E
N
T
E
PL/SQL
Manejo de Errores
Mantenimiento sencillo
Integridad de datos - Transacciones
Claridad en el cdigo
Procedimientos almacenados en la
base de datos
Lgica del Negocio
Bloque PL/SQL
DECLARE (opcional)
...
BEGIN (obligatoria)
...
EXCEPTION (opcional)
...
END; (obligatoria)
Tipos de Bloques
(Construcciones de Programa)
Bloques Annimos
Procedures
Functions
Packages
Triggers
Objects
Tipos de Variables
Variables PL/SQL:
Scalar
Composite
Reference
LOB (Large Objects)
P
R
O
Y
E
C
T
O
Bind y Host
Declaracin de Variables
I
N
T
E
L
I
G
E
N
T
E
Variables no PL/SQL:
Variables Escalares
lnea NUMBER(8,0);
direcc VARCHAR2(60) := Centro;
retiro DATE := SYSDATE;
meses CONSTANT NUMBER(1) := 8;
Codificacin
Estndares
No usar nombres de variables, similares
a nombres de columnas
Una variable en cada lnea
No usar la clusula NOT NULL
(Rendimiento)
CHAR
VARCHAR2
LONG
LONG RAW
NUMBER
BINARY_INTEGER
PLS_INTEGER
BOOLEAN
DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
Atributo %TYPE
%TYPE
DECLARE
rlinea
linea.nro_linea%TYPE;
tSaldo NUMBER(14,2);
pSaldo tSaldo%TYPE;
...
P
R
O
Y
E
C
T
O
BOOLEANOS
DECLARE
Cap. 2
existe BOOLEAN;
esMayor BOOLEAN;
BEGIN
I
N
T
E
L
I
G
E
N
T
E
existe := TRUE;
esMayor := 200 < 1000;
Escribiendo Sentencias
Ejecutables
Identificadores
Hasta 30 caracteres
Iniciar con una letra
Puede contener caracteres especiales
No puede contener espacios, tildes o /
No usar nombres de la base de datos
Obviamente no deben ser palabras
reservadas
Comentarios
Alcance de Variables
...
X NUMBER(5);
BEGIN
...
DECLARE
y NUMBER(5);
BEGIN
Y := X;
P
R
O
Y
E
C
T
O
END;
...
END;
I
N
T
E
L
I
G
E
N
T
E
Operadores
Iguales a SQL
** Exponente
Anidacin de Bloques
Cap 3.
Interactuando con la BD
Sentencias SQL
SELECT
SET SERVEROUTPUT ON
DECLARE
sSaldo NUMBER(14,2);
plinea saldo.linea%TYPE = 6799833;
BEGIN
SELECT SUM(facturado)
INTO sSaldo
FROM saldo
WHERE linea = plinea;
DBMS_OUTPUT.PUT_LINE(Suma= || sSaldo);
P
R
O
Y
E
C
T
O
END;
/
SELECT
I
N
T
E
L
I
G
E
N
T
E
La cantidad de columnas
seleccionadas, debe coincidir en tipo y
cantidad con las especificadas en la
clusula INTO
SELECT
INSERT
DECLARE
fecha DATE := SYSDATE;
BEGIN
INSERT INTO log_sesion
VALUES (USER, fecha);
END;
UPDATE
DECLARE
horas NUMBER(6,2) := 1/24;
BEGIN
UPDATE log_sesion
SET fecha = fecha + horas
WHERE usuario = HRR;
END;
DELETE
DECLARE
vusuario log_sesion.usuario%TYPE := HRR;
BEGIN
DELETE FROM log_sesion
WHERE usuario = vusuario;
END;
P
R
O
Y
E
C
T
O
Nomenclatura Nombres
I
N
T
E
L
I
G
E
N
T
E
El Cursor SQL
SQL%ROWCOUNT
SQL%FOUND
SQL%NOTFOUND
SQL%ISOPEN
Ejemplo
SET SERVEROUTPUT ON
BEGIN
DELETE FROM empleado
WHERE departamento = 20;
DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT||
registros borrados);
END;
Control de Transacciones
Ejemplo CASE
Cap. 4
Estructuras de Control
P
R
O
Y
E
C
T
O
IF
DECLARE
nEstado NUMBER(1);
vEstado VARCHAR2(20);
BEGIN
vEstado := CASE nEstado
WHEN 1 THEN Bueno
WHEN 2 THEN Regular
WHEN 3 THEN Malo
ELSE Desconocido
END;
IF condiciones THEN
...
Ej:
x := 5;
y := NULL;
IF x != y THEN
...
I
N
T
E
L
I
G
E
N
T
E
ELSE
...
(No se ejecuta!)
END IF
CASE
CASE selector
WHEN expr1 THEN ret1
WHEN expr2 THEN ret2
...
WHEN exprN THEN retN
ELSE retN+1
END;
END IF;
LOOPS
LOOP
Instrucciones
...
(EXIT WHEN condiciones)
END LOOP;
WHILE
WHILE condiciones LOOP
instrucciones
...
END LOOP;
P
R
O
Y
E
C
T
O
FOR
FOR contador IN (REVERSE) desde..hasta
LOOP
Instruccin
...
END LOOP;
I
N
T
E
L
I
G
E
N
T
E
PL/SQL Records
PL/SQL Collections
INDEX BY Table
Nested Table
VARRAY
PL/SQL Records
Sintaxis - Ejemplos
Cap. 5
DECLARE
...
TYPE tEmpleado IS RECORD
( cedula NUMBER(10,0),
nombre VARCHAR2(60),
ingreso DATE
);
rEmpleado tEmpleado;
Utilizacin
BEGIN
SELECT cedula, nombre, hire_date
INTO rEmpleado
FROM empleado
WHERE apellido = King;
INDEX BY Tables
P
R
O
Y
E
C
T
O
DBMS_OUTPUT.PUT_LINE(rEmpleado.cedula||
rEmpleado.nombre || rEmpleado.ingreso);
END;
Atributo %ROWTYPE
I
N
T
E
L
I
G
E
N
T
E
Sintaxis
DECLARE
tVector IS TABLE OF NUMBER(10)
INDEX BY BINARY_INTEGER;
Ej:
DECLARE
...
Emp
rEmpleado%ROWTYPE;
Dep
departments%ROWTYPE;
vDatos tVector;
tEmp IS TABLE OF empleado%ROWTYPE
INDEX BY BINARY_INTEGER;
vEmpleados tEmp;
Mtodos Utilizados
EXISTS
COUNT
FIRST, LAST
PRIOR
NEXT
TRIM
DELETE
Ejemplo
P
R
O
Y
E
C
T
O
DECLARE
TYPE tEmp IS TABLE OF employees%ROWTYPE
INDEX BY BINARY_INTEGER;
hasta
NUMBER(3) := 104;
vEmp
tEmp;
BEGIN
FOR i IN 100 .. Hasta LOOP
SELECT *
INTO vEmp(i) FROM employees
WHERE employee_id = i;
END LOOP;
FOR i IN vEmp.FIRST .. vEmp.LAST LOOP
DBMS_OUTPUT.PUT_LINE(vEmp(i).name);
END LOOP;
END;
Declaracin
DECLARE
CURSOR nombre IS
SELECT cedula, nombre
FROM empleado;
Abrir el Cursor
Cap. 6
OPEN nombre;
I
N
T
E
L
I
G
E
N
T
E
Cursores
OPEN
FETCH (N veces)
CLOSE
10
Cerrar el Cursor
CLOSE nombrecursor;
P
R
O
Y
E
C
T
O
I
N
T
E
L
I
G
E
N
T
E
%ISOPEN
%NOTFOUND
%FOUND
%ROWCOUNT
Ejemplo
DECLARE
CURSOR cEmpleados IS
SELECT cedula, nombre, dpto
FROM empleados;
BEGIN
FOR j IN cEmpleados LOOP
-- puedo usar j.cedula, j.nombre, j.dpto
...
END LOOP;
END;
Cursores y Registros
DECLARE
CURSOR cEmpleados IS
SELECT cedula, nombre, dpto
FROM empleados;
rEmp cEmpleados%ROWTYPE;
BEGIN
OPEN cEmpleados;
LOOP
FETCH cEmpleados INTO rEmp;
...
BEGIN
FOR j IN (SELECT cedula, nombre, dpto
FROM empleados) LOOP
-- puedo usar j.cedula, j.nombre, j.dpto
...
END LOOP;
END;
11
Ejemplo 2
Cap. 7
Conceptos Avanzados de
Cursores
P
R
O
Y
E
C
T
O
I
N
T
E
L
I
G
E
N
T
E
Ejemplo
DECLARE
CURSOR cEmpleados(x NUMBER) IS
SELECT cedula, nombre, salario
FROM empleados
WHERE dpto = x;
rEmp cEmpleados%TYPE;
BEGIN
OPEN cEmpleados(20);
LOOP
FETCH cEmpleados INTO rEmp;
...
DECLARE
CURSOR cEmpleados(x NUMBER) IS
SELECT cedula, nombre, salario
FROM empleados
WHERE dpto = x;
BEGIN
FOR i IN cEmpleados(20) LOOP
...
END LOOP;
END;
Ejemplo 3
DECLARE
x NUMBER := 20;
BEGIN
FOR i IN (SELECT cedula, nombre, salario
FROM empleados
WHERE dpto = x) LOOP
...
END LOOP;
END;
12
P
R
O
Y
E
C
T
O
DECLARE
CURSOR cEmp IS
SELECT cedula, nombre, salario
FROM empleados
FOR UPDATE OF salario;
BEGIN
FOR i IN cEmp LOOP
IF i.salario < 5000 THEN
UPDATE empleados
SET salario = 5000
WHERE CURRENT OF cEmp;
END IF;
...
DECLARE
...
BEGIN
...
EXCEPTION
...
END;
I
N
T
E
L
I
G
E
N
T
E
Exception
EXCEPTION
WHEN excep1 THEN
...
WHEN excep2 THEN
...
WHEN others THEN
...
Excepciones en PL/SQL
NO_DATA_FOUND
TOO_MANY_ROWS
INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
13
P
R
O
Y
E
C
T
O
I
N
T
E
L
I
G
E
N
T
E
DECLARE
falla EXCEPTION;
PRAGMA EXCEPTION_INIT (falla, -2292);
BEGIN
DELETE FROM departments
WHERE dept_id = 20;
COMMIT;
EXCEPTION
WHEN falla THEN
DBMS_OUTPUT (Violacin de FK);
END;
RAISE_APPLICATION_ERROR
Ejemplo
BEGIN
DELETE FROM departments
WHERE dept_id = 20;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR (-20111,
Imposible Continuar);
END IF;
...
END;
SQLCODE
SQLERRM
Bitcoras
Reversar procesos
Generar mensajes por Pantalla o
alarmas.
Cap. 9
Creando Procedures
14
Definicin
CREATE OR REPLACE PROCEDURE nombre (parms)
IS
-- Declaracion de Variables
BEGIN
-- cuerpo del programa
END;
P
R
O
Y
E
C
T
O
Parmetros de Entrada
I
N
T
E
L
I
G
E
N
T
E
Ejemplos de Llamado
CREATE OR REPLACE PROCEDURE
sumaSueldos (
dpto IN NUMBER,
sueldo IN NUMBER,
suma OUT NUMBER) IS
BEGIN
...
END;
DECLARE
xyz NUMBER;
BEGIN
sumaSueldos (20, 0, xyz);
sumaSueldos (sueldo=>0, dpto=>20, xyz);
sumaSueldos(20,0); -- ERROR!!
sumaSueldos(20,0,3); -- ERROR!!
END;
Ejemplos de Llamado
CREATE OR REPLACE PROCEDURE
sumaSueldos (
dpto IN NUMBER,
sueldo IN NUMBER DEFAULT 100,
suma OUT NUMBER) IS
BEGIN
...
END;
DECLARE
xyz NUMBER;
BEGIN
sumaSueldos (dpto=>20, suma =>xyz);
END;
PROCEDURE p2
IS
BEGIN
..
.. (excepcion !!!!!)
..
EXCEPTION
...
END;
Excepcion
Encontrada
PROCEDURE p2
IS
BEGIN
..
.. (excepcion !!!!!)
..
EXCEPTION
...
END;
Excepcion
NO Encontrada
15
CREATE OR REPLACE
Editor de Texto y SQL*Plus
SQL Navigator, TOAD
Procedure Builder
P
R
O
Y
E
C
T
O
Ejemplo
Cap. 10
Creacin de Funciones
I
N
T
E
L
I
G
E
N
T
E
Creacin
Overview
Ejemplo
Utilizacin de la funcin
BEGIN
...
X := 91263541;
salX := miSueldo(x);
DBMS_OUTPUT.PUT_LINE(salX);
...
16
Ejemplo
Restricciones
FROM empleado
P
R
O
Y
E
C
T
O
I
N
T
E
L
I
G
E
N
T
E
Privilegios de Ejecucin
Dependencia entre Objetos
USER_OBJECTS
USER_SOURCE
USER_ERRORS
Depuracin
17
Creacin de Packages
P
R
O
Y
E
C
T
O
Packages
I
N
T
E
L
I
G
E
N
T
E
Sintaxis
CREATE OR REPLACE PACKAGE nombre IS
-- variables publicas
-- declaracion de subprogramas
END nombre;
CREATE OR REPLACE PACKAGE LiqNomina IS
pCedula empleado.cedula%TYPE;
Borrado de Packages
18
Overloading
P
R
O
Y
E
C
T
O
Ventajas
I
N
T
E
L
I
G
E
N
T
E
Uso general
1o. La specification
En ella, solo incluir las rutinas de uso
pblico
Colocar variables en la specification si
se requiere preservarlas
Compilar la specification, requiere de la
compilacin del body
Encapsulamiento
Facilita el desarrollo
Persistencia en variables globales
Mejora el rendimiento
Una sola copia del cdigo para todos los
usuarios
Dependencia entre objetos se simplifica
Overloading
Utilizacin de Funciones
SELECT id,
liqNomina.valorNovedad (id, hire_date) valor
FROM employees;
Forward Declarations
Cap. 12
19
Procedimientos de Inicializacin
P
R
O
Y
E
C
T
O
EXECUTE IMMEDIATE
Cap. 13
I
N
T
E
L
I
G
E
N
T
E
EXECUTE IMMEDIATE
BEGIN
EXECUTE IMMEDIATE DELETE FROM ||tabla;
filas := SQL%ROWCOUNT;
END;
DBMS_SQL
DBMS_DDL
OPEN_CURSOR
PARSE
BIND_VARIABLE
EXECUTE
FETCH_ROWS
CLOSE_CURSOR
ALTER_COMPILE
ANALYZE_OBJECT
20
DBMS_JOB
P
R
O
Y
E
C
T
O
UTL_FILE
REMOVE
WHAT
INTERVAL
RUN
Enviar trabajos
DBMS_JOB.SUBMIT(job, (out)
what,
next_date,
interval,
no_parse);
I
N
T
E
L
I
G
E
N
T
E
UTL_FILE
Subprogramas:
FOPEN
IS_OPEN
GET_LINE
PUT, PUT_LINE, PUTF
NEW_LINE
FFLUSH
FCLOSE, FCLOSE_ALL
Ejemplo
UTL_FILE
DECLARE
trabajo NUMBER;
BEGIN
DBMS_JOB.SUBMIT (trabajo,
pak_cierre.desconectar;,
to_date(200207311000,yyyymmddhh24mi));
DBMS_OUTPUT.PUT_LINE (# Proceso: || trabajo);
END;
INVALID_PATH
INVALID_MODE
INVALID_FILEHANDLE
INVALID_OPERATION
READ_ERROR
WRITE_ERROR
INTERNAL_ERROR
21
P
R
O
Y
E
C
T
O
UTL_FILE: Ejemplo
Directory
DECLARE
f UTL_FILE.FILE_TYPE;
BEGIN
f := UTL_FILE.FOPEN (/facturas, salarios, W);
FOR i IN (SELECT nombre, salario
FROM empleado) LOOP
UTL_FILE.PUT_LINE(f, nombre || , || salario);
END LOOP;
UTL_FILE.FCLOSE(f);
END;
Otros Packages
I
N
T
E
L
I
G
E
N
T
E
UTL_HTTP
UTL_TCP
DBMS_ALERT DBMS_SESSION
DBMS_UTILITY DBMS_LOB
Existe un manual exclusivo para
explicar todos estos packages
Manipulando LOBs
DECLARE
f BFILE;
BEGIN
FOR i IN (SELECT cedula FROM empleado) LOOP
f := BFILENAME(fotos, i.cedula||.gif);
IF DBMS_LOB.FILEEXISTS(f) = 1 THEN
DBMS_LOB.FILEOPEN(f);
UPDATE empleado
SET foto = f
WHERE cedula = i.cedula;
DBMS_LOB.FILECLOSE(f);
DBMS_OUTPUT.PUT_LINE(Ok:||i.cedula);
ELSE
DBMS_OUTPUT.PUT_LINE(Bad:||i.cedula);
END IF;
END LOOP;
END;
22
Componentes
Cap. 14
Triggers
P
R
O
Y
E
C
T
O
Definicin
I
N
T
E
L
I
G
E
N
T
E
Guas
Nuevos Eventos
Ejemplo
CREATE OR REPLACE TRIGGER au_salario
AFTER UPDATE OF salary ON employees
BEGIN
IF :old.salary < :new.salary * 2 THEN
RAISE_APPLICATION_ERROR (-20111,
Actualizacion de salario rechazada!);
END IF;
END;
23
Ejemplo
P
R
O
Y
E
C
T
O
I
N
T
E
L
I
G
E
N
T
E
Ejemplo
CREATE OR REPLACE TRIGGER aiu_salario
AFTER INSERT,UPDATE ON employees
WHEN :new.dpto = 20
BEGIN
IF INSERTING THEN
INSERT INTO bitacora ...
ELSE THEN
validaSalario(:new.salary);
END IF;
END;
Utilidad
Seguridad
Bitcoras
Reglas de Integridad avanzadas
Reglas del Negocio
Campos u operaciones derivadas
Replicacin de datos
Triggers INSTEAD OF
24