Está en la página 1de 40

Curso de

administracin de
Oracle 10g (10.2)
Nivel Intermedio
Manual del alumno
Copyright Cdric Simon, 2008 Versin 1.0 Reproduccin prohibida

S
o
l
u
c
i
o
n
J
a
v
a
.
c
o
m


I
n
g
.

C
e
d
r
i
c

S
i
m
o
n


T
e
l
:

2
2
6
8

0
9
7
4


C
e
l
:

8
8
8
8

2
3
8
7


E
m
a
i
l
:


c
e
d
r
i
c
@
s
o
l
u
c
i
o
n
j
a
v
a
.
c
o
m


W
e
b
:

w
w
w
.
s
o
l
u
c
i
o
n
j
a
v
a
.
c
o
m
Curso de administracin de Oracle 10g (10.2) Pagina 2 / 40
1 ndice
1 ndice .................................................................................................................................................................................. 2
1 Introduccin al curso ......................................................................................................................................................... 4
1.1 Objetivo de este curso ................................................................................................................................................ 4
1.2 Manual del alumno ..................................................................................................................................................... 4
1.3 Requisitos para atender a este curso ........................................................................................................................ 4
1.4 Soporte despus del curso .......................................................................................................................................... 4
2 DML - Sentencias de manipulacin de datos ................................................................................................................... 5
2.1 Objetivo del captulo .................................................................................................................................................. 5
2.2 nsert ............................................................................................................................................................................ 5
2.3 !pdate ......................................................................................................................................................................... 5
2.4 "elete ........................................................................................................................................................................... 5
2.5 #ommit $ rollbac% ...................................................................................................................................................... 5
2.& Select ............................................................................................................................................................................ &
2.' ()ere .......................................................................................................................................................................... &
2.* #ount ........................................................................................................................................................................... '
2.+ Sum, av-, min, ma. .................................................................................................................................................... '
2.1/ "istinct ....................................................................................................................................................................... '
2.11 Order b$ .................................................................................................................................................................... '
2.12 !niones ..................................................................................................................................................................... '
2.13 Subconsultas ............................................................................................................................................................. *
2.14 0-rupaciones ............................................................................................................................................................ *
2.15 Operadores S12 ...................................................................................................................................................... *
2.1& 2a ausencia de valor3 4!22 ................................................................................................................................ 1/
2.1' Rendimiento ............................................................................................................................................................ 1/
3 Creacin de obetos .......................................................................................................................................................... 11
3.1 5istas ......................................................................................................................................................................... 11
3.1.1 Creacin .............................................................................................................................................................. 11
3.1.2 Modificacin ....................................................................................................................................................... 11
3.1.3 Eliminacin ......................................................................................................................................................... 11
3.1.4 Ejercicios ............................................................................................................................................................. 11
3.2 Secuencias ................................................................................................................................................................. 11
3.2.1 Creacin .............................................................................................................................................................. 11
3.2.2 Modificacin ....................................................................................................................................................... 12
3.2.3 Eliminacin ......................................................................................................................................................... 12
3.2.4 Ejercicios ............................................................................................................................................................. 12
3.3 5istas materiali6adas ............................................................................................................................................... 12
3.3.1 Creacin .............................................................................................................................................................. 12
3.3.2 Modificacin ....................................................................................................................................................... 13
3.3.3 Eliminacin ......................................................................................................................................................... 13
3.4 Sin7nimos .................................................................................................................................................................. 13
3.4.1 Creacin .............................................................................................................................................................. 13
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 3 / 40
3.4.2 Eliminacin ......................................................................................................................................................... 14
3.4.3 Ejercicios ............................................................................................................................................................. 14
3.5 "8 2in% ..................................................................................................................................................................... 14
3.5.1 Creacin .............................................................................................................................................................. 14
3.5.2 Eliminacin ......................................................................................................................................................... 16
4 !L"S#L b$sico ................................................................................................................................................................. 1%
4.1 ntroducci7n .............................................................................................................................................................. 1'
4.2 8loque an7nimo 92:S12 ......................................................................................................................................... 1'
4.3 denti;icadores .......................................................................................................................................................... 1'
4.4 5ariables ................................................................................................................................................................... 1'
4.4.1 Tipos de variables ................................................................................................................................................ 17
4.4.2 Variables locales ................................................................................................................................................. 1
4.4.3 Variables !lobales ............................................................................................................................................... 1
4.5 #ontrol de ;lujo ......................................................................................................................................................... 1*
4.& 8ucles ......................................................................................................................................................................... 1+
4.6.1 "##$ .................................................................................................................................................................. 1%
4.6.2 &'("E ................................................................................................................................................................ 1%
4.6.3 )#* ..................................................................................................................................................................... 1%
4.' #ursores .................................................................................................................................................................... 2/
4.* <.cepciones ............................................................................................................................................................... 21
4..1 E+cepciones predefinidas ................................................................................................................................... 22
4..2 E+cepciones definidas por el ,s,ario ................................................................................................................. 23
4..3 *-(.E/-$$"(C-T(#0/E**#* ...................................................................................................................... 25
4.+ 9rocedimientos, ;unciones, paquetes, disparadores .............................................................................................. 25
4.%.1 ),nciones ............................................................................................................................................................ 25
4.%.2 $rocedimien1os .................................................................................................................................................... 32
4.%.3 $a3,e1es ............................................................................................................................................................... 31
4.%.4 4isparadores ........................................................................................................................................................ 33
4.%.5 Ejercicios ............................................................................................................................................................. 36
5 S#L Loader ...................................................................................................................................................................... 3%
& 'espaldo ( reposicin de la base de datos ....................................................................................................................... 3)
&.1 Respaldos ;sicos online ............................................................................................................................................ 3+
6.1.1 *espaldos en calien1e 5online6 ............................................................................................................................. 3%
&.2 Restauraci7n )aca un cierto punto el en pasado .................................................................................................. 3+
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 4 / 40
1 Introduccin al curso
1.1 Objetivo de este curso
Este curso brindar al alumno el conocimiento necesario para administrar una base de datos Oracle 10g.
1.2 Manual del alumno
Este manual del alumno es una ayuda para el alumno, para tenga un recuerdo del curso. Este manual
contiene un resumen de las materias que se van a estudiar durante el curso, pero el alumno debera de
tomar notas personales para completas este manual.
1.3 Requisitos para atender a este curso
Se requiere un conocimiento del lenguaje SQL.
1.4 Soporte despus del curso
Si tienes preguntas sobre la materia del curso en tus ejercicios prcticos, puedes escribir tus
preguntas a cedric@solucionjava.com .

