Escolar Documentos
Profissional Documentos
Cultura Documentos
PERU
Programacin PL/SQL
Oracle 11g
1.Introduccin PL/SQL
Carlos Janjachi
carlos.janjachi@gmail.com
Introduccin PL/SQL
1.1 PL/SQL
Proporciona funcionalidades adicionales a SQL como:
Manipulacin de registros a travs de cursores.
Almacenar el cdigo en el servidor y no en el cliente.
Manejo de excepciones.
Trabajar con variables, parmetros, colecciones, registros, arreglos,
objetos, cursores, etc.
1.2 Bloque PL/SQL
Es un bloque de cdigo que se ejecuta en una sesin.
No es almacenado en la base de datos.
No puede ser llamado desde otra sesin.
Ejemplo:
DECLARE
v_Date TIMESTAMP;
BEGIN
SELECT systimestamp - 1/24 INTO v_Date FROM dual;
DBMS_OUTPUT.PUT_LINE('One hour ago: '||v_Date);
END;
Introduccin PL/SQL
1.3. Procesamiento de PL/SQL
La ejecucin de un bloque PL/SQL pasa por las siguientes etapas:
El cdigo es enviado al PL/SQL Engine
Se parsea.
El parte procedural se envia al Procedural Statement Executor.
El parte sql se enva al SQL Statement Executor.
Parseo:
Hard
Soft
Proceso:
Sintaxis
Semntica (objetos y privilegios)
Asigna espacio en SQL rea (shared pool).
Genera la sentencia parseada (hash) + plan
Guarda parsed en el SQL rea.
Programacin PL/SQL-Carlos Janjachi
Introduccin PL/SQL
Procesamiento Bloque PL/SQL
Introduccin PL/SQL
Procesamiento Procedimiento PL/SQL
Introduccin PL/SQL
1.4. PL/SQL Engine
Se encuentra presente en:
Oracle server
Oracle Forms (Version 3 and later)
SQL*Menu (Version 5 and later)
Oracle Reports (Version 2 and later)
Oracle Graphics (Version 2 and later)
Bloques annimos son enviados desde:
Oracle precompilers
Oracle Call Interfaces (OCIs)
SQL*Plus
Oracle Enterprise Manager
Introduccin PL/SQL
Enlaces
SQL, PL/SQL, and Java
http://www.macs.hw.ac.uk/dept/facil/guides/oracle_9i/doc/server.901/a
88856/c16sqlpl.htm
Programacin PL/SQL
Oracle 11g
2.Tools PL/SQL
Carlos Janjachi
carlos.janjachi@gmail.com
Tools PL/SQL
2.1. Tools PL/SQL
Algunas herramientas de pl/sql son:
SQL Plus
SQL Developer
http://www.oracle.com
CAST SQLBuilder
http://www.castsoftware.com
FROG
http://sourceforge.net/projects/frogfororacle/
PLEdit
http://www.benthicsoftware.com
SQL Navigator
http://www.quests.com
TOAD
http://www.toadsoft.com
Tambin se puede hacer desarrollo pl/sql desde los IDE:
Netbeans
JDeveloper.
10
Tools PL/SQL
2.2. SQLDeveloper
Requerimientos:
Tools PL/SQL
JDBC Drivers
SQLDeveloper soporta drivers java que le permiten la conexin a otras bases
de datos como:
IBM DB2
db2jcc.jar, db2jcc_license_cu.jar
MySQL
mysql-connector-java-5.0.4-bin.jar
SQL Server jtds-1.2.jar
11
Tools PL/SQL
Algunas caracteristicas de SQLDeveloper son:
Conexiones
SQLDeveloper permite compartir conexiones entre las ejecuciones de
bloque pl/sql.
Format
CTRL+F7, para dar el formato (sangrado) estandar de la herramienta
12
Tools PL/SQL
Crear Objetos de BD
SQLDeveloper permite crear objetos de base de datos como tablas, ndices,
vistas, secuencias, procedimientos almacenados, etc.
13
Tools PL/SQL
Crear Tablas
Creacin de tablas y sus caractersticas.
14
Tools PL/SQL
Exportar Datos
SQLDeveloper permite exportar datos de las tablas a los formatos:
csv
fixed
html
insert
loader
text
xls
xml
15
Tools PL/SQL
Enlaces
SQLDeveloper download
http://www.oracle.com/technetwork/developer-tools/sqldeveloper/downloads/index.html
SQLDeveloper documentacin
http://download.oracle.com/docs/cd/E15846_01/index.htm
CAST SQLBuilder
http://www.castsoftware.com
FROG
http://sourceforge.net/projects/frogfororacle/
PLEdit
http://www.benthicsoftware.com
SQL Navigator
http://www.quests.com
TOAD
http://www.toadsoft.com
16
Programacin PL/SQL
Oracle 11g
3. PL/SQL Bsico
Carlos Janjachi
carlos.janjachi@gmail.com
17
PL/SQL Bsico
3.1. Estructura de Bloque PL/SQL
La estructura de un bloque pl/sql contiene las siguientes secciones:
DECLARATION (Opcional)
Usado para declarar las variables y tipos de datos que sern utilizados en
el bloque.
Listado de variables locales.
EXECUTION [BEGIN, END] (Requerido)
Es el bloque de ejecucin.
Debe contener pl/sql estandar para compilar.
Soporta comandos DML.
EXCEPTION (Opcional)
Usado para atrapar los errores que ocurren durante la ejecucin.
18
PL/SQL Bsico
3.2. Bloque PL/SQL Annimo.
Es un bloque pl/sql con la estructura basica.
No se les asigna un nombre y no se almacenan en la base de datos.
Pueden llamar a otros programas (procedimientos, funciones, paquetes) pero
no a otro bloque annimo.
19
20
PL/SQL Bsico
PL/SQL Bsico
3.3. Bloque PL/SQL Anidados.
Un bloque anidado es aquel que contiene a otros sub-bloques.
Los sub-bloques se permiten en las secciones EXECUTION y EXCEPTION, no en
DECLARATION.
21
22
PL/SQL Bsico
PL/SQL Bsico
3.4. Errores en Tiempo de Compilacin.
Durante la compilacin de un bloque pl/sql nombrado (procedimientos y
funciones) oracle realiza la siguiente comprobacin:
Sintaxis
Dependencia de los objetos
Permisos
Si el bloque nombrado contiene errores, oracle devuelve un mensaje y asigna
el estado invalido al objeto.
Para un bloque annimo no aplica porque este pasa directamente a un tiempo
de ejecucin.
23
24
PL/SQL Bsico
PL/SQL Bsico
25
Programacin PL/SQL
Oracle 11g
4. Creacin de BD
Carlos Janjachi
carlos.janjachi@gmail.com
26
Creacin de BD
4.1. La Base de Datos de Practica.
El esquema de trabajo es USOCIAL y contiene las tablas de un sistema de ofertas
a clientes.
27
28
Creacin de BD
TABLA SCLIENTE
TABLA SOFERTA
Creacin de BD
TABLA SPERFIL
TABLA SCLIE_PERF
29
30
Creacin de BD
TABLA SOFER_PERF
Creacin de BD
TABLA SREG_CLIE_OFER
31
Programacin PL/SQL
Oracle 11g
5. Estructuras de Control
Carlos Janjachi
carlos.janjachi@gmail.com
32
Estructuras de Control
5.1 EXPRESIONES PL/SQL.
Una composicin de operadores y operandos.
Operadores de Asignacin.
Asigna un valor, variable o expresin a una variable.
Se da en la seccin de declaracin o en dentro del bloque durante el tiempo
de ejecucin.
Ejemplo:
v_precio := 1200;
Ejemplo:
BEGIN
v_string := 'CREATE TABLE authors(id NUMBER PRIMARY KEY, first_name
VARCHAR2(50), last_name VARCHAR2(50))';EXECUTE IMMEDIATE
(v_string);
END;
33
Estructuras de Control
Operadores de Concatenacin.
Permite la concatenacin de cadenas, valores o expresiones.
Ejemplo:
BEGIN
v_string := 'CREATE TABLE authors(' ||'id NUMBER PRIMARY KEY, '
||'first_name VARCHAR2(50), ' ||'last_name VARCHAR2(50))';
EXECUTE IMMEDIATE (v_string);
END;
34
Estructuras de Control
5.2. ESTRUCTURAS DE CONTROL.
Condicionales.
Procesa porciones de cdigo pl/sql de acuerdo a criterios de evaluacin
IF-THEN-ELSE
La condicin se evala como TRUE, FALSE, NULL.
Si es verdadera entonces se realiza la accin 1.
Si es falsa entonces se realiza la accin 2.
IF condition
THEN action1;
ELSE action2
END IF;
35
Estructuras de Control
IF-THEN-ELSIF
Si una de las condiciones es verdadera el resto se asume como falso y son
obviados.
IF condition
THEN action
ELSIF condition THEN
action [ELSE
action] END IF;
CASE
Evaluacin condicional.
CASE expression
WHEN test1 THEN action;
WHEN test2 THEN action; ...
ELSE action;
END CASE;
36
Estructuras de Control
Bucles.
LOOP
Permite la ejecucin circular (repeticin) de cdigo pl/sql.
LOOP
action;
EXIT [WHEN condition]
END LOOP;
FOR
Permite un nmero finito de ejecuciones de cdigo pl/sql.
FOR counter IN low_number .. high_number
LOOP
action;
END LOOP;
WHILE
Permite un nmero de ejecuciones hasta que la condicin sea verdadera.
WHILE condition
LOOP
action;
END LOOP;
Programacin PL/SQL-Carlos Janjachi
37
Estructuras de Control
Navegacin.
GOTO
Permite saltar hacia un porcin de cdigo pl/sql en el bloque.
No puede referenciar a una etiqueta en un bloque anidado.
No puede referenciar desde fuera de un bloque hacia adentro, tampoco
al reves.
BEGIN
GOTO label_name;
.. .. .. ..
<< label_name>>
END;
38
Programacin PL/SQL
Oracle 11g
6. Stored Function
Carlos Janjachi
carlos.janjachi@gmail.com
39
Stored Function
6.1. PL/SQL Function
Las funciones son subprogramas pl/sql que se almacenan en la base de datos.
Contienen secciones de declaracin, ejecucin y manejo de excepciones.
Manejan parmetros de entrada y salida durante su llamada, sin embargo a
diferencia de un procedimiento, la llamada a una funcin se hace como parte
de una expresin (ej. una condicin).
6.2. Ciclo de una Funcin
Se crean con CREATE OR REPLACE FUNCTION.
El subprograma pl/sql se compila.
El cdigo fuente se almacena en la base de datos.
El cdigo compilado se almacena en la base de datos.
El subprograma compilado puede ser ejecutado desde otro bloque pl/sql.
Durante la ejecucin se puede pasar parmetros a la funcin.
El control pasa a la funcin, especficamente a su primera lnea.
Al finalizar la funcin o ocurrir una excepcin, el control retorna al bloque que
la invoco.
40
Stored Function
6.3. Creacin de Funciones Almacenadas
La estructura de un procedimiento almacenado es:
CREATE OR REPLACE FUNCTION function_name [parameter_list]
RETURN parameter
AS
/* Declarative section is here */
BEGIN
/* Executable section is here */
RETURN parameter_value_out
EXCEPTION
/* Exception section is here */
RETURN parameter_value_out
END;
6.4. Eliminacin de Funciones AlmacenadAs.
DROP FUNCTION function_name ;
Programacin PL/SQL-Carlos Janjachi
41
Stored Function
6.5. Parmetros.
Los parmetros formales pueden ser:
IN
El valor del parmetro es pasado a la funcin.
En la funcin, el parmetro acta como una constante solo de
lectura.
OUT
Esta implcito en el RETURN.
Cuando el procedimiento finaliza, retorna el contenido del
parmetro de salida.
42
Stored Function
Ej. Creacin de Funcin
43
Stored Function
Ej. Ejecucin de Funcin.
44
Stored Function
6.6. Otras caractersticas.
%TYPE.
Soporta %TYPE en la declaracin.
Excepciones.
En la seccin de ejecucin, se permite hacer uso de raise de las
excepciones (predefinidas o definidas por el usuario).
Si la funcin no controla la excepcin esta se propaga al bloque que la
llamo.
Sin parmetros.
Si la funcin no tiene parmetros, la llamada tambin se debe realizar sin
pasar valores.
45
Stored Function
46
Programacin PL/SQL
Oracle 11g
7. Stored Procedure
Carlos Janjachi
carlos.janjachi@gmail.com
47
Stored Procedure
7.1. PL/SQL Procedure
Son subprogramas (procedimientos) de pl/sql que se almacenan en la base de
datos.
Contienen secciones de declaracin, ejecucin y manejo de excepciones.
7.2. Ciclo de un Procedimiento Almacenado.
Se crean con CREATE OR REPLACE PROCEDURE.
El subprograma se compila.
El cdigo fuente se almacena en la base de datos.
El cdigo compilado se almacena en la base de datos.
El subprograma compilado puede ser ejecutado desde otro bloque pl/sql.
Durante la ejecucin se puede pasar parmetros al procedimiento.
El control pasa al procedimiento, especficamente a su primera lnea.
Al finalizar el procedimiento, el control retorna al bloque que le invoco.
48
Stored Procedure
7.3. Creacin de Procedimientos Almacenados
La estructura de un procedimiento almacenado es:
CREATE OR REPLACE PROCEDURE procedure_name [parameter_list]
AS
/* Declarative section is here */
BEGIN
/* Executable section is here */
EXCEPTION
/* Exception section is here */
END [ procedure_name];
7.4. Eliminacin de Procedimientos Almacenados.
DROP PROCEDURE procedure_name;
49
Stored Procedure
7.5. Ejecucin de Procedimientos Almacenados.
BEGIN
procedure_name(valor1,valor2, .. );
END;
7.6. Parmetros.
Los parmetros formales pueden ser de tres tipos IN, OUT, IN OUT:
IN
El valor del parmetro es pasado al procedimiento.
En el procedimiento, el parmetro acta como una constante solo de
lectura.
OUT
Cualquier valor pasado al procedimiento es ignorado.
En el procedimiento en tiempo de ejecucin, el parmetro acta como
una variable no inicializada o nula.
Puede ser leda y asignarle un valor.
Cuando el procedimiento finaliza, el contenido del parmetro de salida es
el ultimo valor asignado.
Programacin PL/SQL-Carlos Janjachi
50
Stored Procedure
IN OUT
El valor del parmetro es pasado al procedimiento.
En el procedimiento, el parmetro acta como variable no inicializada o
nula, puede ser leda y asignarle un valor.
Cuando el procedimiento termina, el contenido del parmetro (el ultimo
valor asignado) es retornado.
51
Stored Procedure
7.7. Otras caractersticas.
%TYPE.
En la declaracin de parmetros formales soporta %TYPE.
Excepciones.
En la seccin de ejecucin, se permite hacer uso de raise (lanzar) las
excepciones tanto predefinidas o definidas por el usuario.
Si el procedimiento no controla la excepcin esta se propaga al bloque
que llamo al procedimiento.
Sin parmetros.
Si el procedimiento no tiene parmetros, la llamada tambin se debe
realizar sin pasar valores.
52
Programacin PL/SQL
Oracle 11g
8. Packages
Carlos Janjachi
carlos.janjachi@gmail.com
53
Packages
8.1. Packages.
Es un PL/SQL que permite la construccin de objetos relacionados que
comparten conceptos o caractersticas similares y se almacenen juntos.
Un paquete tiene dos partes separadas: la especificacin y el cuerpo.
Cada uno se almacena por separado en el diccionario de datos.
Adems de permitir el agrupamiento de objetos, los paquetes son tiles
porque son menos restrictivos que los subprogramas almacenados en lo
que respecta a las dependencias.
La parte de especificacin en un paquete es esencialmente una seccin
declarativa. Cualquier objeto, variables, etc. que puedan ir en la parte
declarativa de un bloque pl/sql puede ir tambin en la especificacin de
un paquete. Esto incluye los procedimientos, funciones, cursores, tipos
y variables.
Una de las ventajas de poner estos objetos en un paquete es la
capacidad para hacer referencia a ellos desde el mismo paquete.
54
Packages
8.2. HEADER - Especificacin del Paquete.
La especificacin del paquete, tambin es llamado HEADER o cabecera
contiene informacin del contenido del paquete.
No contiene el cdigo pl/sql.
La especificacin de un paquete puede contener procedimientos,
funciones, variables, excepciones o otros tipos de datos, tal como en un
bloque annimo.
Los elementos pueden ser declarados en cualquier orden sin embargo
deben estar declarados antes de ser referenciados.
8.3. BODY Cuerpo del Paquete.
Contiene el cdigo de lo declarado en la cabecera.
Todas las declaraciones puestas en la cabecera deben estar
desarrolladas en el BODY, y sobretodo en el cuerpo la especificacin del
procedimiento o funcin debe ser la misma que en la cabecera.
Tambin puede contener otras declaraciones adicionales: variables,
cursores, types o subprogramas.
55
Packages
8.4. CREACION DE PAQUETE PL/SQL
Se realiza con el comando:
CREATE [OR REPLACE] PACKAGE [schema.]package_name
AS package
CREATE [OR REPLACE] PACKAGE BODY [schema.]package_name
AS plsql_package_body
56
Packages
Ej. Creacin de un paquete.
..continua.
Programacin PL/SQL-Carlos Janjachi
57
58
Packages
..continua.
Packages
..continua.
Programacin PL/SQL-Carlos Janjachi
59
Packages
Ej. Ejecucin del paquete.
60
Packages
Ej. Error de compilacin por diferencia entre HEADER y BODY.
61
Packages
8.6. Especificacin de Variables Globales.
El BODY de un paquete es opcional.
Si la cabecera del paquete contiene nicamente la declaracin de
variables, cursores, types y no contiene procedimientos ni funciones
entonces no se requiere el BODY.
En la practica, esta forma de codificar se utiliza para declarar variables
globales en las aplicaciones o desarrollos.
62
Packages
8.7. Object Types y Sobrecarga.
Se puede sobrecargar los subprogramas de un paquete con diferentes
tipos de objetos definidos por el usuario.
Ej. Creacin de tipos definidos por usuario.
63
Packages
Ej. Sobrecarga del paquete.
64
Programacin PL/SQL
Oracle 11g
9. Cursores en Oracle
Carlos Janjachi
carlos.janjachi@gmail.com
65
Cursores en Oracle
9.1. CURSOR
Un cursor es un subconjunto de datos definido por una consulta.
Se mantienen en memoria, desde que se abren y leen hasta que se cierran .
Un cursor apunta a un espacio de memoria en el rea de Proceso Global
(PGA), especficamente en el User Global Area (UGA) que contiene la sesin
del usuario, ah se almacena lo siguiente:
Filas (row) devueltas por un query.
Numero de filas procesadas por el query.
Un puntero al parsed query en el Shared Pool Area (Shared SQL Pool).
La vista que muestra los cursores es v$open_cursor.
9.2. Ciclo de Cursor
Se declara el cursor.
Al abrir el cursor, se toman una instantnea de los datos y se cargan a
memoria los registros devueltos por el query y el numero de registros.
Si luego se agregan, actualizan o eliminan los registros de la fuente, en
memoria el cursor no refleja estos cambios.
OPEN===>PARSE===>BIND===>EXECUTE===>FETCH===>CLOSE
Programacin PL/SQL-Carlos Janjachi
66
Cursores en Oracle
Ej. Datos en memoria en un cursor (Que sucede?).
..continua
Programacin PL/SQL-Carlos Janjachi
67
68
Cursores en Oracle
Cursores en Oracle
9.3. TIPOS DE CURSOR
En Oracle existen 4 tipos de cursores:
Cursores Explicitos
Cursores Implicitos
Cursores Variables
Cursores Sub-query
(*) SYS_REFCURSOR: es un tipo de cursor ref dbil y predefinido, permite
simplificar la declaracin de la variable de cursor de este modo:
l_cursor SYS_REFCURSOR;
69
Cursores en Oracle
9.4. CURSOR EXPLICITO
Se indica el cursor en la seccin DECLARATION en forma explicita con:
Usando la declaracin CURSOR
Asignndole un nombre.
Se especifica una sentencia SELECT para uso del cursor.
CURSOR cursor_name [parameter_list]
[RETURN return_type]
IS query
[FOR UPDATE [OF (column_list)][NOWAIT]];
parameter_list:
parmetro para uso en la ejecucin del query.
return_type:el tipo de dato que ser devuelto
column_list: lista de columnas
70
Cursores en Oracle
9.5. Clausula FOR UPDATE
Cuando se abre el cursor se bloquean los registros utilizados por el query.
Los registros se muestran como solo lectura (READ ONLY) para otras sesiones.
Si se indica NOWAIT no se abrir el cursor si no se logra obtener un bloqueo
exclusivo de los registros.
Parmetros en Cursores
Permite pasar valores al query durante su ejecucin
Ej. Cursor sin paso de valores.
CURSOR author_cur1
IS SELECT rowid FROM authors WHERE id > 50;
Ej. Cursor con paso de valores.
CURSOR author_cur1 (i_id IN NUMBER)
IS SELECT rowid FROM authors WHERE id > i_id;
71
Cursores en Oracle
9.6. Comando OPEN
Sirve para preparar y abrir un cursor para uso en pl/sql.
Cuando se ejecuta el query es parseado.
Los valores de las variables (bind) son pasados al query.
Se carga los registros devueltos al PGA.
Las sintaxis del comando es:
OPEN cursor_name [(parameter_values)];
72
Cursores en Oracle
9.7. Comando FETCH
Sirve para recibir registros desde el context area en un variable para su uso.
El comando acta sobre el registro actual (activo).
Continua con los siguientes registros uno a la vez.
Las sintaxis del comando es:
FETCH cursor_name INTO variable_name(s) | PL/SQL_record;
cursor_name:
variable_name:
73
Cursores en Oracle
Ej. Para registros pl/sql.
DECLARE
v_author authors%ROWTYPE;
BEGIN
...
FETCH author_cur INTO v_author;
...
Para referenciar al valor de la columna id en el registro author_cur se hace:
v_author.id
9.8. Comando CLOSE
Cierra un cursor abierto de forma explicita.
Las sintaxis del comando es:
CLOSE cursor_name;
74
Cursores en Oracle
9.9. Comando LOOP
Permite navegar por el cursor, cada registro activo es recibido y puesto listo
para uso. Se avanza un registro a la vez.
La sintaxis del comando es:
LOOP ... END LOOP;
Ej. Uso de loop.
75
Cursores en Oracle
9.10. Atributos de un Cursor
Los cursores en oracle manejan 6 atributos:
%BULK_EXCEPTIONS
%BULK_ROWCOUNT
%FOUND
%ISOPEN
%NOTFOUND
%ROWCOUNT
(*) Ver su uso en 09_ExplicitAttribute.sql
76
Cursores en Oracle
9.11. CURSOR IMPLICITO.
Son abiertos y cerrados por oracle.
En la practica, cada sentencia DML de tipo SQL se guarda como un cursor en el
PGA (context area).
No manejan OPEN, FETCH, CLOSE pero si permiten el uso de
%BULK_EXCEPTIONS, %BULK_ROWCOUNT, %FOUND, %ISOPEN, %NOTFOUND,
%ROWCOUNT
77
Cursores en Oracle
Ej. Uso de cursor implcito
78
Cursores en Oracle
9.12. CURSOR VARIABLE.
Se declara el cursor como un registro.
En tiempo de ejecucin se asigna un query al cursor.
79
Cursores en Oracle
9.13. CURSOR SUB-QUERY.
Consiste en utilizar un cursor como parte del query que define otro cursor.
Ver ejemplo en 09_CursorSubquery.sql
80
Cursores en Oracle
9.14. Numero de Cursor Abiertos
El numero de maximo cursores abiertos se especifica en parametro
OPEN_CURSORS en el init.ora.
81
Programacin PL/SQL
Oracle 11g
10.Handling Exceptions
Carlos Janjachi
carlos.janjachi@gmail.com
82
Handling Exceptions
10.1. Bloque PL/SQL
La estructura de un bloque pl/sql contiene las siguientes secciones:
DECLARATION
BEGIN, END
EXCEPTION
Usado para atrapar los errores que ocurren durante la ejecucin.
83
Handling Exceptions
10.2. Manejo de Excepciones
Existen dos tiempos para manejar las excepciones:
Compilacin
Reportado por el compilador.
Ejecucin
Los errores son lanzados por un manejador de excepciones.
84
Handling Exceptions
10.3. SQLCODE y SQLERROR
SQLCODE
Retorna el numero de error de la excepcin.
SQLERROR
Retorna el mensaje de error de la excepcin.
85
Handling Exceptions
10.4. Excepciones Predefinidas
La lista de excepciones se encuentran en
..\product\11.1.0\db_1\RDBMS\ADMIN\stdspec
Algunos tipos comunes de excepciones predefinidas son:
86
Handling Exceptions
10.5. Excepciones Definidas Usuario
Son excepciones definidas por desarrollador en la seccin DECLARE e
indicando la excepcin que manejara.
Se hace de dos formas:
Utilizando PRAGMA EXCEPTION_INIT para asociar la excepcin con un numero
de error.
87
Handling Exceptions
10.5. Excepciones Definidas Usuario
Declarando la excepcin, lanzando la excepcin y manejndola en la seccin
EXCEPTION.
88
Handling Exceptions
10.6. Propagacin de Excepciones
Un bloque interno lanza y maneja una excepcin.
Cuando el bloque interno es terminado el control pasa a las sentencias del
bloque externo.
89
Handling Exceptions
10.6. Propagacin de Excepciones
Un bloque interno lanza la excepcin A pero no la controla.
El bloque interno propaga el error al bloque externo donde se controla la
excepcin.
90
Handling Exceptions
10.6. Propagacin de Excepciones
Un bloque interno lanza la excepcin A pero no la controla.
El bloque interno propaga el error al bloque externo
El bloque externo no controla la excepcin y la propagada hacia el host.
91
Handling Exceptions
Enlaces
92
Programacin PL/SQL
Oracle 11g
93
94
pivot_column:
columnas a ser agregadas
pivot_for_column: columnas a ser agrupadas y pivoteadas
pivot_in_column: un filtro para las columnas en pivot_for_column
Programacin PL/SQL-Carlos Janjachi
95
96
97
98
99
100
101
Programacin PL/SQL
Oracle 11g
102
Dynamic SQL
12.1. SQL DINAMICO.
Permite ejecutar sentencias sql construidas en tiempo de ejecucin.
A diferencia de un SQL esttico, los SQL dinmicos no conocen las tablas,
columnas o sentencias hasta el momento de ejecucin.
En un SQL esttico, oracle toma conocimiento de las tablas, columnas o
sentencias de un bloque pl/sql al momento de compilarlo.
En un SQL esttico, al compilar se reconoce los privilegios, roles que se
requieren para el bloque pl/sql.
Un SQL esttico genera estadsticas, por lo que se puede optimizar.
Los usos de SQL dinamico son:
Se puede incluir sentencias DDL en la ejecucion del bloque pl/sql.
Se puede construir el codigo de acuerdo a las necesidades del algoritmo
de desarrollo.
103
Dynamic SQL
12.2. EXECUTE IMMEDIATE
Permite ejecutar sentencias de forma dinmica en un bloque pl/sql.
La sintaxis es:
EXECUTE IMMEDIATE statement;
Ej. Script de sql dinmico.
104
Dynamic SQL
Ej. Script de sql dinmico (continuacin).
105
Dynamic SQL
Ej. Script para identificar y compilar objetos descompilados.
106
Programacin PL/SQL
Oracle 11g
107
Manejo de Dependencias
13.1. Dependencias en una Funcin.
Cuando una funcin se compila, se registra en el diccionario de datos la
dependencia a todos los objetos de Oracle a los que hace referencia.
Una funcin puede volverse no valido si una operacin DDL altera la estructura
de sus objetos referenciados.
Ej. Creacin de una funcin que depende de un objeto.
108
Manejo de Dependencias
Ej. Modificacin de un objeto referenciado.
109
Manejo de Dependencias
Re-Compilacin Automtica.
Si una funcin no es valida, el pl/sql engine lo re-compilara automaticamente en
la prxima llamada.
Ej. Re-compilacin automtica.
110
Manejo de Dependencias
Re-Compilacin Manual.
Si una funcin no es valida, se puede re-compilar de forma manual con el
comando COMPILE.
ALTER FUNCTION function_name COMPILE;
Ej. Re-compilacin manual.
111
Manejo de Dependencias
13.2. Dependencias en un Procedimiento Almacenado.
Cuando un procedimiento se compila, se registra en el diccionario de datos la
dependencia a todos los objetos de Oracle a los que hace referencia.
Un procedimiento puede volverse no valido si una operacin DDL altera la
estructura de sus objetos referenciados.
Ej. Creacin de un procedimiento que depende de un objeto.
112
Manejo de Dependencias
Ej. Modificacin de un objeto referenciado.
113
Manejo de Dependencias
Re-Compilacin Automtica.
Si una funcin no es valida, el pl/sql engine lo re-compilara automaticamente en
la prxima llamada.
Ej. Re-compilacin automtica.
114
Manejo de Dependencias
Re-Compilacin Manual.
Si un procedimiento no es valido, se puede re-compilar de forma manual con el
comando COMPILE.
ALTER PROCEDURE procedure_name COMPILE;
Ej. Re-compilacin manual.
115
Manejo de Dependencias
13.3. Dependencia en un Paquete.
Cuando un procedimiento almacenado o funcin se compila, todos los objetos
de Oracle a los que hace referencia se registran en el diccionario de datos.
Si un paquete tiene errores de compilacin se marca como no vlida en el
diccionario de datos.
Un paquete tambin puede volverse no valido si una operacin DDL se realiza
en uno de sus objetos referenciados.
Si se hace un DDL (ej. drop) sobre un objeto referenciado entonces solo el
BODY se hace invalida.
Si se agrega una declaracin de otro objeto al HEADER tambien se
invalida el BODY.
116
Manejo de Dependencias
Dependencia de Objetos.
Ej. Creacin de tabla referenciada.
117
Manejo de Dependencias
Ej. Verificacin del estado de los objetos.
118
Manejo de Dependencias
Ej. Modificacin de la tabla. ?.
119
Manejo de Dependencias
Re-Compilacin Automtica.
Si una funcin no es valida, el pl/sql engine lo re-compilara automticamente en
la prxima llamada.
Ej. Re-compilacin automtica.
120
Manejo de Dependencias
Re-Compilacin Manual.
Si un procedimiento no es valido, se puede re-compilar de forma manual con el
comando COMPILE.
ALTER PACAKGE package_name COMPILE;
ALTER PACKAGE package_name COMPILE SPECIFICATION;
ALTER PACKAGE package_name COMPILE BODY;
121
Programacin PL/SQL
Oracle 11g
122
Large Objects
14.1. LARGE OBJECTS
Se conocen como LOBs.
Existen dos tipos de large objects:
Internal LOBs
Almacenados en la base de datos como BLOB, CLOB y NCLOB.
External LOBs
Son almacenados en un archivo del sistema operativo BFILE.
14.2. DBMS_LOB
Es la API pl/sql de oracle para la lectura y escritura de los tipo de datos LOBs.
Para trabajar con tipos LOB se requiere un LOB locator, que es un puntero a la
actual posicion del LOB (tanto en base de datos como en archivo).
(*) Los procedimientos y funciones de DBMS_LOB se detallan en el anexo 1.
14.3. APPEND.
Agrega un lob origen a un lob destino.
Trabaja con BLOB, CLOB y NCLOB.
No carga un CLOB a un BLOB.
123
124
Large Objects
Ej. Uso de append.
Large Objects
125
Large Objects
14.4. LOADCLOBFROMFILE/LOADBLOBFROMFILE
Permite cargar un archivo a una columna CLOB, BLOB.
Ej. Carga de un archivo pdf y txt a la base de datos.
126
Large Objects
127
Large Objects
Verificacin de la carga del archivo.
128
Programacin PL/SQL
Oracle 11g
15. Triggers
Carlos Janjachi
carlos.janjachi@gmail.com
129
Triggers
15.1. DATABASE TRIGGERS.
Algunas caractersticas de los triggers son:
Son bloques pl/sql nombrados.
Son objetos independientes y no forman parte de un bloque o paquete pl/sql.
Contienen las secciones DECLARATIVE, EXECUTION, EXCEPTION.
Un trigger no acepta parametros de entrada o salida.
15.1. CICLO DE UN TRIGGER.
Se crean con el comando CREATE [OR REPLACE] TRIGGER.
Se almacenan en la base de datos como objetos independientes.
Un trigger es llamado de forma implcita cuando ocurren ciertos eventos
como:
Sentencias DML: insert, delete, update.
Sentencias DDL: operaciones sobre una tabla o vista.
Eventos del sistema: startup. shutdown
Eventos del usuario: logon, logoff
130
Triggers
15.3. USOS DE TRIGGERS.
Aumenta la integridad de la base de datos, permite la creacin de
restricciones complejas.
Permite el registro de la auditoria de cambios de una tabla.
Permite lanzar acciones en base de datos ante cambios en una tabla.
131
Triggers
15.4. CREACIN DE TRIGGERS.
Se realiza con la sintaxis:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} triggering_event
[referencing_clause]
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body;
trigger_name:
nombre del trigger
triggering_event:
evento que dispara el trigger
(puede incluir la tabla o vista)
referencing_clause:indica los registros a evaluar
trigger_condition:
condicion a evaluar, si es verdadero se ejecuta el
trigger_body del trigger.
(*) El trigger_body no debe exceder 32K.
Programacin PL/SQL-Carlos Janjachi
132
Triggers
15.5. TRIGGER DML.
Se dispara ante sentencias DML: insert, update, delete.
Actan sobre todas o algunas de las filas de una tabla.
Las opciones de lanzamiento de un trigger DML son:
Categoria
Statement
Timing
Level
Valor
INSERT, UPDATE, DELETE
BEFORE o AFTER
ROW o Statement
133
Triggers
15.6. Pseudo Registros OLD y NEW .
Presentes a nivel de fila (row).
Permiten acceder desde el trigger a la data que actualmente se esta
procesando.
El compilador los considera como pseudo registros de la forma:
triggering_table%ROWTYPE
Statement :old
INSERT
UPDATE
DELETE
:new
indefinido, todas la filas null valores que seran insertados
valores de la fila antes de
nuevos valores
actualizar
valores de la fila antes de
indefinido, todas la filas null
eliminar
134
Triggers
Pseudo Registros OLD y NEW .
Ej. Insercin de registros a tabla con ID secuencial.
135
Triggers
15.7. Clausula WHEN .
Solo presentes a nivel de fila (row).
Se ejecuta el BODY del trigger solo cuando las filas cumplen la condicin.
136
Triggers
15.8. INSTEAD OF TRIGGER .
Se definen para una vista.
Se dispara ante sentencias DML.
Reemplaza el cdigo de la sentencia DML.
Creacin de Instead of Trigger
La sintaxis del comando es:
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
{BEFORE | AFTER}
{ddl_event_list | database_event_list}
ON {DATABASE | [schema.]SCHEMA}
[when_clause]
trigger_body;
ddl_event_list: lista de sentencias DDL separado por OR
database_event_list: lista de eventos de BD separado por OR
137
Triggers
Instead of Trigger.
Ej. Creacin de una vista.
138
Triggers
Instead of Trigger.
Ej. Creacin de un trigger instead of.
139
Triggers
15.9. SYSTEM TRIGGER.
Se dispara ante sentencias DDL o comandos de base de datos.
DDL: CREATE, ALTER, DROP
Database: startup, shutdown
Creacin de System Trigger
La sintaxis del comando es:
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
{BEFORE | AFTER}
{ddl_event_list | database_event_list}
ON {DATABASE | [schema.]SCHEMA}
[when_clause]
trigger_body;
ddl_event_list: lista de sentencias DDL separado por OR
database_event_list: lista de eventos de BD separado por OR
140
Triggers
System Trigger .
Ej. Creacin de una tabla de Auditoria de conexiones.
141
Triggers
15.10. USER_TRIGGERS
Diccionario de Datos de un Trigger.
Cuando un trigger es creado se almacena en el diccionario de datos.
La vista user_triggers nos muestra informacin sobre el trigger: nombre, el
body, la clusula when, la tabla o vista, el tipo de trigger, estado etc.
Eliminacin de un Trigger
El comando tiene la sintaxis:
DROP TRIGGER triggername;
Deshabilitacin y Habilitacin de un Trigger
Para un trigger en particular:
ALTER TRIGGER triggername {DISABLE | ENABLE};
Los trigger de una tabla:
ALTER TABLE name_table {DISABLE | ENABLE} ALL TRIGGER ;
Programacin PL/SQL-Carlos Janjachi
142
Triggers
Enlaces
143
Programacin PL/SQL
Oracle 11g
144
Vistas Materializadas
16.1. Vista Materializada.
Es una replica de datos de una base de datos maestra externa. La base de datos
maestra puede ser una tabla transaccional, mientras esta tabla se actualiza
constantemente la vista materializada se actualiza de forma manual.
Datawarehouse.
Se pueden utilizar vistas materializadas para hacer reportes y resmenes por
agrupamiento y calculo de los datos externos.
145
Vistas Materializadas
sta ilustracin muestra una vista materializada que se comunica con cada uno de
los tres sitios mediante un enlace de base de datos, las bases de datos mster se
comunican entre s mediante dblink de base de datos.
Programacin PL/SQL-Carlos Janjachi
146
Vistas Materializadas
16.2. Beneficios de Uso de Vista Materializada.
Algunas ventajas de su uso son:
Reducir la carga de red.
Concentrando los datos de diferentes servidores en un solo servidor de
base de datos.
Las vistas materializadas se actualizan a travs de un proceso batch y en
periodos controlados.
Mejorar la velocidad de las consultas.
Creando en el servidor de la aplicacin replicas de las base de datos
externas que son altamente consultadas.
Crear vistas personalizadas para las aplicaciones finales.
Creando en el servidor de la base de datos subconjuntos de datos
personalizados para cada aplicacin final.
Permite el uso de datos off-line.
Las vistas materializadas no requiere una conexin de red dedicada, la
actualizacin de los datos desde las fuentes se puede hacer de forma
manual en el momento que se requiera.
Programacin PL/SQL-Carlos Janjachi
147
Vistas Materializadas
16.3. Creacin de Vistas Materializadas.
La sintaxis para la creacin de una vista materializada es:
CREATE MATERIALIZED VIEW nombre_vista_m
[TABLESPACE nombre_ts]
[PARALELL (DEGREE n)]
[BUILD {INMEDIATE|DEFERRED}]
[REFRESH {ON COMMIT | ON DEMAND | [START WITH fecha_inicio] NEXT
fecha_intervalo } | {COMPLETE | FAST | FORCE} ]
[{ENABLE|DISABLE} QUERY REWRITE]
AS SELECT ... FROM ... WHERE ...
por defecto:
BUILD : INMEDIATE
REFRESH : FORCE
ENABLE: DISABLE
148
Vistas Materializadas
16.4. Creacin de Vistas Materializadas.
BUILD :
INMEDIATE, la tabla asociada con la vista se puebla al momento de la
ejecucin del comando CREATE.
DEFERRED, el comando CREATE solo crea la estructura y la data se puebla
en la primera actualizacin de la vista.
REFRESH:
COMPLETE, la tabla asociada a la vista se borra completamente y se
vuelven a insertar todos los registros devueltos por el SQL de la vista.
FAST, la vista se actualiza solo con los cambios en los datos de las tablas
fuentes realizados desde la ultima actualizacin.
Se debe crear previamente los logs de cambios de todas las tablas
fuentes con CREATE MATERIALIZED VIEW LOG.
No soporta las funciones SUM, AVG, MAX, MIN o COUNT.
FORCE, si es posible la vista se actualiza con el mtodo FAST sino utiliza
COMPLETE.
149
Vistas Materializadas
16.5. Creacin de Vistas Materializadas.
{ENABLE|DISABLE} QUERY REWRITE
Determina si el optimizador de Oracle (basado en costos) puede o no
reescribir la sentencia SQL de la vista.
150
Vistas Materializadas
16.6. Actualizacin Manual.
Se realizan utilizando el paquete PL/SQL estndar DBMS_MVIEW
Una vista especifica.
DBMS_MVIEW.REFRESH (' nombre_vista_m)
Todas las vistas que utilicen las tablas o vistas materializadas indicadas.
DBMS_MVIEW.REFRESH_DEPENDENT ('nom_tab1, nom_tab2, ...')
151
Vistas Materializadas
16.7. Actualizacin Automtica.
ON COMMIT
La vista se actualiza cada vez que se ejecuta un COMMIT sobre alguna de
las tablas fuentes de la vista.
Programado.
Se programa en un tiempo determinado.
START WITH [hora del primer refresco en formato datetime]
NEXT[intervalo de tiempo entre actualizaciones en formato datetime ]
152
Vistas Materializadas
Ej. Una vista materializada de una tabla que se actualiza un da a la semana y
de manera incremental.
CREATE MATERIALIZED VIEW LOG ON tabla_origen
WITH PRIMARY KEY
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW nombre_vm
REFRESH FAST NEXT SYSDATE + 7
AS SELECT campo1, campo2, campo8
FROM tabla_origen
WHERE campo2 > 5000;
153
Vistas Materializadas
Ej. Actualizacin programada de una Vista Materializada.
CREATE MATERIALIZED VIEW name_vm
REFRESH START WITH ROUND(SYSDATE + 1) + 9/24
NEXT NEXT_DAY(TRUNC(SYSDATE), 'TUESDAY') + 16/24
AS SELECT ...;
Ej. Actualizacin Manual de una Vista Materializada.
begin
dbms_mview.refresh(name_vm');
end;
154
Vistas Materializadas
Enlaces
155
Programacin PL/SQL
Oracle 11g
A1. Arquitectura de la BD
Carlos Janjachi
carlos.janjachi@gmail.com
156
Arquitectura de la BD
Oracle Server
Es un sistema gestor de base de datos.
Compuesto por una Instancia y una Base de Datos Oracle.
Oracle Instance
Gestiona el acceso a la base de datos (sesiones).
Compuesta por memoria y procesos en background.
Oracle Database
Una coleccin de datos integrados.
Compuesta por tres tipos de archivos:
Control file
Data file
Online Redo Log file
157
Arquitectura de la BD
Database Connection
158
Arquitectura de la BD
Procesos de Oracle
Oracle implementa tres tipos de procesos durante la conexin.
User process
Se inicia cuando un usuario hace un request a la base de datos.
Server Process
Se conecta con la instancia de oracle.
Se inicia cuando el usuario establece una sesion.
Background Process
Se inicia cuando se inicia la instancia de oracle.
159
Arquitectura de la BD
Arquitectura de Componentes de la Base de Datos
160
Arquitectura de la BD
Arquitectura de la Base de Datos
161
Programacin PL/SQL
Oracle 11g
162
SQL Loader
SQL Loader
Es una utilidad para cargar datos a la base de datos oracle.
A menudo es utilizado para transportar datos de recursos externos a la base
de datos.
163
SQL Loader
Control File
Indica donde encontrar la data a cargar.
El formato de la data.
Otros detalles de configuracin.
Gestin de memoria.
Record rejection.
Interrupcin de la carga.
Como se manipula la data.
Input File
SQL Loader lee la data desde dos o mas archivos indicados en el control file.
Un data file puede tener uno de los tres formatos:
Fixed record
Variable record
Stream record
164
SQL Loader
Control File
Indica donde encontrar la data a cargar.
El formato de la data.
Otros detalles de configuracin.
Gestin de memoria.
Record rejection.
Interrupcin de la carga.
Como se manipula la data.
Input File
SQL Loader lee la data desde dos o mas archivos indicados en el control file.
Un data file puede tener uno de los tres formatos:
Fixed record
Variable record
Stream record
165
Programacin PL/SQL
Oracle 11g
166
Tipos de Sentencias
Tipos de Scripts SQL
Algunos tipos de script sql son:
DML
Data Manipulation Language.
Sentencias para el manejo de los datos de un esquema o una base de
datos.
Se ejecuta en un bloque pl/sql.
Incluye las sentencias:
select, insert, update, delete,
merge, operacin upsert (insert o update).
call, llamada a subprograma pl/sql o java.
explain plan, muestra el plan de acceso a la data.
lock table, controla la concurrencia sobre una tabla.
167
Tipos de Sentencias
Tipos de Scripts SQL
DDL
Data Definition Language.
Sentencias para definir la estructura de un esquema o base de datos.
No se ejecuta en un bloque pl/sql. ?
Incluye los comandos:
create, crea un objeto en la base de datos.
alter, altera un objeto en la base de datos.
drop, elimina un objeto en la base de datos.
truncate, remueve todos los registros de una tabla incluyendo el
espacio asignado para los registros.
comment, agregar comentarios al diccionario.
rename, renombrar un objeto.
Se hace un commit implcito antes y despus del comando.
Si se lanza un DDL sobre un objeto (ej. tabla) el objeto que es
dependiente (ej. procedure) puede hacerse invalido.
168
Tipos de Sentencias
Insert
INSERT INTO table_name [(column_list)]
VALUES select_statement | (value_list);
169
Tipos de Sentencias
Update
UPDATE table_name
SET column_name = select_statement | value [, column_name =
value]
[WHERE where_clause | WHERE CURRENT OF cursor];
170
Tipos de Sentencias
Update
171
Tipos de Sentencias
Delete
DELETE FROM table_name
[WHERE where_clause | WHERE CURRENT OF cursor]
172
Tipos de Sentencias
Tipos de Scripts SQL
DCL
Data Control Language
Usado para controlar el acceso a la base de datos.
Incluye los comandos:
grant, conceder privilegios de acceso a la base de datos.
revoke, retirar privilegios de acceso a la base de datos.
TCL
Transaction Control Language
Usado para controlar los cambios en una transaccin.
Incluye los comandos:
commit, rollback
savepoint, indica un punto en la transaccin hacia el cual se puede
hacer rollback.
set transaction, cambia las opciones en una transaccin (READ ONLY,
READ WRITE, ISOLATION LEVEL, ..).
173
174
Tipos de Sentencias
Savepoint.
PL/SQL Bsico
Enlaces
SET TRANSACTION
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/se
ttransaction_statement.htm
SAVEPOINT
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sq
loperations.htm#BABGAAIG
175
Programacin PL/SQL
Oracle 11g
176
Job Scheduler
Job Scheduler
Ciclo de JOB
Un job se programa con el paquete DBMS_JOB, a partir de 10g con el paquete
DBMS_SCHEDULER (con scheduler no se requiere setear parmetros de
inicializacin).
Los jobs son programados conforme llegan a la cola (queue).
177
Job Scheduler
Privilegios
La cuenta que administra el scheduler debe tener el rol SCHEDULER_ADMIN.
Creacin de un Job
La sintaxis para crear un job a partir de un procedimiento con scheduler es:
DBMS_SCHEDULER.CREATE_JOB (
job_name
IN VARCHAR2
-- nombre job,
job_type
IN VARCHAR2
-- PLSQL_BLOCK / STORED_PROCEDURE
job_action
IN VARCHAR2,
-- cdigo plsql /nombre procedimiento
number_of_arguments IN PLS_INTEGER, -- parametros del job, 0-255, default 0
start_date
IN TIMESTAMP, -- tiempo inicio (zona horaria por defecto)
repeat_interval IN VARCHAR2, -- frecuencia de repeticin
end_date
IN TIMESTAMP, -- tiempo fin (zona horaria por defecto)
job_class
IN VARCHAR2,
-- default 'DEFAULT_JOB_CLASS'
enabled
IN BOOLEAN
-- default FALSE
auto_drop
IN BOOLEAN,
-- drop al finalizar o inhabilitar, default TRUE
comments
IN VARCHAR2,
-- default NULL
);
178
Job Scheduler
Ejemplo.
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name
=> 'STRESS_BD',
job_type
=> 'PLSQL_BLOCK',
job_action
=> 'BEGIN lsys.sp_proceso; END;',
start_date
=> 05-MAR-11 04.35.00 PM AMERICA/LIMA',
repeat_interval => 'FREQ=MINUTELY; INTERVAL=1;',
end_date
=> 05-MAR-11 05.00.00 PM AMERICA/LIMA',
enabled
=> TRUE,
comments
=> 'Cada minuto');
END;
179
Job Scheduler
Referencias
dbms_scheduler
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_sched.ht
m
180