Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Francisco Moreno
Universidad Nacional
Introduccin al PL/SQL
Por qu PL/SQL?
A pesar de que SQL tiene mecanismos de
control condicional (clusula CASE WHEN*) e
iterativos (implcitos) en ocasiones se requiere:
- Manipular y controlar los datos de una manera
secuencial
- Mejorar el desempeo de las aplicaciones
Existen problemas cuya solucin puede ser ms
sencilla y eficiente mediante un lenguaje
procedimental que mediante SQL puro
* PL/SQL tambin la tiene. Ms adelante se ve un ejemplo.
Introduccin al PL/SQL
Ejemplo: insercin de 500 filas en una tabla:
DROP TABLE plana;
CREATE TABLE plana(nro NUMBER(3) PRIMARY KEY,
dato VARCHAR2(80));
BEGIN
FOR i IN 1..500 LOOP
INSERT INTO plana
VALUES (i,'No rayar el pupitre');
END LOOP;
END;
/
Introduccin al PL/SQL
Incorporacin de PSM* a SQL (1992) Incluye
estructuras de secuencia, decisin, iteracin,
iteracin
creacin de procedimientos, funciones, etc.
La versin PSM de Oracle se llama PL/SQL
(Procedural Language/SQL).
En SQL Server se llama Transact-SQL (T-SQL).
En PL/SQL se pueden crear procedimientos con
o sin nombre (annimos), funciones,
disparadores (triggers) y bibliotecas de
funciones y procedimientos llamadas paquetes.
paquetes
*Persistent Stored Modules
Bloques PL/SQL
Un bloque PL/SQL es una pieza de cdigo dividida en tres secciones:
DECLARE
Seccin de declaracin
BEGIN
Seccin ejecutable
EXCEPTION
Seccin de manejo de excepciones
END;
Variables y constantes
Tipos de datos* en PL/SQL: NUMBER, CHAR,
VARCHAR/VARCHAR2, DATE, BOOLEAN, entre otros.
La sintaxis para declarar variables o constantes es:
nombre [CONSTANT] TIPO [NOT NULL][:= expresin];
Los
corchetes
indican las
partes
opcionales
Alcance
El alcance o visibilidad de las variables sigue estas reglas:
1. Una variable es visible en el bloque en el cual se declara
y en todos sus sub-bloques, a menos que se aplique la
regla 2.
2. Si se declara una variable en un sub-bloque con el
mismo nombre que una variable del bloque contenedor,
la variable del sub-bloque es la que tiene prioridad en el
sub-bloque*.
Alcance
Operador de
concatenacin ||
DECLARE
a NUMBER(2) := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE('Valor de a externa '|| a );
DECLARE
a NUMBER(3) := 20;
BEGIN
DBMS_OUTPUT.PUT_LINE('Valor de a interna '|| a);
END;
DBMS_OUTPUT.PUT_LINE('Valor de a '|| a );
END;
Para ejecutar en SQL*Plus
/
Imprime:
Valor de a externa 10
Valor de a interna 20
Valor de a 10
Subbloque
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE t(ced
NUMBER(8))';
END;
/
La sentencia DDL NO lleva punto y coma dentro
de las comillas simples.
Lo que sigue a IMMEDIATE puede ser una
variable de caracteres Luego se vern ms
ejemplos
Ejemplo
DROP TABLE emp;
CREATE TABLE emp(
cod NUMBER(8) PRIMARY KEY,
nom VARCHAR2(20) NOT NULL,
fecha_ing DATE,
sueldo NUMBER(8) CHECK(sueldo > 0)
);
DECLARE
nom emp.nom%TYPE := INITCAP('adam');
fi emp.fecha_ing%TYPE;
BEGIN
fi := ADD_MONTHS(SYSDATE,-14);
INSERT INTO emp
VALUES (4329,
Ac se pueden
nom,
colocar los valores
fi,
directamente y
prescindir de las
10000
vbles.
);
END;
/
Las vbles. se
pueden inicializar
en el DECLARE o
en el BEGIN
Control de Flujo
Las comparaciones lgicas son la base del
control condicional en PL/SQL.
Los resultados de las comparaciones son
verdadero (TRUE), falso (FALSE) o nulo (NULL).
Cualquier cosa comparada con NULL retorna
NULL (desconocido).
Los operadores lgicos son : >, <, =, !=, <=, >=,
<>
Ciclos o iteraciones
a) Ciclo simple sin lmite: LOOP
LOOP
secuencia de instrucciones
END LOOP;
Para salir del ciclo se usa:
EXIT [WHEN condicin];
Ejemplo.
DECLARE
cont NUMBER(4) := 0;
BEGIN
DELETE plana;
LOOP
INSERT INTO plana VALUES(cont,
CEIL(DBMS_RANDOM.VALUE(1,100000)));
cont := cont + 1;
EXIT WHEN cont = 1000;
END LOOP;
END;
/
Ejemplo:
BEGIN
DELETE plana;
FOR i IN REVERSE 1..500 LOOP
INSERT INTO plana
VALUES (i, 'No rayar el pupitre');
END LOOP;
END;
/
Ejemplo:
u: maysculas
l: minsculas
a: combinacon de
maysculas y
minsculas
x: alfanumricos
DECLARE
cont NUMBER(3) := 500;
BEGIN
DELETE PLANA;
WHILE cont > 0 LOOP
INSERT INTO plana VALUES
(cont, DBMS_RANDOM.STRING('u',60) || cont);
cont := cont - 1;
END LOOP;
Tamao
END;
/
Instruccin CONTINUE
CONTINUE pasa el control inmediatamente a la
siguiente iteracin de un ciclo. Solo se puede
usar en ciclos.
Continue
DECLARE
i NUMBER := 0;
BEGIN
LOOP
i := i + 1;
IF i BETWEEN 5 AND 15 THEN
CONTINUE;
END IF;
DBMS_OUTPUT.PUT_LINE(i);
EXIT WHEN i = 20;
END LOOP;
END;
/