Académique Documents
Professionnel Documents
Culture Documents
1
Fundamentos de PL/SQL Contenido
Introduccin a PL/SQL
PL/SQL: Procedural Language/Structured Queryx Language: Es
un lenguaje portable, de alto desempeo, extensin de SQL
realizado por Oracle.
2
Fundamentos de PL/SQL Contenido
Introduccin a PL/SQL
Generalidades de PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
3
Fundamentos de PL/SQL Contenido
Identificadores en PL/SQL
Listar los diferentes tipos de identificadores de un subprograma
PL/SQL
Uso de la seccin de declaracin para definir identificadores
4
Fundamentos de PL/SQL Contenido
Bloques anidados
Operadores en PL/SQL
5
Fundamentos de PL/SQL Contenido
6
Fundamentos de PL/SQL Contenido
Estructuras de Control
Procesamiento condicional utilizando sentencias IF
Procesamiento condicional utilizando sentencias CASE
7
Fundamentos de PL/SQL Contenido
8
Fundamentos de PL/SQL Contenido
Cursores explcitos
Qu son los cursores explcitos?
Declarar el Cursor
Abrir el Cursor
Cerrar el Cursor
9
Fundamentos de PL/SQL Contenido
Manejo de excepciones
Entendiendo las excepciones
Manejo de excepciones con PL/SQL
Propagacin de excepciones
Procedimiento RAISE_APPLICATION_ERROR
10
Fundamentos de PL/SQL Contenido
11
Introduccin a PL/SQL
Generalidades de PL/SQL
Es independiente de la plataforma.
12
Introduccin a PL/SQL
por fila.
Soporta SQL esttico y dinmico
13
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
Alto desempeo
Enviar bloques de sentencias SQL al servidor de base de datos.
14
Introduccin a PL/SQL
Incrementa la productividad
Cdigo compacto para manipular datos.
datos.
Presente en multiples herramientas: Forms, Reports, Java.
Portabilidad
Se puede ejecutar en cualquier sistema operativo y plataforma
15
Introduccin a PL/SQL
Escalabilidad
Los subprogramas permiten centralizar en la base de datos el
procesamiento de la aplicacin.
Las utilidades de memoria compartida permiten soportar miles
de usuarios concurrentes.
Manejabilidad
El codigo se centraliza en BD en vez del cliente.
que lo invoca.
16
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
17
Introduccin a PL/SQL
18
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
base de datos.
19
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
utiles:
DBMS_ALERT: Uso de triggers
sistema operativo.
UTL_HTTP: Para llamados HTTP
subprogramas.
DBMS_PIPE: Comunicacin de dos hilos de ejecucin.
20
Glosario
Palabra reservada (keyword). Es una palabra que el lenguaje
reconoce como propia. Ej. BEGIN, END, IF, RETURN. Ver
V$RESERVED_WORDS
Identificador. Un nombre para algo tal como una variable, un programa
almacenado. Por ejemplo: salario, libro2, balance_entrante.
Tipo de dato Un nombre para una clase de valor. Por
ejemplo:NUMBER, DATE, VARCHAR2
Variable Un contenedor con identificador y tipo de dato para
almacenar informacin temporalmente.
Declaracin, seccin de declaracin. Declarar una variable significa
nombrarla y definir su tipo, se hace en la seccin de declaracin.
21
Glosario
String (cadena) Una cantidad textual de caracteres, cero o ms
de ellos. Delimitados por comilla sencilla, se almacenan en
variables de tipo caracter, varchar2, por ejemplo.
NULL Un valor especial que representa la ausencia de un valor
real, indefinido o desconocido.
Booleano Una clase de valor para trabajar con los valores falso y
verdadero, disponible en PL/SQL y no en SQL.
Literal Valores explicitos que aparecen en un programa. Pueden
ser numricos o caracteres: 5.56720, 'Valor literal'.
Expresin Una formula que evalua algn valor, se base en otros
valores: a + b, fecha_hoy - fecha_naci
22
Glosario
Operador Una palabra o signo utilizada por el lenguaje para
representar una operacin lgica, matemtica u otra funcin.
Ejemplo: +, -, AND, BETWEEN
Sentencia Una instruccin de programa compuesta de valores
literales, palabras clave, identificadores, operadores y
terminadores.
Terminador Un operador especial que se debe colocar al final de
cada sentencia o expresin. En PL/SQL es punto y coma (;).
Bloque Una secuencia de cdigo que incluye sentencias
ejecutables. Un programa de PL/SQL involucra uno o varios
bloques, cada uno con sus sentencias.
23
Introduccin a PL/SQL
Tipos de Bloques
24
Introduccin a PL/SQL
Tipos de Bloques
25
Introduccin a PL/SQL
Tipos de Bloques
Annimo
El bloque annimo es ejecutado una sola vez.
26
Introduccin a PL/SQL
Tipos de Bloques
Subprogramas
27
Introduccin a PL/SQL
Tipos de Bloques
Paquetes (packages)
28
Introduccin a PL/SQL
Tipos de Bloques
Disparadores (Triggers)
29
Introduccin a PL/SQL
Crear un bloque de PL/SQL Annimo
Un bloque de PL/SQL annimo debe tener una parte ejecutable: un grupo de
sentencias PL/SQL incluidas en un BEGIN END
SQL> begin
2 dbms_output.put_line('Hello world!');
3 end;
4 /
Hello world!
30
Introduccin a PL/SQL
31
Introduccin a PL/SQL
32
Introduccin a PL/SQL
33
Introduccin a PL/SQL
Crear un bloque de PL/SQL Annimo
Ejemplo de un bloque PL/SQL annimo con seccin de declaracin, ejecucin
y manejo de excepciones:
34
Introduccin a PL/SQL
declare
myNumber number := 1;
begin
myNumber := 1 + 1;
dbms_output.put_line( '1 + 1 = ' || to_char( myNumber ) || '!' );
exception
when others then
dbms_output.put_line( 'We encountered an exception! '|| SQLERRM );
end;
/
35
Introduccin a PL/SQL
DECLARE
V1 VARCHAR2(32767);
F1 UTL_FILE.FILE_TYPE;
BEGIN
-- In this example MAX_LINESIZE is less than GET_LINE's length request
-- so the number of bytes returned will be 256 or less if a line terminator is seen.
F1 := UTL_FILE.FOPEN('USER_DIR','u12345.tmp','R',256);
UTL_FILE.GET_LINE(F1,V1,32767);
UTL_FILE.FCLOSE(F1);
END;
37
Introduccin a PL/SQL
Generar texto de salida
UTL_SMTP. Envio de email con el protocolo SMTP
DECLARE
c utl_smtp.connection;
BEGIN
c := utl_smtp.open_connection(
host => 'smtp.example.com',
port => 25,
wallet_path => 'file:/oracle/wallets/smtp_wallet',
wallet_password => 'password',
secure_connection_before_smtp => FALSE);
UTL_SMTP.STARTTLS(c);
UTL_SMTP.AUTH(
c => c,
username => 'scott',
password => 'password'
schemes => utl_smtp.all_schemes);
END; 38
Introduccin a PL/SQL
Generar texto de salida
UTL_HTTP. Permite hacer llamados a HTTP y acceder datos en
internet con llamados a HTTP.
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(1024);
BEGIN
UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
req := UTL_HTTP.BEGIN_REQUEST('http://www-hr.corp.my-company.com');
UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
resp := UTL_HTTP.GET_RESPONSE(req);
LOOP
UTL_HTTP.READ_LINE(resp, value, TRUE);
DBMS_OUTPUT.PUT_LINE(value);
END LOOP;
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN 39
UTL_HTTP.END_RESPONSE(resp);
END;
Introduccin a PL/SQL
Ejercicio 1
CREATE TABLE myTable(
e INTEGER,
f INTEGER
);
Ejercicio 1 (cont.)
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM myTable WHERE e > 1;
INSERT INTO myTable VALUES(b,a);
END;
/
Ejercicio 2
DECLARE
contador_cientos NUMBER(1,-2);
BEGIN
contador_cientos := 100;
LOOP
DBMS_OUTPUT.PUT_LINE(contador_cientos);
contador_cientos := contador_cientos + 100;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Esto es lo ms alto posible');
END;
/
42
Identificadores PL/SQL
Nmerales 0..9
43
Identificadores PL/SQL
Literales
Comentarios
44
Identificadores PL/SQL
Delimitadores
45
Identificadores PL/SQL
Identificadores
46
Identificadores PL/SQL
Identificadores
Vlidos:
X
t2
phone#
credit_limit
LastName
oracle$number
money$$$tree
SN##
try_again_
47
Identificadores PL/SQL
Identificadores
NO Vlidos:
48
Identificadores PL/SQL
Identificadores
lastname
LastName
LASTNAME
49
Identificadores PL/SQL
Literales
Numricos
Enteros: 030 6 -14 0 +32767
Reales: 6.6667 0.0 -12.0 3.14159 +8300.00 .5 25.
Notacin cientfica: 5E3 = 5 * 10**3 = 5 * 1000 = 5000
'XYZ Corporation'
'10-NOV-91'
'$1,000,000'
50
Identificadores PL/SQL
Literales
51
Identificadores PL/SQL
Literales
Fecha y hora
DECLARE
d1 DATE := DATE '1998-12-25';
t1 TIMESTAMP := TIMESTAMP '1997-10-22 13:01:01';
53
Identificadores PL/SQL
Variables
DECLARE
birthday DATE;
emp_count SMALLINT := 0;
pi REAL := 3.14159;
radius REAL := 1;
area REAL := pi * radius**2;
BEGIN
NULL;
END;
/
57
Identificadores PL/SQL
Tipos de datos escalares
58
Identificadores PL/SQL
Tipos de datos escalares
Categoras de tipos de datos pre-definidos
Categoria Descripcin
Escalar Valores simples sin componentes internos
Compuesto Items de datos que contienen componentes internos que
pueden ser accedidos individualmente. (Registros y
colecciones)
Referencia Apuntadores a otros items de datos. Cursores por
referencia
Large Object (LOB) Apuntadores a objetos grandes que se almacenan por
separado de otros items de datos, pueden ser textos,
grficos, imgenes, videos, sonidos.
59
Identificadores PL/SQL
Tipos de datos escalares
Tipos de datos escalares pre-definidos
Categoria Descripcin
Numrico Valores numricos sobre los cuales se pueden realizar
operaciones aritmticas.
Caracter Valores alfanumericos que representan caracteres
sencillos o cadenas de caracteres, los cuales pueden ser
manipulados.
BOOLEANO Valores lgicos sobre los cuales se pueden hacer
operaciones lgicas.
Fecha y hora Fechas y horas que pueden ser manipulados.
Intervalos Intervalos de tiempo que pueden ser manipulados
60
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
61
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
credit PLS_INTEGER RANGE 1000..25000;
debit credit%TYPE; -- inherits data type
name VARCHAR2(20) := 'JoHn SmItH';
upper_name name%TYPE; -- inherits data type
lower_name name%TYPE; -- inherits data type
init_name name%TYPE; -- inherits data type
BEGIN
DBMS_OUTPUT.PUT_LINE ('name: ' || name);
DBMS_OUTPUT.PUT_LINE ('upper_name: ' || UPPER(name));
DBMS_OUTPUT.PUT_LINE ('lower_name: ' || LOWER(name));
DBMS_OUTPUT.PUT_LINE ('init_name: ' || INITCAP(name));
END;
/
name: JoHn SmItH
upper_name: JOHN SMITH
lower_name: john smith
init_name: John Smith
62
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
name VARCHAR2(20) NOT NULL := 'JoHn SmItH';
same_name name%TYPE;
BEGIN
NULL;
END;
/
same_name name%TYPE;
*
ERROR at line 3:
ORA-06550: line 3, column 15:
PLS-00218: a variable declared NOT NULL must have an initialization assignment
63
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
name VARCHAR2(20) NOT NULL := 'JoHn SmItH';
upper_name name%TYPE := UPPER(name);
lower_name name%TYPE := LOWER(name);
init_name name%TYPE := INITCAP(name);
BEGIN
DBMS_OUTPUT.PUT_LINE('name: ' || name);
DBMS_OUTPUT.PUT_LINE('upper_name: ' || upper_name);
DBMS_OUTPUT.PUT_LINE('lower_name: ' || lower_name);
DBMS_OUTPUT.PUT_LINE('init_name: ' || init_name);
END;
/
name: JoHn SmItH
upper_name: JOHN SMITH
lower_name: john smith
init_name: John Smith
64
Identificadores PL/SQL
Ejercicio 3. Creacin de un bloque PL/SQL simple
65
Identificadores PL/SQL
Variables Bind
CONN sys/password AS SYSDBA
DECLARE
l_dummy dual.dummy%TYPE;
BEGIN
FOR i IN 1 .. 10 LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT dummy FROM dual WHERE dummy = '''
|| TO_CHAR(i) || ''''
INTO l_dummy;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END LOOP;
END;
/ 66
Identificadores PL/SQL
Variables Bind
SELECT sn.name, ms.value
FROM v$mystat ms, v$statname sn
WHERE ms.statistic# = sn.statistic#
AND sn.name = 'parse time cpu';
67
Identificadores PL/SQL
Variables Bind
ALTER SYSTEM FLUSH SHARED_POOL;
DECLARE
l_dummy dual.dummy%TYPE;
BEGIN
FOR i IN 1 .. 10 LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT dummy FROM dual WHERE
dummy = TO_CHAR(:dummy)'
INTO l_dummy USING i;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END LOOP;
END; 68
/
Identificadores PL/SQL
Variables Bind
SELECT sn.name, ms.value
FROM v$mystat ms, v$statname sn
WHERE ms.statistic# = sn.statistic#
AND sn.name = 'parse time cpu';
69
Identificadores PL/SQL
Variables Bind
alter system flush shared_pool;
set serveroutput on;
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = ' || i;
fetch l_rc into l_dummy;
close l_rc;
-- dbms_output.put_line(l_dummy);
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2) ||
' Seconds...' );
end; 70
/
Identificadores PL/SQL
Variables Bind
alter system flush shared_pool;
set serveroutput on;
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = :x'
using i;
fetch l_rc into l_dummy;
close l_rc;
-- dbms_output.put_line(l_dummy);
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2) ||
' Seconds...' ); 71
end;
/
Identificadores PL/SQL
Secuencias
CREATE SEQUENCE s;
DECLARE
n PLS_INTEGER;
BEGIN
n := s.NEXTVAL;
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(n));
END;
/
DECLARE
n PLS_INTEGER := s.NEXTVAL;
BEGIN
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(n));
END;
/
BEGIN
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(s.NEXTVAL));
END;
/
72
Identificadores PL/SQL
Secuencias
BEGIN
IF s.NEXTVAL > 3 THEN
DBMS_OUTPUT.PUT_LINE('Currval=' || TO_CHAR(s.CURRVAL));
END IF;
END;
/
DECLARE
n PLS_INTEGER;
BEGIN
FOR i IN 1 .. 10000 LOOP
n := s.NEXTVAL;
END LOOP;
FOR i IN 1 .. 10000 LOOP
SELECT s.NEXTVAL AS nval INTO n FROM dual;
END LOOP;
END;
/