- Respaldos en caliente (online)
- Reposicin de base de datos con aplicacin de logs
- Programacin de trabajos de mantenimiento
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 5 / 40
2 DML - Sentencias de manipulacin
de datos
2.1 Objetivo del captulo
Al fin de este captulo el alumno ser capaz de hacer encuestas de la base de datos. No vamos a ver todas
las opciones, ni las encuestas de otros objetos de la base de datos (vistas, funciones, secuencias,...) porque
eso sale del cuadro de este curso de iniciacin.
Existen muchas opciones (top, exists, cube,...) para cada tipo de accin, pero estas opciones dependen de
la base de datos utilizadas y/o de su versin. Solo vamos a ver las sentencias bsicas.
Existen muchos entornos que simplifican las encuestas sobre los datos.
2.2 Insert
La sentencia Insert permite de insertar datos en una tabla.
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) VALUES
(<valor_campo_1>,<valor_campo_2>,<valor_...>);
Tambin existe:
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) <SELECT STATEMENT>;
2.3 Update
La sentencia Update permite de modificar el valor de uno o varios datos en una tabla.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>;
De costumbre se limita el cambio a ciertos registros, mencionados utilizando una clusula WHERE.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>
WHERE <clusula_where>;
2.4 Delete
La sentencia Delete permite de borrar un uno o varios registros en una tabla.
DELETE FROM <nombre_de_tabla> ;
De costumbre se limita el borrado a ciertos registros, mencionados utilizando una clusula WHERE.
DELETE FROM <nombre_de_tabla> WHERE <clusula_where>;
2.5 Commit y rollback
Si la base de datos permite la gestin de transacciones, se puede utilizar Commit para confirmar una
Insert, Update, o Delete, o `Rollback` para cancelarlos. Ciertas base de datos pueden ser confiuradas
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 6 / 40
para autocommit, que hace un commit automaticamente despues de cada instruccin, a menos que se ha
iniciado una transaccin de manera explicita (con 'begin transaction xxx;).
Hasta que el Commit est ejecutado, las modificaciones no estn inscritas de manera permanente en la
base de datos, y slo son visible para la sesin en curso del usuario autor de las acciones. Despus del
Commit, los cambios son definitivos y visible para todos.
Cuidado que ciertos objetos pueden quedar bloqueados (bloqueando otros usuarios) hasta que el commit
sea hecho.
El commit/rollback permite confirmar o de hacer un lote de transaccin, para que si una falle, todas las
anteriores se anulan tambin. Cuando se necesita una integridad de transaccin, se utiliza en
commit/rollback.
Ejemplo:
SELECT emp_no,job_grade FROM employee where emp_no=45;
START TRANSACTION;
update employee set job_grade=5 where emp_no=45;
SELECT emp_no,job_grade FROM employee where emp_no=45;
rollback;
SELECT emp_no,job_grade FROM employee where emp_no=45;
START TRANSACTION;
update employee set job_grade=5 where emp_no=45;
SELECT emp_no,job_grade FROM employee where emp_no=45;
commit;
SELECT emp_no,job_grade FROM employee where emp_no=45;
2.6 Select
El Select permite de seleccionar datos en la base de datos, y visualizarlos.
Se puede utilizar un alias para que el campo se pueda llamar con otro nombre.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla>;
SELECT <campo_1> as <alias1>,<campo_2>,<...> FROM <nombre_tabla>;
Para seleccionar todos los campos de la tabla, se utiliza el asterisco en vez de los nombres de campo.
SELECT * FROM <nombre_tabla>;
Ejemplo:
SELECT emp_no,job_grade as nivel FROM employee;
SELECT * FROM employee;
2.7 Where
La clusula Where permite de limitar la encuesta a ciertos datos.
Se utiliza evaluando un campo versus una condicin. Se pueden utilizar varias condiciones, con el uso de
Or, And, y/o parntesis.
Para compara nmeros, se utiliza el signo '=', o '<', o'>', o'<=', o '>=', o 'between ... and ...'.
Para comparar caracteres se utiliza la palabra 'like'. El wildcard es '%'.
Para compara fecha, se utiliza el signo '=', o '<', o'>', o'<=', o '>=', o 'between ... and ...'.
Para
SELECT * FROM <nombre_tabla>
WHERE <campo_1> <operation> <condicin> AND <campo_2> <operation> <condicin>;
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 7 / 40
Ejemplo:
SELECT emp_no,job_grade FROM employee where emp_no>45;
SELECT emp_no,job_grade FROM employee where emp_no=45 or emp_no=41;
SELECT * FROM employee where emp_no between 40 and 45;
SELECT * FROM employee where last_name like 'P%';
2.8 Count
Para contar un numero de registros, se utiliza la palabra Count.
SELECT COUNT(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT count(*) FROM employee where job_grade=4;
2.9 Sum, avg, min, max
Para una suma, min, max,... de un campo, se utilizan la palabras Sum, Min, Max, Avg.
SELECT SUM(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT avg(salary) FROM employee where job_grade=2;
2.10Distinct
Para tener la lista de valores distingas de un campo, se utiliza la palabra Distinct.
SELECT DISTINCT(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT distinct(job_grade) FROM employee;
2.11Order by
Para ordenar los registros regresados, hay que utilizar la palabre Order by.
SELECT * FROM <nombre_tabla>
ORDER BY <campo_1>,<....>;
Ejemplo:
SELECT first_name,last_name FROM employee order by first_name,last_name;
2.12Uniones
Uniones permiten de unir los resultados de dos consultas. Para poder unirlas, tienen que tener los
mismos campos.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_1>
UNION
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_2>;
Ejemplo:
select t.first_name,t.last_name from employee t where job_grade=5
union
select t2.fname,t2.lname from usuario t2;
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 8 / 40
2.13Subconsultas
Subconsultas son consultas sobre otras consultas. La subconsulta se puede utilizar el la cusula From, o
el la condicin de la clsula Where. La subconsulta se pone entre parntesis. En MySQL, las
subconsultas deben tener sus propios alias.
SELECT t3.<campo_1>, t3.<campo_2> FROM (SELECT t.<campo_1>, t.<campo_2> FROM <nombre_tabla > t
<where cluase>) t3
WHERE t3.<campo_1> IN (SELECT t2.<campo_1> FROM <nombre_tabla_2> t2);
Ejemplo: SELECT t3.first_name,t3.last_name FROM
(
select t.first_name,t.last_name from employee t where job_grade=5
union
select t2.fname,t2.lname from usuario t2
) t3 where t3.last_name like '%o%';
SELECT t3.first_name,t3.last_name FROM employee t3
where t3.job_country IN
(select t.country from country t where t.currency='Euro');
2.14Agrupaciones
Las agrupaciones permiten agrupar datos y saber cuantos datos hay de cada valor.
SELECT <campo_1>,<campo_2>, COUNT(*) FROM <nombre_tabla>
GROUP BY <campo_1>,<campo_2>;
Las agrupaciones se pueden filtrar utilizando la clausula HAVING.
Ejemplo:
SELECT job_grade, count(*) FROM employee
where emp_no>45
group by job_grade;
SELECT job_grade, sum(salary) FROM employee
where emp_no>45
group by job_grade
having sum(salary)<1000000;
2.15Operadores SQL
Ya hemos visto anteriormente qu tipos de datos se pueden utilizar en Oracle. Y siempre que haya datos,
habr operaciones entre ellos, as que ahora se describirn qu operaciones y con qu operadores se
realizan:
Los operadores se pueden dividir en TRES conjuntos:
Aritmticos: utilizan valores numricos
Lgicos (o booleanos o de comparacin): utilizan valores booleanos o lgicos.
Concatenacin: para unir cadenas de caracteres.
Operadores artmticos Retornan un valor numrico:
Smbo lo Significado Ejemplo
+ Operacin suma 1 + 2
- Operacin resta 1 - 2
* Operacin multiplicacin 1 * 2
/ Operador divisin 1 / 2
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 9 / 40
Operadores lgicos Retornan un valor lgico (verdadero o falso)
Smbolo Significado Ejemplo
= Igualdad 1 = 2
!= <> ^= Desigualdad 1 != 2 1 <> 2 1 ^= 2
> Mayor que 1 > 2
< Menor que 1 < 2
>= Mayor o igual que 1 >= 2
<= Menor o igual que 1 <= 2
IN (RS) Igual a algn elemento del result set. 1 IN (1,2)
[TRUE]
ANY SOME
a algn elemento del result set (derecha). Debe ser estar
precedido por =, !=, <, <=, >, >= Hace un OR lgico entre todos
los elementos.
10 >= ANY (1,2,3,10)
[TRUE]
ALL
a todos los elementos del result set (derecha), Debe ser estar
precedido por =, !=, <, <=, >, >= Hace un AND lgico entre todos
los elementos.
10 <= ALL (1,2,3,10)
[TRUE]
BEETWEEN x
AND y
Operando de la izquierda entre x e y. Equivalente a op >= x
AND op <= y
10 BETWEEN 1 AND
100
EXISTS Si la retorna al menos una fila
EXISTS( SELECT 1
FROM DUAL)
LIKE(*) Es como 'pepe' LIKE
'pe%'
IS NULL Si es nulo 1 IS NULL
IS NOT NULL Si es No nulo 1 IS NOT NULL
NOT cond. Niega la condicin posterios
NOT EXISTS NOT
BETWEEN NOT IN
NOT =
cond AND cond Hace un AND lgico entre dos condiciones 1=1 AND 2 IS NULL
Cond OR cond Hace un OR lgico entre dos condiciones 1=1 OR 2 IS NULL
Existen los siguientes comodines:
%: Conjunto de N caracteres (de 0 a )
_: Un solo carcter
Concatenacin

Oracle puede hacer una conversin automtica cuando se utilice este operador con valores numricos: 10
|| 20 = '1020'
Este proceso de denomina CASTING y se puede aplicar en todos aquellos casos en que se utiliza valores
numricos en puesto de valores alfanumricos o incluso viceversa.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 10 / 40
2.16La ausencia de valor: NULL
Todo valor (sea del tipo que sea) puede contener el valor NULL que no es ms que la ausencia de valor.
As que cualquier columna (NUMBER, VARCHAR2, DATE) puede contener el valor NULL, con lo que
se dice que la columna est a NULL. Una operacin retorna NULL si cualquiera de los operandos es
NULL. Para comprobar si una valor es NULL se utiliza el operador IS NULL o IS NOT NULL.
2.17Rendimiento
Un problema comn en las encuesta a base de datos es el rendimiento.
Las causas de problema de rendimiento son numerosas.
Las ms comunes son:
Instruccin sin o con mala clausula WHERE
Falta de indice sobre un campo utilizado como filtro
Mal diseo de la base de datos
Problema de hardware (falta de memoria, disco ocupado, cpu ocupado por otra aplicacin,...)
Mala configuracin del servidor (mal uso de la memoria, disco, cpu,...)
Mala programacin en el cliente. Falta de commit, conexin no cerrada, ...
Red sobrecargada o muy lenta
Cuando se enfrenta a un problema de rendimiento hay que probar primero de identificar la causa y los
sntomas. Servidor sobrecargado en CPU, disco, memoria? Un cliente afectado o todos? Cuando aparece
el problema?
Para ayudar a investigar estos problemas existen herramientas. Algunos vienen con la base de datos,
otros estn desarrollados aparte. Ver la documentacin de su base de datos para mas informacin.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 11 / 40
3 Creacin de objetos
3.1 Vistas
La vista es una sentencia de seleccin de datos preparada. Permite facilitar las consultas futuras,
especialmente cuando se juntan varias tablas. Permite tambin limitar el acceso a datos (seguridad).
3.1.1 Creacin
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW
[schema.]view
[(alias,...) ilie!c"s#$ai#(s)]
["%#!"&!lie!c"s#$ai#(s)]
['(LT)*e!view!cla%se]
A+ s%,-%e$) "*#i"s
"*#i"s.
WIT/ REA0 ONL1
WIT/ C/EC2 OPTION [CON+TRAINT c"s#$ai#]
3.1.2 Modificacin
ALTER VIEW [schema.]view CO(PILE3
ALTER VIEW [schema.]view A00 "%#!"&!lie!c"s#$ai#3
ALTER VIEW [schema.]view (O0IF1 CON+TRAINT c"s#$ai# 4REL1 | NOREL153
ALTER VIEW [schema.]view 0ROP CON+TRAINT c"s#$ai#3
ALTER VIEW [schema.]view 0ROP PRI(AR1 2E1
ALTER VIEW [schema.]view 6NI76E (c"l%m [,c"l%m,...])
When a constraint is in NOVALIDATE mode, Oracle does not enforce it and does not take it into account
for query rewrite. If you specify RELY Oracle will still not enforce the constraint but will take it into
account for query rewrite.
An alternative to ALTER VIEW COMPILE is the built-in pl/sql package DBMS_UTILITY
3.1.3 Eliminacin
0ROP VIEW [schema.]view [CA+CA0E CON+TRAINT+]
3.1.4 Ejercicios
1. Crea una vista sobre 2 tablas ligadas.
2. Usa la vista en una consulta.
3.2 Secuencias
Una secuencia es un contador que se incrementa automticamente y permite generar numero nicos.
3.2.1 Creacin
CREATE +E76ENCE [schema.]se-%ece!ame "*#i"(s)
O*#i"s.
INCRE(ENT 81 i#
+TART WIT/ i#
(A'VAL6E i# | NO(A'VAL6E
(INVAL6E i# | NO(INVAL6E
C1CLE | NOC1CLE
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 12 / 40
CAC/E i# | NOCAC/E
OR0ER | NOOR0ER
3.2.2 Modificacin
ALTER +E76ENCE [schema.]se-%ece!ame "*#i"(s)
O*#i"s.
INCRE(ENT 81 i#
(A'VAL6E i# | NO(A'VAL6E
(INVAL6E i# | NO(INVAL6E
C1CLE | NOC1CLE
CAC/E i# | NOCAC/E
OR0ER | NOOR0ER
3.2.3 Eliminacin
0ROP +E76ENCE [schema.]se-%ece!ame
3.2.4 Ejercicios
1. Crea una secuencia
2. Altera la secuencia para que el prximo numero generado sea 20
3.3 Vistas materializadas
Una vista materializada es un conjunto de datos de una o varias tablas (como una vista) pero del cual el
dato se guarda fsicamente. Aumenta el rendimiento de las consultas en comparacin de la vista normal,
pero disminuye el rendimiento de las consultas DML sobre las tablas ligadas a la vista materializada, ya
que tiene que mantener la vista materializada ademas de la tabla fuente.
3.3.1 Creacin
CREATE (ATERIALI9E0 VIEW [schema.]mview
(view!O*#i"s
[6+IN: IN0E' s#"$a;e!"*#i"s]
[4REFRE+/ [$e&$esh!"*#i"s] | NEVER REFRE+/]
[FOR 6P0ATE] [4ENA8LE|0I+A8LE5 76ER1 REWRITE]
A+ s%,,-%e$)3
s#"$a;e!"*#i"s.
PCTFREE i#
PCT6+E0 i#
INITRAN+ i#
(A'TRAN+ i#
+TORA:E s#"$a;e!cla%se
TA8LE+PACE #a,les*ace
$e&$esh!"*#i"s.
FA+T | CO(PLETE | FORCE
ON [0E(AN0 | CO((IT]
4NE'T | +TART WIT/5 <a#e
WIT/ 4PRI(AR1 2E1 | ROWI05
6+IN: 0EFA6LT 4(A+TER|LOCAL5 ROLL8AC2 +E:(ENT
6+IN: 4(A+TER|LOCAL5 ROLL8AC2 +E:(ENT $,!se;me#
i<=!"$;ai>e<!#,l!cla%se.
s#"$a;e!"*#i"(s)
4(APPIN: TA8LE | NO(APPIN:5
[PCTT/RE+/OL0 i#]
[CO(PRE++ i#|NOCO(PRE++]
[ [INCL60IN: c"l%m!ame] OVERFLOW [s#"$a;e!"*#i"(s)] ]
e=#e$al!#a,le!cla%se.
([T1PE access!<$ive$!#)*e]
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 13 / 40
0EFA6LT 0IRECTOR1 <i$ec#"$) [ACCE++ PARA(ETER+ 46+IN: CLO8 s%,-%e$) | ("*a-%e!&"$ma#!s*ec) 5]
LOCATION (<i$ec#"$).?l"ca#i"!s*eci&ie$? [,<i$ec#"$)@.?l"ca#i"!s*eci&ie$@?...)
) [REAECT LI(IT 4i#|6NLI(ITE05]
es#e<!s#"$a;e!cla%se.
NE+TE0 TA8LE 4es#e<!i#em | COL6(N!VAL6E5
[ [ELE(ENT] I+ OF T1PE (ONL1 #)*e) ]] | [ [NOT] +68+TIT6TA8LE AT ALL LEVEL+ ]]
+TORE A+ s#"$a;e!#a,le
[RET6RN A+ 4LOCATOR|VAL6E5 ]
3.3.2 Modificacin
ALTER (ATERIALI9E0 VIEW [schema.]mview "*#i"s i"#!"*#i"s
[6+IN: IN0E' i<e=!"*#i"s]
[REFRE+/ [$e&$esh!"*#i"s]]
[CO(PILE | CON+I0ER FRE+/ | 4ENA8LE|0I+A8LE5 76ER1 REWRITE]
ALTER (ATERIALI9E0 VIEW [schema.]mview "*#i"s i"#!"*#i"s
[6+IN: IN0E' i<e=!"*#i"s]
[RE86IL0]
[CO(PILE | CON+I0ER FRE+/ | 4ENA8LE|0I+A8LE5 76ER1 REWRITE]
ALTER (ATERIALI9E0 VIEW [schema.]mview "*#i"s i"#!"*#i"s
[6+IN: IN0E' i<e=!"*#i"s]
(O0IF1 +COPE FOR ($e&!c"l%mBa##$i,%#e) I+ [schema.]sc"*e!#a,le
[CO(PILE | CON+I0ER FRE+/ | 4ENA8LE|0I+A8LE5 76ER1 REWRITE]
O*#i"s.
CO(PRE++|NOCO(PRE++
CAC/E | NOCAC/E
PARALLEL i# | NOPARALLEL
ALLOCATE E'TENT [( [0ATAFILE &ileame]
[, +I9E i# 42 | (5]
[, IN+TANCE i#] )]
Pa$#i#i"i; cla%se
Ph)sical!"*#i"s
LO8 Cla%se
3.3.3 Eliminacin
0ROP (ATERIALI9E0 VIEW [schema.] ma#e$iali>e<!view
Snapshot is synonymous with Materialized View.
Para ms informacin sobre las vistas materializadas, ver en
http://www.softics.ru/docs/oracle10r2/server.101/b10759/statements_6002.htm
3.4 Sinnimos
Un sinnimo es un nombre de objeto que refiere a un objeto con otro nombre, o que se pueda encontrar
en otro esquema.
Un sinnimo public es disponible para todos los usuarios (segn sus privilegios).
3.4.1 Creacin
CREATE [OR REPLACE] [P68LIC] +1NON1( [schema.]s)")m
FOR [schema.]",Cec# [D<,liE]
?P68LIC? will c$ea#e a *%,lic s)")m, accessi,le #" all %se$s (wi#h #he a**$"*$ia#e *$ivile;es.)
6liEe Views, +)")ms <" "# ee< #" ,e $ec"m*ile< whe #he %<e$l)i; #a,le is $e<e&ie<.
The$e is a small *e$&"$mace hi# whe accessi; <a#a #h$"%;h a *%,lic s)")m.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 14 / 40
O$acle will $es"lve ",Cec# ames i #he &"ll"wi; "$<e$.
c%$$e# %se$
*$iva#e s)")m
*%,lic s)")m
A al#e$a#ive me#h"< #" access <a#a i a"#he$ schema is #" %se.
ALTER +E++ION se# c%$$e#!schema F O#he$!+chema
3.4.2 Eliminacin
0ROP [P68LIC] +1NON1( [schema.]s)")m [FORCE]
FORCE will <$"* #he s)")m eve #he$e a$e <e*e<e# #a,les "$ %se$G<e&ie< #)*es.
3.4.3 Ejercicios
1. Crea un sinnimo publico para un objeto. Luego conecta te como otro usuario y consulta el objeto
via el sinnimo pblico.
3.5 DB Link
Un DB Link permite llamar a objetos que se encuentran en otra base de datos (onlcuido en un servidor
remoto).
Hay que tener cuidado son el rendimiento ligado a consultas remotas, ya que puede impactar de manera
significativa en servidor remoto.
3.5.1 Creacin
CREATE [ +/ARE0 ] [ P68LIC ] 0ATA8A+E LIN2 <,liE
[ CONNECT TO
4 C6RRENT!6+ER
| %se$ I0ENTIFIE0 81 *assw"$<
[ <,liE!a%#he#ica#i" ]
5
| <,liE!a%#he#ica#i"
]
[ 6+IN: ?c"ec#!s#$i;? ] 3
<,liE!a%#he#ica#i".
A6T/ENTICATE0 81 %se$
I0ENTIFIE0 81 *assw"$<
Specify SHARED to use a single network connection to create a public database link that can be shared
among multiple users.
Specify PUBLIC to create a public database link available to all users. If you omit this clause, the
database link is private and is available only to you.
Dblink: Specify the complete or partial name of the database link. If you specify only the database name,
then Oracle Database implicitly appends the database domain of the local database.
Restriction on Creating Database Links
You cannot create a database link in another user's schema, and you cannot qualify dblink with the
name of a schema. Periods are permitted in names of database links, so Oracle Database interprets the
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 15 / 40
entire name, such as ralph.linktosales, as the name of a database link in your schema rather than as a
database link named linktosales in the schema ralph.)
The CONNECT TO clause lets you enable a connection to the remote database.
Specify CURRENT_USER to create a current user database link. The current user must be a global user
with a valid account on the remote database.
If the database link is used directly, that is, not from within a stored object, then the current user is the
same as the connected user.
When executing a stored object (such as a procedure, view, or trigger) that initiates a database link,
CURRENT_USER is the username that owns the stored object, and not the username that called the
object. For example, if the database link appears inside procedure scott.p (created by scott), and user
jane calls procedure scott.p, the current user is scott.
However, if the stored object is an invoker-rights function, procedure, or package, the invoker's
authorization ID is used to connect as a remote user. For example, if the privileged database link
appears inside procedure scott.p (an invoker-rights procedure created by scott), and user Jane calls
procedure scott.p, then CURRENT_USER is jane and the procedure executes with Jane's privileges.
user IDENTIFIED BY password : Specify the username and password used to connect to the remote
database using a fixed user database link. If you omit this clause, the database link uses the username
and password of each user who is connected to the database. This is called a connected user database
link.
dblink_authentication
Specify the username and password on the target instance. This clause authenticates the user to the
remote server and is required for security. The specified username and password must be a valid
username and password on the remote instance. The username and password are used only for
authentication. No other operations are performed on behalf of this user.
You must specify this clause when using the SHARED clause.
USING 'connect string': Specify the service name of a remote database. If you specify only the database
name, then Oracle Database implicitly appends the database domain to the connect string to create a
complete service name. Therefore, if the database domain of the remote database is different from that of
the current database, then you must specify the complete service name.
3.5.1.1 Examples
The examples that follow assume two databases, one with the database name local and the other with
the database name remote. The examples use the Oracle Database domain. Your database domain will
be different.
Defining a Public Database Link: Example
The following statement defines a shared public database link named remote that refers to the database
specified by the service name remote:
CREATE P68LIC 0ATA8A+E LIN2 $em"#e
6+IN: ?$em"#e?3
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 16 / 40
This database link allows user hr on the local database to update a table on the remote database
(assuming hr has appropriate privileges):
6P0ATE em*l")eesD$em"#e
+ET sala$)Fsala$)HI.I
W/ERE las#!ame F ?8ae$?3
Defining a Fixed-User Database Link: Example
In the following statement, user hr on the remote database defines a fixed-user database link named
local to the hr schema on the local database:
CREATE 0ATA8A+E LIN2 l"cal
CONNECT TO h$ I0ENTIFIE0 81 h$
6+IN: ?l"cal?3
Once this database link is created, hr can query tables in the schema hr on the local database in this
manner: +ELECT H FRO( em*l")eesDl"cal3
User hr can also use DML statements to modify data on the local database:
IN+ERT INTO em*l")eesDl"cal
(em*l")ee!i<, las#!ame, email, hi$e!<a#e, C",!i<)
VAL6E+ (JJJ, ?Cla%s?, ?scla%sD"$acle.c"m?, +1+0ATE, ?+/!CLER2?)3
6P0ATE C",sDl"cal +ET mi!sala$) F KLLL
W/ERE C",!i< F ?+/!CLER2?3
0ELETE FRO( em*l")eesDl"cal
W/ERE em*l")ee!i< F JJJ3
Using this fixed database link, user hr on the remote database can also access tables owned by other
users on the same database. This statement assumes that user hr has SELECT privileges on the
oe.customers table. The statement connects to the user hr on the local database and then queries the
oe.customers table:
+ELECT H FRO( "e.c%s#"me$sDl"cal3
Defining a CURRENT_USER Database Link: Example
The following statement defines a current-user database link to the remote database, using the entire
service name as the link name:
CREATE 0ATA8A+E LIN2 $em"#e.%s."$acle.c"m
CONNECT TO C6RRENT!6+ER
6+IN: ?$em"#e?3
The user who issues this statement must be a global user registered with the LDAP directory service.
You can create a synonym to hide the fact that a particular table is on the remote database. The
following statement causes all future references to emp_table to access the employees table owned by hr
on the remote database:
CREATE +1NON1( em*!#a,le
FOR "e.em*l")eesD$em"#e.%s."$acle.c"m3
3.5.2 Eliminacin
0ROP [ P68LIC ] 0ATA8A+E LIN2 <,liE
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 17 / 40
4 PL/SQL bsico
4.1 Introduccin
El PL/SQL es un lenguaje de programacin de Oracle, que permite que el cdigo sea ejecutado en el
servidor Oracle mismo. Para cdigos que necesitan muchas manipulaciones de datos, el PL/SQL es muy
eficiente ya que se ejecuta localmente, con acceso directo a los datos.
El PL/SQL no es CASE-SENSITIVE, es decir, no diferencia maysculas de minsculas como otros
lenguajes de programacin como C o Java. Sin embargo debemos recordar que ORACLE es CASE-
SENSITIVE en la bsquedas de texto (hasta la versin 10.2R2 que lo permite mediante nuevas valores
para variables NLS_SORT y NLS_COMP).
Las instructiones PL/SQL terminan con un punto-coma (;), excepto algunas instrucciones con 8E:IN,
0ECLARE, etc..
Los comentarios de una lnea se inician con y los de varias lneas inician con /* y terminan con */
Este captulo esta en gran parte basado sobre el curso de PL/SQL disponible en
http://www.devjoker.com/contenidos/Tutorial-PLSQL/66/SQL-Dinamico.aspx
4.2 Bloque annimo PL/SQL
Un bloque PL/SQL es un conjunto de instrucciones PL/SQL relacionadas entre ellas.
Un simple bloque PL/SQL inicia con 8E:IN y termina con EN03
ECem*l".
+ET +ERVERO6TP6T ON3
8E:IN
<,ms!"%#*%#.*%#!lie(?/"la?)3
EN03
B
4.3 Identificadores
Un identificador es el nombre de un objeto PL/SQL, como por ejemplo una constante, variable, excepcin,
paquete, funcin, procedimiento, tabla, cursor,...
Un identificador puede tener hasta 30 caracteres, debe iniciar con una letra.
4.4 Variables
Las variables se declaran antes de la palabra BEGIN, y se preceden de la palabra DECLARE.
La sintaxis es : nombre_de_variable [CONSTANT] tipo [NOT NULL] [DEFAULT valor_por_defecto];
4.4.1 Tipos de variables
Los tipos de variables que se pueden usar en PL/SQL son bsicamente los mismos que se usan para
definir campos en una tabla, plus algunos especficos del PL/SQL.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 18 / 40
PLS_INTEGER: tipo numrico del PL/SQL, equivalente a NUMBER, pero ms eficiente si se necesita
hacer clculos aritmticos.
%TYPE: refiere de manera dinmica a otro objeto.
4.4.2 Variables locales
Por defecto, una variable solo est disponible en el bloque PL/SQL donde se encuentra, y los sub bloques
dentro de este bloque.
Ejemplo:
0ECLARE
v!c#!em* %m,e$3
8E:IN
selec# c"%#(H) i#" v!c#!em*
&$"m sc"##.em*
whe$e salMILLL3
8E:IN
<,ms!"%#*%#.*%#!lie (?Em*lea<"s c" sala$i"MILLL . ?||v!c#!em*)3
EN03
EN03
B
4.4.3 Variables globales
Las variables globales son variables que se pueden llamar desde otro cdigo. Solo estn disponibles en
paquetes.
4.5 Control de flujo
Se usa el IF..ELSIF..ELSE para controlar el flujo en PL/SQL.
IF (expresion) THEN
-- Instrucciones
ELSIF (expresion) THEN
-- Instrucciones
ELSE
-- Instrucciones
END IF;
Ejemplo:
0ECLARE
v!c#!em* %m,e$3
v!#"#!em* %m,e$3
8E:IN
selec# c"%#(H) i#" v!#"#!em*
&$"m sc"##.em*3
<,ms!"%#*%#.*%#!lie (?/a) % #"#al <e ?||v!#"#!em*||? em*lea<"s.?)3
selec# c"%#(H) i#" v!c#!em*
&$"m sc"##.em*
whe$e salMILLL3
<,ms!"%#*%#.*%#!lie (?/a) ?||v!c#!em*||? em*lea<"s -%e ;aa mas <e ILLL N.?)3
<,ms!"%#*%#.*%#!lie (?Res%l#a<" <e la aalisis.?)3
IF (v!#"#!em*Fv!c#!em*) #he
<,ms!"%#*%#.*%#!lie (?L"s em*lea<"s ;aa #"<"s mas <e ILLL N?)3
EL+IF (v!#"#!em*Ov!c#!em*H@) #he
<,ms!"%#*%#.*%#!lie (?(as <e la mi#a< em*lea<"s ;aa #"<"s mas <e ILLL N?)3
EL+E
<,ms!"%#*%#.*%#!lie (?(e"s <e la mi#a< em*lea<"s ;aa #"<"s mas <e ILLL N?)3
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 19 / 40
EN0 IF3
EN03
B
4.6 Bucles
Una bucle permite repetir una accin un sin nmero de veces. Hay que tener cuidado en no crear bucles
infinitas.
En PL/SQL tenemos a nuestra disposicin los siguientes iteradores o bucles:
* LOOP
* WHILE
* FOR
4.6.1 LOOP
El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instruccin
EXIT. Su sintaxis es la siguiente
LOOP
-- Instrucciones
IF (expresion) THEN
-- Instrucciones
EXIT;
END IF;
END LOOP;
Ejemplo:
0ECLARE
v!c# PL+!INTE:ER 0EFA6LT L3
8E:IN
LOOP
v!c#.Fv!c#PI3
<,ms!"%#*%#.*%#!lie (?C"#a<"$ F ?||v!c#)3
IF (v!c#MFIL) #he
<,ms!"%#*%#.*%#!lie (?1a me$i#"Q?)3
e=i#3
EN0 IF3
EN0 LOOP3
EN03
4.6.2 WHILE
El bucle WHILE, se repite mientras que se cumpla expresion.
WHILE (expresion) LOOP
-- Instrucciones
END LOOP;
Ejemplo:
0ECLARE
v!c# PL+!INTE:ER 0EFA6LT L3
8E:IN
v!c#.FIL3
W/ILE (v!c#ML) LOOP
<,ms!"%#*%#.*%#!lie (?C"#a<"$ F ?||v!c#)3
v!c#.Fv!c#GI3
EN0 LOOP3
EN03
4.6.3 FOR
El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 20 / 40
FOR contador IN [REVERSE] inicio..final LOOP
-- Instrucciones
END LOOP;
En el caso de especificar REVERSE el bucle se recorre en sentido inverso.
Ejemplo:
0ECLARE
v!c# PL+!INTE:ER 0EFA6LT L3
8E:IN
FOR v!c# IN REVER+E I..IL LOOP
<,ms!"%#*%#.*%#!lie (?C"#a<"$ F ?||v!c#)3
EN0 LOOP3
EN03
4.7 Cursores
PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros
devuelto por una instruccin SQL. Tcnicamente los cursores son fragmentos de memoria que reservados
para procesar los resultados de una consulta SELECT.
Podemos distinguir dos tipos de cursores:
* Cursores implicitos. Este tipo de cursores se utiliza para operaciones SELECT INTO. Se usan
cuando la consulta devuelve un nico registro.
* Cursores explicitos. Son los cursores que son declarados y controlados por el programador. Se
utilizan cuando la consulta devuelve un conjunto de registros. Ocasionalmente tambin se utilizan en
consultas que devuelven un nico registro por razones de eficiencia. Son ms rpidos.
Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos
convenios que cualquier otra variable. Los cursores implicitos no necesitan declaracin.
Para procesar instrucciones SELECT que devuelvan ms de una fila, son necesarios cursores explicitos
combinados con un estructura de bloque.
Un cursor admite el uso de parmetros. Los parmetros deben declararse junto con el cursor.
El siguiente diagrama representa como se procesa una instruccin SQL a travs de un cursor.
Ejemplo de cursor explicito:
0ECLARE
C6R+OR c!em* I+ BHC6R+ORHB
selec# eame, sal &$"m sc"##.em*3
8E:IN
FOR &ila IN c!em* LOOP BH" es ecesa$i" <e&ii$ la va$ia,le &ila, se$R <e #i*" SROW HB
<,ms!"%#*%#.*%#!lie(&ila.eame||? #iee % sala$i" <e ?||&ila.sal)3
EN0 LOOP3
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 21 / 40
EN03
Ejemplo de cursor implicito:
0ECLARE
v!sal N6(8ER3
8E:IN
+ELECT sal INTO v!sal FRO( sc"##.em* W/ERE em*"FTKUJ3
<,ms!"%#*%#.*%#!lie(?El em*lea<" %me$" TKUJ #iee % sala$i" <e ?||v!sal||? N?)3
e<3
4.8 Excepciones
En PL/SQL una advertencia o condicin de error es llamada una excepcin.
Los bloques de excepciones permiten atrapar errores de ejecucin y darles eventualmente un
tratamiento para evitar que se pare el programa de manera anormal.
Las excepciones se controlan dentro de su propio bloque. La estructura de bloque de una excepcin se
muestra a continuacin.
DECLARE
-- Declaraciones
BEGIN
-- Ejecucion
EXCEPTION
-- Excepcion
END;
Cuando ocurre un error, se ejecuta la porcin del programa marcada por el bloque EXCEPTION,
transfirindose el control a ese bloque de sentencias.
El siguiente ejemplo muestra un bloque de excepciones que captura las excepciones NO_DATA_FOUND
y ZERO_DIVIDE. Cualquier otra excepcion ser capturada en el bloque WHEN OTHERS THEN.
DECLARE
-- Declaraciones
BEGIN
-- Ejecucion
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Se ejecuta cuando ocurre una excepcion de tipo NO_DATA_FOUND
WHEN ZERO_DIVIDE THEN
-- Se ejecuta cuando ocurre una excepcion de tipo ZERO_DIVIDE
WHEN OTHERS THEN
-- Se ejecuta cuando ocurre una excepcion de un tipo no tratado
-- en los bloques anteriores
END;
Como ya hemos dicho cuando ocurre un error, se ejecuta el bloque EXCEPTION, transfirindose el
control a las sentencias del bloque. Una vez finalizada la ejecucin del bloque de EXCEPTION no se
continua ejecutando el bloque anterior.
Si existe un bloque de excepcin apropiado para el tipo de excepcin se ejecuta dicho bloque. Si no existe
un bloque de control de excepciones adecuado al tipo de excepcin se ejecutar el bloque de excepcin
WHEN OTHERS THEN (si existe!). WHEN OTHERS debe ser el ltimo manejador de excepciones.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 22 / 40
Las excepciones pueden ser definidas en forma interna o explcitamente por el usuario. Ejemplos de
excepciones definidas en forma interna son la divisin por cero y la falta de memoria en tiempo de
ejecucin. Estas mismas condiciones excepcionales tienen sus propio tipos y pueden ser referenciadas por
ellos: ZERO_DIVIDE y STORAGE_ERROR.
Las excepciones definidas por el usuario deben ser alcanzadas explcitamente utilizando la sentencia
RAISE.
Con las excepciones se pueden manejar los errores cmodamente sin necesidad de mantener mltiples
chequeos por cada sentencia escrita. Tambin provee claridad en el cdigo ya que permite mantener las
rutinas correspondientes al tratamiento de los errores de forma separada de la lgica del negocio.
4.8.1 Excepciones predefinidas
PL/SQL proporciona un gran nmero de excepciones predefinidas que permiten controlar las condiciones
de error ms habituales.
Las excepciones predefinidas no necesitan ser declaradas. Simplemente se utilizan cuando estas son
lanzadas por algn error determinado.
4.8.1.1 Excepciones asociadas a los cursores implcitos.
Los cursores implicitos slo pueden devolver una fila, por lo que pueden producirse determinadas
excepciones. Las ms comunes que se pueden encontrar son no_data_found y too_many_rows. La
siguiente tabla explica brevemente estas excepciones.
NO_DATA_FOUND Se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna
fila satisface sus condiciones. Es decir, cuando "no hay datos"
TOO_MANY_ROWS Dado que cada cursor implicito slo es capaz de recuperar una fila , esta excepcion
detecta la existencia de ms de una fila.
Ejemplo:
0ECLARE
v!sal N6(8ER3
8E:IN
8E:IN
+ELECT sal INTO v!sal FRO( sc"##.em* W/ERE em*"FI3
<,ms!"%#*%#.*%#!lie(?El em*lea<" %me$" I #iee % sala$i" <e ?||v!sal||? N?)3
E'CEPTION
W/EN NO!0ATA!FO6N0 T/EN
<,ms!"%#*%#.*%#!lie(?El em*lea<" %me$" I " e=is#eQ?)3
EN03
8E:IN
+ELECT em*" INTO v!sal FRO( sc"##.em* W/ERE salMILLL3
<,ms!"%#*%#.*%#!lie(?El em*lea<" -%e #iee % sala$i"MILLL N es el em*lea<" %me$"?||v!sal)3
E'CEPTION
W/EN #""!ma)!$"ws T/EN
<,ms!"%#*%#.*%#!lie(?/A1 (A+ 0E 6N E(PLEA0O 76E :ANA (A+ 0E ILLL NQ?)3
EN03
EN03
4.8.1.2 Lista de excepciones predefinidas
ACCESS_INTO_NULL El programa intent asignar valores a los atributos de un objeto no
inicializado -6530
COLLECTION_IS_NULL El programa intent asignar valores a una tabla anidada an no
inicializada -6531
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 23 / 40
CURSOR_ALREADY_OPEN El programa intent abrir un cursor que ya se encontraba abierto.
Recuerde que un cursor de ciclo FOR automticamente lo abre y ello no se debe especificar con la
sentencia OPEN -6511
DUP_VAL_ON_INDEX El programa intent almacenar valores duplicados en una columna que se
mantiene con restriccin de integridad de un ndice nico (unique index) -1
INVALID_CURSOR El programa intent efectuar una operacin no vlida sobre un cursor -
1001
INVALID_NUMBER En una sentencia SQL, la conversin de una cadena de caracteres hacia un
nmero falla cuando esa cadena no representa un nmero vlido -1722
LOGIN_DENIED El programa intent conectarse a Oracle con un nombre de usuario o password
invlido -1017
NO_DATA_FOUND Una sentencia SELECT INTO no devolvi valores o el programa referenci un
elemento no inicializado en una tabla indexada 100
NOT_LOGGED_ON El programa efectu una llamada a Oracle sin estar conectado -1012
PROGRAM_ERROR PL/SQL tiene un problema interno -6501
ROWTYPE_MISMATCH Los elementos de una asignacin (el valor a asignar y la variable que lo
contendr) tienen tipos incompatibles. Tambin se presenta este error cuando un parmetro pasado a un
subprograma no es del tipo esperado -6504
SELF_IS_NULL El parmetro SELF (el primero que es pasado a un mtodo MEMBER) es nulo
-30625
STORAGE_ERROR La memoria se termin o est corrupta -6500
SUBSCRIPT_BEYOND_COUNT El programa est tratando de referenciar un elemento de un
arreglo indexado que se encuentra en una posicin ms grande que el nmero real de elementos de la
coleccin -6533
SUBSCRIPT_OUTSIDE_LIMIT El programa est referenciando un elemento de un arreglo
utilizando un nmero fuera del rango permitido (por ejemplo, el elemento -1) -6532
SYS_INVALID_ROWID La conversin de una cadena de caracteres hacia un tipo rowid fall
porque la cadena no representa un nmero -1410
TIMEOUT_ON_RESOURCE Se excedi el tiempo mximo de espera por un recurso en Oracle -51
TOO_MANY_ROWS Una sentencia SELECT INTO devuelve ms de una fila -1422
VALUE_ERROR Ocurri un error aritmtico, de conversin o truncamiento. Por ejemplo, sucede
cuando se intenta calzar un valor muy grande dentro de una variable ms pequea -6502
ZERO_DIVIDE El programa intent efectuar una divisin por cero -1476
4.8.2 Excepciones definidas por el usuario
PL/SQL permite al usuario definir sus propias excepciones, las que debern ser declaradas y lanzadas
explcitamente utilizando la sentencia RAISE.
Las excepciones deben ser declaradas en el segmento DECLARE de un bloque, subprograma o paquete.
Se declara una excepcin como cualquier otra variable, asignandole el tipo EXCEPTION. Las mismas
reglas de alcance aplican tanto sobre variables como sobre las excepciones.
DECLARE
-- Declaraciones
MyExcepcion EXCEPTION;
BEGIN
-- Ejecucion
EXCEPTION
-- Excepcion
END;
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 24 / 40
4.8.2.1 Reglas de Alcance
Una excepcion es vlida dentro de su ambito de alcance, es decir el bloque o programa donde ha sido
declarada. Las excepciones predefinidas son siempre vlidas.
Como las variables, una excepcin declarada en un bloque es local a ese bloque y global a todos los sub-
bloques que comprende.
4.8.2.2 La sentencia RAISE
La sentencia RAISE permite lanzar una excepcin en forma explcita. Es posible utilizar esta sentencia
en cualquier lugar que se encuentre dentro del alcance de la excepcin.
DECLARE
-- Declaramos una excepcion identificada por VALOR_NEGATIVO
VALOR_NEGATIVO EXCEPTION;
valor NUMBER;
BEGIN
-- Ejecucion
valor := -1;
IF valor < 0 THEN
RAISE VALOR_NEGATIVO;
END IF;
EXCEPTION
-- Excepcion
WHEN VALOR_NEGATIVO THEN
dbms_output.put_line('El valor no puede ser negativo');
END;
Con la sentencia RAISE podemos lanzar una excepcin definida por el usuario o predefinida, siendo el
comportamiento habitual lanzar excepciones definidas por el usuario.
Recordar la existencia de la excepcin OTHERS, que simboliza cualquier condicin de excepcin que no
ha sido declarada. Se utiliza comnmente para controlar cualquier tipo de error que no ha sido previsto.
En ese caso, es comn observar la sentencia ROLLBACK en el grupo de sentencias de la excepcin o
alguna de las funciones SQLCODE SQLERRM, que se detallan en el prximo punto.
4.8.2.3 Uso de SQLCODE y SQLERRM
Al manejar una excepcin es posible usar las funciones predefinidas SQLCode y SQLERRM para aclarar
al usuario la situacin de error acontecida.
SQLcode devuelve el nmero del error de Oracle y un 0 (cero) en caso de exito al ejecutarse una
sentencia SQL.
Por otra parte, SQLERRM devuelve el correspondiente mensaje de error.
Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones, para aclarar el significado
de la excepcin OTHERS.
Estas funciones no pueden ser utilizadas directamente en una sentencia SQL, pero s se puede asignar
su valor a alguna variable de programa y luego usar esta ltima en alguna sentencia.
0ECLARE
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 25 / 40
e$$!%m N6(8ER3
e$$!ms; VARC/AR@(@VV)3
$es%l# N6(8ER3
8E:IN
+ELECT IBL INTO $es%l#
FRO( 06AL3
E'CEPTION
W/EN OT/ER+ T/EN
e$$!%m .F +7LCO0E3
e$$!ms; .F +7LERR(3
08(+!O6TP6T.*%#!lie(?E$$"$.?||TO!C/AR(e$$!%m))3
08(+!O6TP6T.*%#!lie(e$$!ms;)3
EN03
Tambin es posible entregarle a la funcin SQLERRM un nmero negativo que represente un error de
Oracle y sta devolver el mensaje asociado.
0ECLARE
ms; VARC/AR@(@VV)3
8E:IN
ms; .F +7LERR((GIWLK)3
08(+!O6TP6T.*%#!lie((+:)3
EN03
4.8.3 RAISE_APPLICATION_ERROR
En ocasiones queremos enviar un mensaje de error personalizado al producirse una excepcin PL/SQL.
Para ello es necesario utilizar la instruccion RAISE_APPLICATION_ERROR;
La sintaxis general es la siguiente:
RAISE_APPLICATION_ERROR(<error_num>,<mensaje>);
Siendo:
* error_num es un entero negativo comprendido entre -20001 y -20999
* mensaje la descripcion del error
Ejemplo:
0ECLARE
v!<iv N6(8ER3
8E:IN
+ELECT IBL INTO v!<iv FRO( 06AL3
E'CEPTION
W/EN OT/ER+ T/EN
RAI+E!APPLICATION!ERROR(G@LLLI,?N" se *%e<e <ivi<i$ *"$ ce$"?)3
EN03
4.9 Procedimientos, funciones, paquetes, disparadores
Son objetos PL/SQL residentes en el servidor PL/SQL.
4.9.1 Funciones
Una funcin es un cdigo compilados en el servidor, que se ejecutan en local, y que pueden aceptar
parmetros de entrada y tiene un solo parmetro de salido. Una funcin SIEMPRE debe regresar un
valor.
Una funcin se puede usar en otro cdigo PL/SQL, o en SQL ya sea en un SELECT, una clausula
WHERE, CONNECT BY, START WITH, ORDER BY, GROUP BY, como VALUES en un INSERT, o
como SET en un UPDATE.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 26 / 40
4.9.1.1 Funciones predefinidas
PL/SQL tiene un gran nmero de funciones incorporadas, sumamente tiles. A continuacin vamos a
ver algunas de las ms utilizadas.
SYSDATE
Devuelve la fecha del sistema:
SELECT SYSDATE FROM DUAL;
NVL
Devuelve el valor recibido como parmetro en el caso de que expresin sea NULL,o expresin en caso
contrario.
NVL(<expresion>, <valor>)
El siguiente ejemplo devuelve 0 si el precio es nulo, y el precio cuando est informado:
SELECT CO_PRODUCTO, NVL(PRECIO, 0) FROM PRECIOS;
DECODE
Decode proporciona la funcionalidad de una sentencia de control de flujo if-elseif-else.
DECODE(<expr>, <cond1>, <val1>[, ..., <condN>, <valN>], <default>)
Esta funcin evala una expresin "<expr>", si se cumple la primera condicin "<cond1>" devuelve el
valor1 "<val1>", en caso contrario evala la siguiente condicin y as hasta que una de las condiciones se
cumpla. Si no se cumple ninguna condicin se devuelve el valor por defecto.
Es muy comn escribir la funcin DECODE identada como si se tratase de un bloque IF.
SELECT DECODE (co_pais, /* Expresion a evaluar */
'ESP', 'ESPAA', /* Si co_pais = 'ESP' ==> 'ESPAA' */
'MEX', 'MEXICO', /* Si co_pais = 'MEX' ==> 'MEXICO' */
'PAIS '||co_pais)/* ELSE ==> concatena */
FROM PAISES;
TO_DATE
Convierte una expresin al tipo fecha. El parmetro opcional formato indica el formato de entrada de
la expresin no el de salida.
TO_DATE(<expresion>, [<formato>])
En este ejemplo convertimos la expresion '01/12/2006' de tipo CHAR a una fecha (tipo DATE). Con el
parmetro formato le indicamos que la fecha est escrita como da-mes-ao para que devuelve el uno de
diciembre y no el doce de enero.
SELECT TO_DATE('01/12/2006',
'DD/MM/YYYY')
FROM DUAL;
Este otro ejemplo muestra la conversin con formato de da y hora.
SELECT TO_DATE('31/12/2006 23:59:59',
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 27 / 40
'DD/MM/YYYY HH24:MI:SS')
FROM DUAL;
TO_CHAR
Convierte una expresin al tipo CHAR. El parmetro opcional formato indica el formato de salida de
la expresin.
TO_CHAR(<expresion>, [<formato>])
SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYYY')
FROM DUAL;
TO_NUMBER
Convierte una expresion alfanumrica en numerica. Opcionalmente podemos especificar el formato de
salida.
TO_NUMBER(<expresion>, [<formato>])
SELECT TO_NUMBER ('10')
FROM DUAL;
TRUNC
Trunca una fecha o nmero.
Si el parmetro recibido es una fecha elimina las horas, minutos y segundos de la misma.
SELECT TRUNC(SYSDATE)FROM DUAL;
Si el parmetro es un nmero devuelve la parte entera.
SELECT TRUNC(9.99)FROM DUAL;
LENGTH
Devuelve la longitud de un tipo CHAR.
SELECT LENGTH('HOLA MUNDO')FROM DUAL;
INSTR
Busca una cadena de caracteres dentro de otra. Devuelve la posicion de la ocurrencia de la cadena
buscada.
Su sintaxis es la siguiente: INSTR(<char>, <search_string>, <startpos>, <occurrence> )
SELECT INSTR('AQUI ES DONDE SE BUSCA', 'BUSCA', 1, 1 )
FROM DUAL;
REPLACE
Reemplaza un texto por otro en un expresion de busqueda.
REPLACE(<expresion>, <busqueda>, <reemplazo>)
El siguiente ejemplo reemplaza la palabra 'HOLA' por 'VAYA' en la cadena 'HOLA MUNDO'.
SELECT REPLACE ('HOLA MUNDO','HOLA', 'VAYA')-- devuelve VAYA MUNDO
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 28 / 40
FROM DUAL;
SUBSTR
Obtiene una parte de una expresion, desde una posicin de inicio hasta una determinada longitud.
SUBSTR(<expresion>, <posicion_ini>, <longitud> )
SELECT SUBSTR('HOLA MUNDO', 6, 5) -- Devuelve MUNDO
FROM DUAL;
UPPER
Convierte una expresion alfanumerica a maysculas.
SELECT UPPER('hola mundo') -- Devuelve HOLA MUNDO
FROM DUAL;
LOWER
Convierte una expresion alfanumerica a minsculas.
SELECT LOWER('HOLA MUNDO') -- Devuelve hola mundo
FROM DUAL;
ROWIDTOCHAR
Convierte un ROWID a tipo caracter.
SELECT ROWIDTOCHAR(ROWID)
FROM DUAL;
RPAD
Aade N veces una determinada cadena de caracteres a la derecha una expresin. Muy util para
generar ficheros de texto de ancho fijo.
RPAD(<expresion>, <longitud>, <pad_string> )
El siguiente ejemplo aade puntos a la expresion 'Hola mundo' hasta alcanzar una longitud de 50
caracteres.
SELECT RPAD('Hola Mundo', 50, '.')
FROM DUAL;
LPAD
Aade N veces una determinada cadena de caracteres a la izquierda de una expresin. Muy util para
generar ficheros de texto de ancho fijo.
LPAD(<expresion>, <longitud>, <pad_string> )
El siguiente ejemplo aade puntos a la expresion 'Hola mundo' hasta alcanzar una longitud de 50
caracteres.
SELECT LPAD('Hola Mundo', 50, '.')
FROM DUAL;
RTRIM
Elimina los espacios en blanco a la derecha de una expresion
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 29 / 40
SELECT RTRIM ('Hola Mundo ')
FROM DUAL;
LTRIM
Elimina los espacios en blanco a la izquierda de una expresion
SELECT LTRIM (' Hola Mundo')
FROM DUAL;
TRIM
Elimina los espacios en blanco a la izquierda y derecha de una expresion
SELECT TRIM (' Hola Mundo ')
FROM DUAL;
MOD
Devuelve el resto de la divisin entera entre dos nmeros.
MOD(<dividendo>, <divisor> )
SELECT MOD(20,15) -- Devuelve el modulo de dividir 20/15
FROM DUAL
4.9.1.2 Funciones definidas por el usuario
La sintaxis para construir funciones es la siguiente:
CREATE [OR REPLACE]
FUNCTION <fn_name>[(<param1> IN <type>, <param2> IN <type>, ...)]
RETURN <return_type>
IS
result <return_type>;
BEGIN
return(result);
[EXCEPTION]
-- Sentencias control de excepcion
END [<fn_name>];
El uso de OR REPLACE permite sobreescribir una funcin existente. Si se omite, y la funcin existe, se
producir, un error.
La sintaxis de los parmetros es la misma que en los procedimientos almacenado, exceptuando que
solo pueden ser de entrada.
Ejemplo:
c$ea#e #a,le em* as selec# H &$"m sc"##.em*3
CREATE OR REPLACE
F6NCTION &!O,#ee$!+ala$i"(*!em*" N6(8ER)
RET6RN N6(8ER
I+
$es%l# N6(8ER3
8E:IN
+ELECT sal INTO $es%l#
FRO( em*
W/ERE em*" F *!em*"3
$e#%$($es%l#)3
E'CEPTION
W/EN NO!0ATA!FO6N0 T/EN
$e#%$ L3
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 30 / 40
EN0 3
Si el sistema nos indica que el la funcin se ha creado con errores de compilacin podemos ver estos
errores de compilacion con la orden SHOW ERRORS en SQL *Plus.
Las funciones pueden utilizarse en sentencias SQL de manipulacin de datos (SELECT, UPDATE,
INSERT y DELETE):
+ELECT em*", eame,
&!O,#ee$!+ala$i"( em*")
FRO( sc"##.em*3
4.9.2 Procedimientos
Los procedimientos son cdigos compilados en el servidor, que se ejecutan en el servidor, y que pueden
aceptar parmetros de entrada y/o de salida. Un procedimiento se puede usar en un select, pero no en un
where clause.
Un procedimiento tiene un nombre, un conjunto de parmetros (opcional) y un bloque de cdigo.
La sintaxis de un procedimiento almacenado es la siguiente:
CREATE [OR REPLACE]
PROCEDURE <procedure_name> [(<param1> [IN|OUT|IN OUT] <type>,
<param2> [IN|OUT|IN OUT] <type>, ...)]
IS
-- Declaracion de variables locales
BEGIN
-- Sentencias
[EXCEPTION]
-- Sentencias control de excepcion
END [<procedure_name>];
El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el
procedimiento existe, se producir, un error.
La sintaxis es muy parecida a la de un bloque annimo, salvo porque se reemplaza la seccin
DECLARE por la secuencia PROCEDURE ... IS en la especificacin del procedimiento.
Debemos especificar el tipo de datos de cada parmetro. Al especificar el tipo de dato del parmetro no
debemos especificar la longitud del tipo.
Los parmetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El valor
por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada.
c$ea#e "$ $e*lace
PROCE06RE Ac#%ali>a!+ala$i"(*!em*" N6(8ER,
*!ew!sala$i" N6(8ER)
I+
GG 0ecla$aci" <e va$ia,les l"cales
8E:IN
GG +e#ecias
6P0ATE em*
+ET sal F *!ew!sala$i",
hi$e<a#e F +1+0ATE
W/ERE em*" F *!em*"3
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 31 / 40
EN0 Ac#%ali>a!+ala$i"3
Tambin podemos asignar un valor por defecto a los parmetros, utilizando la clausula DEFAULT o
el operador de asigancin (:=) .
c$ea#e "$ $e*lace
PROCE06RE Ac#%ali>a!+ala$i"(*!em*" N6(8ER,
*!ew!sala$i" N6(8ER 0EFA6LT VLL)
I+
...
EN0 Ac#%ali>a!+ala$i"3
Una vez creado y compilado el procedimiento almacenado podemos ejecutarlo. Si el sistema nos indica
que el procedimiento se ha creado con errores de compilacin podemos ver estos errores de compilacin
con la orden SHOW ERRORS en SQL *Plus.
Existen dos formas de pasar argumentos a un procedimiento almacenado a la hora de ejecutarlo (en
realidad es vlido para cualquier subprograma). Estas son:
* Notacin posicional: Se pasan los valores de los parmetros en el mismo orden en que el procedure
los define.
8E:IN
Ac#%ali>a!+ala$i"(TKUJ,@VLL)3
CO((IT3
EN03
* Notacin nominal:Se pasan los valores en cualquier orden nombrando explicitamente el parmetro.
8E:IN
Ac#%ali>a!+ala$i"(*!em*" FM TKUJ,*!ew!sala$i" FM @VLL)3
CO((IT3
EN03
4.9.3 Paquetes
Un paquete es un conjunto de funciones y/o procedimiento. Permite facilitar la administracin de los
cdigos (agrupaciones), y la seguridad (a nivel de paquete en vez de por funcin/procedimiento). En el
paquete se pueden definir variable de alcance de todo el paquete (global variables).
Lo primero que debemos tener en cuenta es que los paquetes estn formados por dos partes: la
especificacin y el cuerpo. La especificacin del un paquete y su cuerpo se crean por separado.
La especificacin es la interfaz con las aplicaciones. En ella es posible declarar los tipos, variables,
constantes, excepciones, cursores y subprogramas disponibles para su uso posterior desde fuera del
paquete.
En la especificacin del paquete slo se declaran los objetos (procedures, funciones, variables ...), no se
implementa el cdigo. Los objetos declarados en la especificacin del paquete son accesibles desde fuera
del paquete por otro script de PL/SQL o programa.
Para crear la especificacin de un paquete la sintaxis general es la siguiente:
CREATE [OR REPLACE] PACKAGE <pkgName>
IS
-- Declaraciones de tipos y registros pblicas
{[TYPE <TypeName> IS <Datatype>;]}
-- Declaraciones de variables y constantes publicas
-- Tambin podemos declarar cursores
{[<ConstantName> CONSTANT <Datatype> := <valor>;]}
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 32 / 40
{[<VariableName> <Datatype>;]}
-- Declaraciones de procedimientos y funciones pblicas
{[FUNCTION <FunctionName>(<Parameter> <Datatype>,...)
RETURN <Datatype>;]}
{[PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...);]}
END <pkgName>;
El cuerpo es la implementacin del paquete. El cuerpo del paquete debe implementar lo que se declar
inicialmente en la especificacin. Es el donde debemos escribir el cdigo de los subprogramas.
En el cuerpo de un package podemos declarar nuevos subprogramas y tipos, pero estos sern privados
para el propio package.
La sintaxis general para crear el cuerpo de un paquete es muy parecida a la de la especificacin, tan solo
se aade la palabra clave BODY, y se implementa el cdigo de los subprogramas.
CREATE [OR REPLACE] PACKAGE BODY <pkgName>
IS
-- Declaraciones de tipos y registros privados
{[TYPE <TypeName> IS <Datatype>;]}
-- Declaraciones de variables y constantes privadas
-- Tambin podemos declarar cursores
{[<ConstantName> CONSTANT <Datatype> := <valor>;]}
{[<VariableName> <Datatype>;]}
-- Implementacion de procedimientos y funciones
FUNCTION <FunctionName>(<Parameter> <Datatype>,...)
RETURN <Datatype>
IS
-- Variables locales de la funcion
BEGIN
-- Implementeacion de la funcion
return(<Result>);
[EXCEPTION]
-- Control de excepciones
END;

PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...)
IS
-- Variables locales de la funcion
BEGIN
-- Implementacion de procedimiento
[EXCEPTION]
-- Control de excepciones
END;
END <pkgName>;
Es posible modificar el cuerpo de un paquete sin necesidad de alterar por ello la especificacin del
mismo.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 33 / 40
Los paquetes pueden llegar a ser programas muy complejos y suelen almacenar gran parte de la lgica
de negocio.
Ejemplo:
4.9.4 Disparadores
Los disparadores (triggers). Un disparador es un codigo que dispara cada vez que se ha modificado el
dato de una tabla. Puede disparar a nivel de la consulta, o a nivel de cada lnea afectada por la consulta.
tambin puede disparar antes o despus de la consulta, y solo por ciertos tipos de consulta
(insert/update/delete), y eventualmente solo cuando cierto(s) campo(s) estan afectados(s).
Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de una
determinada instruccin SQL (una operacin DML: INSERT, UPDATE o DELETE) sobre dicha tabla.
La sintaxis para crear un trigger es la siguiente:
CREATE [OR REPLACE] TRIGGER <nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
ON <nombre_tabla>
[FOR EACH ROW [WHEN (<condicion>)]]
DECLARE
-- variables locales
BEGIN
-- Sentencias
[EXCEPTION]
-- Sentencias control de excepcion
END <nombre_trigger>;
El uso de OR REPLACE permite sobreescribir un trigger existente. Si se omite, y el trigger existe, se
producir, un error.
Los triggers pueden definirse para las operaciones INSERT, UPDATE o DELETE, y pueden ejecutarse
antes o despus de la operacin. El modificador BEFORE AFTER indica que el trigger se ejecutar antes
o despues de ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE. Si incluimos el
modificador OF el trigger solo se ejecutar cuando la sentencia SQL afecte a los campos incluidos en la
lista.
El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH ROW indica que el
trigger se disparar cada vez que se realizan operaciones sobre una fila de la tabla. Si se acompaa del
modificador WHEN, se establece una restriccin; el trigger solo actuar, sobre las filas que satisfagan la
restriccin.
La siguiente tabla resume los contenidos anteriores.
INSERT, DELETE, UPDATE Define qu tipo de orden DML provoca la activacin del disparador.
BEFORE , AFTER Define si el disparador se activa antes o despus de que se ejecute la orden.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 34 / 40
FOR EACH ROW Los disparadores con nivel de fila se activan una vez por cada fila afectada por la
orden que provoc el disparo. Los disparadores con nivel de orden se activan slo una vez, antes o
despus de la orden. Los disparadores con nivel de fila se identifican por la clusula FOR EACH ROW en
la definicin del disparador.
La clusula WHEN slo es vlida para los disparadores con nivel de fila.
Dentro del ambito de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan
del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas,
son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la accin
SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder
a los datos que se estn insertando, actualizando o borrando.
El siguiente ejemplo muestra un trigger que inserta un registro en la tabla EMP_AUDIT cada vez que
modificamos el salario de un registro en la tabla emp:
C$ea#e #a,le em*!a%<i# (em*" %m,e$ "# %ll, &echa <a#e "# %ll, ms; va$cha$@(VLL) "# %ll)3
c$ea#e "$ $e*lace TRI::ER TR!E(P!A6
AFTER 6P0ATE ON E(P
FOR EAC/ ROW
W/EN (OL0.salOMNEW.sal)
0ECLARE
GG l"cal va$ia,les
8E:IN
IN+ERT INTO em*!a%<i#
(em*",&echa,ms;)
VAL6E+
(.NEW.em*",+1+0ATE,?+ala$i" m"<i&ica<" <e ?||."l<.sal||? a ?||.ew.sal)3
EN0 3
El trigger se ejecutar cuando sobre la tabla EMP se ejecute una sentencia UPDATE que modifica el
salario.
Ejemplo:
8E:IN
Ac#%ali>a!+ala$i"(*!em*" FM TKUJ,*!ew!sala$i" FM @VLL)3
CO((IT3
EN03
4.9.4.1 Orden de ejecucin de los triggers
Una misma tabla puede tener varios triggers. En tal caso es necesario conocer el orden en el que se van a
ejecutar.
Los disparadores se activan al ejecutarse la sentencia SQL.
* Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de orden.
* Para cada fila a la que afecte la orden:
o Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila.
o Se ejecuta la propia orden.
o Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila.
* Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden.
4.9.4.2 Restricciones de los triggers
El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es
legal en el cuerpo de un disparador, con las siguientes restricciones:
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 35 / 40
* Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o
SAVEPOINT. El disparador se activa como parte de la ejecucin de la orden que provoc el disparo, y
forma parte de la misma transaccin que dicha orden. Cuando la orden que provoca el disparo es
confirmada o cancelada, se confirma o cancela tambin el trabajo realizado por el disparador.
* Por razones idnticas, ningn procedimiento o funcin llamado por el disparador puede emitir
rdenes de control de transacciones.
* El cuerpo del disparador no puede contener ninguna declaracin de variables LONG o LONG RAW
4.9.4.3 Utilizacin de :OLD y :NEW
Dentro del ambito de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan
del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas,
son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la accin
SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder
a los datos que se estn insertando, actualizando o borrando.
La siguiente tabla muestra los valores de OLD y NEW.
ACCION SQL
OLD
NEW
INSERT
No definido; todos los campos toman valor NULL.
Valores que sern insertados cuando se complete la orden.
UPDATE
Valores originales de la fila, antes de la actualizacin.
Nuevos valores que sern escritos cuando se complete la orden.
DELETE
Valores, antes del borrado de la fila.
No definidos; todos los campos toman el valor NULL.
Los registros OLD y NEW son slo vlidos dentro de los disparadores con nivel de fila.
Podemos usar OLD y NEW como cualquier otra variable PL/SQL.
Utilizacin de predicados de los triggers: INSERTING, UPDATING y DELETING
Dentro de un disparador en el que se disparan distintos tipos de rdenes DML (INSERT, UPDATE y
DELETE), hay tres funciones booleanas que pueden emplearse para determinar de qu operacin se
trata. Estos predicados son INSERTING, UPDATING y DELETING.
Su comportamiento es el siguiente:
INSERTING TRUE si la orden de disparo es INSERT; FALSE en otro caso.
UPDATING TRUE si la orden de disparo es UPDATE; FALSE en otro caso.
DELETING TRUE si la orden de disparo es DELETE; FALSE en otro caso.
Sintaxis completa:
CREATE [OR REPLACE] TRI::ER [schema.]#$i;;e$
8EFORE eve#
[W/EN (c"<i#i")]
4*l!s-l!,l"cE | call!*$"ce<%$e!s#a#eme#5
CREATE [OR REPLACE] TRI::ER [schema.]#$i;;e$
AFTER eve#
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 36 / 40
[W/EN (c"<i#i")]
4*l!s-l!,l"cE | call!*$"ce<%$e!s#a#eme#5
CREATE [OR REPLACE] TRI::ER [schema.]#$i;;e$
IN+TEA0 OF eve#
[W/EN (c"<i#i")]
4*l!s-l!,l"cE | call!*$"ce<%$e!s#a#eme#5
eve# ca ,e "e "$ m"$e "& #he &"ll"wi; (se*a$a#e m%l#i*le eve#s wi#h OR)
0ELETE eve#!$e& $e&e$eci;!cla%se
IN+ERT eve#!$e& $e&e$eci;!cla%se
6P0ATE eve#!$e& $e&e$eci;!cla%se
6P0ATE OF c"l%m, c"l%m... eve#!$e&
<,B<<l!eve# ON [schema.",Cec#]
<,B<<l!eve# ON 0ATA8A+E
eve#!$e&.
ON [schema.]#a,le
ON [schema.]view
ON [NE+TE0 TA8LE es#e<!#a,le!c"l%m OF] [schema.]view
$e&e$eci;!cla%se.
FOR EAC/ ROW
REFERENCIN: OL0 [A+] "l< [FOR EAC/ ROW]
REFERENCIN: NEW [A+] ew [FOR EAC/ ROW]
REFERENCIN: PARENT [A+] *a$e# [FOR EAC/ ROW]
<,B<<l!eve#.
ALTER
ANAL1+E
A++OCIATE +TATI+TIC+
A60IT
CO((ENT
CREATE
00L
0I+A++OCIATE +TATI+TIC+
0ROP
:RANT
LO:ON
LO:OFF
NOA60IT
RENA(E
REVO2E
TR6NCATE
+ERVERERROR
+TART6P
+/6T0OWN
+6+PEN0
(%l#i*le <,B<<l!eve#s ca ,e se*a$a#e< wi#h OR
(%l#i*le OL0, NEW a< PARENT c"$$ela#i" ames ca ,e <e&ie< i "e REFERENCIN: cla%se.
0a#a,ase c"s#$ai#s a$e a &ac#"$ "& X= &as#e$ #ha #$i;;e$s.
4.9.5 Ejercicios
1. Crear una funcin que agrega 10 al valor pasado en parametro y regresa el resultado
2. Crear un procedimiento que inserta un nuevo empleado
3. Crear un paquete con procedimiento para modificar un empleado, y una funcin para obtener la
fecha de nacimiento del empleado
4. Usar los procedimientos/funciones en select
5. Crear un trigger que genera la clave primaria del empleado basado en una secuencia
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 37 / 40
5 SQL Loader
SQL Loader es una herramienta de Oracle que permite cargar de manera muy eficiente (rpida) datos
desde un archivo externeo (texto o binario) hacia una tabla de Oracle.
Se lanza desde la lnea de comando, lo que permite usarlo en script.
Se necesita, adems del archivo a cargar, un cliente Oracle instalado (de preferencia la misma versin de
cliente que el servidor), y un archivo de parmetros (fichero de control).
Al SQLLoader ( sqlldr) se le pasan como parmetros (los ms importantes) el fichero que contiene los
datos que se van a cargar y la ruta del fichero de control que contiene las acciones a realizar. El formato
de los datos, donde se cargaran y cualquier otro tipo de control.
SYNTAXIS
s-ll<$ %se$i<F6+6ARIOBCONTRA+EYAD8A+E c"#$"lFBR6TAB0ELBFIC/EROB0EBCONTROL
<a#aFBR6TAB0ELBFIC/EROB76EBCONTIENEBLO+B0ATO+ l";FBLOB(I+(O ,a<FBAB0ON0EBVANBLO+B0ATO+B(ALO+
<isca$<FBAB0ON0EBVANBLO+B0ATO+B0E+CARTA0O+
EJEMPLO:
s-ll<$ %se$i<Fal%m"BI@KDc%$s" c"#$"lFB#m*B#es#.c#l <a#aFB#m*B#es#.#=#
Como puedes ver no es muy complicado. Simplemente te conectas con un usuario de la base de datos y le
dices cual es el fichero de texto que contiene la informacin y cual es el que contiene las especificaciones
sobre lo que se va a hacer con esa informacin
Para ms informacin, ver en:
http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14215/part_ldr.htm
Parmetros Comunes
userid=USUARIO/CONTRASEA@BASE Usuario, contrasea e instancia a la que te conectas.
control=Ruta del archivo de control que contiene las directivas de lo que se va a hacer.
data=Ruta del archivo que contiene los datos.
log=Ruta del archivo donde quieres que se genere el log.
discard=Ruta del archivo donde quieres que te enve los registros descartados y no cargados.
bad=Ruta del fichero donde van a parar los registros malos.
Archivo de Control
El archivo de control ( Control file en brbaro ) es donde se especifica cmo se van a cargar los datos.
Normalmente suele responder al siguiente esquema:
LOAD DATA
BADFILE '/a/donde/van/los/datos/malos'
DISCARDFILE '/a/donde/van/los/datos/descartados'
INFILE '/la/ruta/del/archivo/desde/el/que/se/cargan/los/datos'
APPEND
INTO TABLE TU_TABLA_DE_DESTINO
FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
CAMPO0 POSITION(1:15),
CAMPO1 CHAR "ltrim(rtrim(:CAMPO1))",
CAMPO2 CHAR "ltrim(rtrim(:CAMPO2))",
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 38 / 40
CAMPO3NUMERICO INTEGER EXTERNAL,
CAMPO4FECHA DATE "DD-Month-YY"
)
Como ves, si los campos tienen una longitud fija puedes especificarle las posiciones, desde el carcter 1 a
la 15 y sucesivamente. O si no, puedes dejar que Oracle interprete los campos y los inserte. En este caso
est introduciondo datos APPEND al final de la tabla. ( Podra ser REPLACE para que reemplazara
datos preexistentes). Como puedes imaginar por defecto cada linea es una fila. Y en este ejemplo cada
campo est delimitado por el carcter |. TRAILING NULLCOLS sirve para que interprete que los
campos sin contenido sean interpretados como NULOS.
Sql Loader y problemas con fechas
Si estas cargando datos con fechas es posible que te cause problemas al intentar insertar columnas con
fechas y campos nulos. Una manera de evitarlo es borrar los caracteres en blanco del campo de fecha.
Ejemplo:
cam*"!<e!&echa Z#"!<a#e (l#$im($#$im(.cam*"!<e!&echa)), ?))))GmmG<< hh@W.mi?)Z
Ejemplo completo:
1) Crear la tabla:
c$ea#e #a,le cim (C' cha$(@) "# %ll, LAN: cha$(@) "# %ll, CO0E va$cha$@(IL) "# %ll, <esc$i*ci"
va$cha$@(ILLL) "# %ll)3
2) Copiar el archivo de datos cim-10.txt en /tmp
3) Crear el archivo de control test.ctl en /tmp:
LOA0 0ATA
INTO TA8LE cim
TR6NCATE
FIEL0+ TER(INATE0 81 '?LJ?
TRAILIN: N6LLCOL+
(
C',
LAN:,
CO0E,
0E+CRIPCION
)
4) Cargar los datos:
s-ll<$ %se$i<Fal%m"BI@KDc"$e@< c"#$"lFB#m*B#es#.c#l <a#aFB#m*BcimGIL.#=# l";FBh"meB"$acleB#es#.l";
5) Validar que los datos han sido cargados
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 39 / 40
6 Respaldo y reposicin de la base de
datos
6.1 Respaldos fsicos online
Este tipo de respaldo es la mejor eleccin para un plan de recuperacin despus de un desastre.
Los respaldos 'online' permiten hacer respaldos mientras el sistema est en uso. Se pueden hacer
respaldos diferenciales, o acumulativos.
Solo estn disponible si la base de datos corre en modo ARCHIVELOG. Este tipo de
respaldo/restauracin ser visto en un curso avanzado y no hace parte de este curso bsico.
Los respaldos en caliente deben siempre tener como base un respaldo en fro. Sin respaldo correcto y
completo en fro, no se podr hacer una reposicin usando los respaldos hechos en caliente.
6.1.1 Respaldos en caliente (online)
Para hacer un respaldo en caliente, cada tablespace debe ser cambiado a modo de backup antes de
iniciar el respaldo.
Ejemplo:
ALTER TA8LE+PACE =)> 8E:IN 8AC26P3
c* =)&FileI B,acE%*0i$B
ALTER TA8LE+PACE =)> EN0 8AC26P3
Desde 10g es tambin posible poner todos los tablespace en modo de backup con un solo comando:
ALTER 0ATA8A+E 8E:IN 8AC26P3
No olviden de guardar tambin una copia de todos los rchive logs' y de los control files.
ALTER +1+TE( +WITC/ LO:FILE3 GG F"$ce l"; swi#ch #" %*<a#e c"#$"l &ile hea<e$s
ALTER 0ATA8A+E 8AC26P CONTROLFILE TO ?B,acE%*0i$Bc"#$"l.<,&?3
c* Bcami"!hacia!l"s!l";sBH.a$c Bcami"!<e!,acE%*B
Si su base de datos termino anormalmente (crash) mientras uno o varios tablespaces estaban en modo de
backup, hay que mencionar a Oracle de termniar el modo de backup cuando la base de datos es montada
(no abierta).
ALTER 0ATA8A+E EN0 8AC26P3
6.2 Restauracin haca un cierto punto el en pasado
Las restauraciones ms fcil son las restauraciones a partir de un respaldo lgico, o de un respaldo
'offline'.
En caso de reposicin desde un respaldo en caliente, ser necesario aplicar los archive logs, para
recuperar todas las transacciones ejecutadas (y confirmadas con un commit).
Las tablas de FLASHBACK permiten recuperar fcilmente tablas botadas o registros borrados sin
necesidad de hace una restauracin completa de la base de datos.
Desde 10g es muy fcil crear respaldos y restaurar datos usando en Enterprise Manager.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida
Curso de administracin de Oracle 10g (10.2) Pagina 40 / 40
Ver detalles en : http://examples.oreilly.com/unixbr/oracle.html
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

También podría gustarte