Está en la página 1de 40

Reproduccinprohibida

Versin1.0

CopyrightCdricSimon,2008

SolucionJava.com

Manual del alumno

Ing.CedricSimonTel:22680974Cel:88882387Email: c e d r i c @ s o l u c i o n j a v a . c o m Web:www.solucionjava.com

Curso de
administracin de
Oracle 10g (10.2)
Nivel Intermedio

CursodeadministracindeOracle10g(10.2)

Pagina2/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 Insert............................................................................................................................................................................5
2.3 Update.........................................................................................................................................................................5
2.4 Delete...........................................................................................................................................................................5
2.5 Commit y rollback......................................................................................................................................................5
2.6 Select............................................................................................................................................................................6
2.7 Where..........................................................................................................................................................................6
2.8 Count...........................................................................................................................................................................7
2.9 Sum, avg, min, max....................................................................................................................................................7
2.10 Distinct.......................................................................................................................................................................7
2.11 Order by....................................................................................................................................................................7
2.12 Uniones .....................................................................................................................................................................7
2.13 Subconsultas.............................................................................................................................................................8
2.14 Agrupaciones............................................................................................................................................................8
2.15 Operadores SQL ......................................................................................................................................................8
2.16 La ausencia de valor: NULL ................................................................................................................................10
2.17 Rendimiento............................................................................................................................................................10
3 Creacin de objetos..........................................................................................................................................................11
3.1 Vistas.........................................................................................................................................................................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 Vistas materializadas...............................................................................................................................................12
3.3.1 Creacin..............................................................................................................................................................12
3.3.2 Modificacin.......................................................................................................................................................13
3.3.3 Eliminacin.........................................................................................................................................................13
3.4 Sinnimos..................................................................................................................................................................13
3.4.1 Creacin..............................................................................................................................................................13
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina3/40

3.4.2 Eliminacin.........................................................................................................................................................14
3.4.3 Ejercicios.............................................................................................................................................................14
3.5 DB Link.....................................................................................................................................................................14
3.5.1 Creacin..............................................................................................................................................................14
3.5.2 Eliminacin.........................................................................................................................................................16
4 PL/SQL bsico.................................................................................................................................................................17
4.1 Introduccin..............................................................................................................................................................17
4.2 Bloque annimo PL/SQL.........................................................................................................................................17
4.3 Identificadores..........................................................................................................................................................17
4.4 Variables...................................................................................................................................................................17
4.4.1 Tipos de variables................................................................................................................................................17
4.4.2 Variables locales.................................................................................................................................................18
4.4.3 Variables globales...............................................................................................................................................18
4.5 Control de flujo.........................................................................................................................................................18
4.6 Bucles.........................................................................................................................................................................19
4.6.1 LOOP..................................................................................................................................................................19
4.6.2 WHILE................................................................................................................................................................19
4.6.3 FOR.....................................................................................................................................................................19
4.7 Cursores....................................................................................................................................................................20
4.8 Excepciones...............................................................................................................................................................21
4.8.1 Excepciones predefinidas ...................................................................................................................................22
4.8.2 Excepciones definidas por el usuario .................................................................................................................23
4.8.3 RAISE_APPLICATION_ERROR......................................................................................................................25
4.9 Procedimientos, funciones, paquetes, disparadores..............................................................................................25
4.9.1 Funciones............................................................................................................................................................25
4.9.2 Procedimientos....................................................................................................................................................30
4.9.3 Paquetes...............................................................................................................................................................31
4.9.4 Disparadores........................................................................................................................................................33
4.9.5 Ejercicios.............................................................................................................................................................36
5 SQL Loader......................................................................................................................................................................37
6 Respaldo y reposicin de la base de datos.......................................................................................................................39
6.1 Respaldos fsicos online............................................................................................................................................39
6.1.1 Respaldos en caliente (online).............................................................................................................................39
6.2 Restauracin haca un cierto punto el en pasado..................................................................................................39

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina4/40

1 Introduccinalcurso
1.1 Objetivodeestecurso
EstecursobrindaralalumnoelconocimientonecesarioparaadministrarunabasededatosOracle10g.

1.2 Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Estemanual
contieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumnodeberade
tomarnotaspersonalesparacompletasestemanual.

1.3 Requisitosparaatenderaestecurso
SerequiereunconocimientodellenguajeSQL.

1.4 Soportedespusdelcurso
Sitienespreguntassobrelamateriadelcursoentusejerciciosprcticos,puedesescribirtus
preguntasacedric@solucionjava.com.

Respaldosencaliente(online)
Reposicindebasededatosconaplicacindelogs
Programacindetrabajosdemantenimiento

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina5/40

2 DMLSentenciasdemanipulacin
dedatos
2.1 Objetivodelcaptulo
Alfindeestecaptuloelalumnosercapazdehacerencuestasdelabasededatos.Novamosavertodas
lasopciones,nilasencuestasdeotrosobjetosdelabasededatos(vistas,funciones,secuencias,...)porque
esosaledelcuadrodeestecursodeiniciacin.
Existenmuchasopciones(top,exists,cube,...)paracadatipodeaccin,peroestasopcionesdependende
labasededatosutilizadasy/odesuversin.Solovamosaverlassentenciasbsicas.
Existenmuchosentornosquesimplificanlasencuestassobrelosdatos.

2.2 Insert
LasentenciaInsertpermitedeinsertardatosenunatabla.
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) VALUES
(<valor_campo_1>,<valor_campo_2>,<valor_...>);

Tambinexiste:
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) <SELECT STATEMENT>;

2.3 Update
LasentenciaUpdatepermitedemodificarelvalordeunoovariosdatosenunatabla.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>;

Decostumbreselimitaelcambioaciertosregistros,mencionadosutilizandounaclusulaWHERE.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>
WHERE <clusula_where>;

2.4 Delete
LasentenciaDeletepermitedeborrarununoovariosregistrosenunatabla.
DELETE FROM <nombre_de_tabla> ;

Decostumbreselimitaelborradoaciertosregistros,mencionadosutilizandounaclusulaWHERE.
DELETE FROM <nombre_de_tabla>

WHERE <clusula_where>;

2.5 Commityrollback
Silabasededatospermitelagestindetransacciones,sepuedeutilizarCommitparaconfirmaruna
Insert,Update,oDelete,o`Rollback`paracancelarlos.Ciertasbasededatospuedenserconfiuradas

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina6/40

paraautocommit,quehaceuncommitautomaticamentedespuesdecadainstruccin,amenosqueseha
iniciadounatransaccindemaneraexplicita(con'begintransactionxxx;).
HastaqueelCommitestejecutado,lasmodificacionesnoestninscritasdemanerapermanenteenla
basededatos,yslosonvisibleparalasesinencursodelusuarioautordelasacciones.Despusdel
Commit,loscambiossondefinitivosyvisibleparatodos.
Cuidadoqueciertosobjetospuedenquedarbloqueados(bloqueandootrosusuarios)hastaqueelcommit
seahecho.
Elcommit/rollbackpermiteconfirmarodehacerunlotedetransaccin,paraquesiunafalle,todaslas
anterioresseanulantambin.Cuandosenecesitaunaintegridaddetransaccin,seutilizaen
commit/rollback.
Ejemplo:
SELECT emp_no,job_grade FROM employee
START TRANSACTION;
update employee set job_grade=5 where
SELECT emp_no,job_grade FROM employee
rollback;
SELECT emp_no,job_grade FROM employee
START TRANSACTION;
update employee set job_grade=5 where
SELECT emp_no,job_grade FROM employee
commit;
SELECT emp_no,job_grade FROM employee

where emp_no=45;
emp_no=45;
where emp_no=45;
where emp_no=45;
emp_no=45;
where emp_no=45;
where emp_no=45;

2.6 Select
ElSelectpermitedeseleccionardatosenlabasededatos,yvisualizarlos.
Sepuedeutilizarunaliasparaqueelcamposepuedallamarconotronombre.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla>;
SELECT <campo_1> as <alias1>,<campo_2>,<...> FROM <nombre_tabla>;

Paraseleccionartodosloscamposdelatabla,seutilizaelasteriscoenvezdelosnombresdecampo.
SELECT * FROM <nombre_tabla>;
Ejemplo:
SELECT emp_no,job_grade as nivel FROM employee;
SELECT * FROM employee;

2.7 Where
LaclusulaWherepermitedelimitarlaencuestaaciertosdatos.
Seutilizaevaluandouncampoversusunacondicin.Sepuedenutilizarvariascondiciones,conelusode
Or,And,y/oparntesis.
Paracomparanmeros,seutilizaelsigno'=',o'<',o'>',o'<=',o'>=',o'between...and...'.
Paracompararcaracteresseutilizalapalabra'like'.Elwildcardes'%'.
Paracomparafecha,seutilizaelsigno'=',o'<',o'>',o'<=',o'>=',o'between...and...'.
Para
SELECT * FROM <nombre_tabla>
WHERE <campo_1> <operation> <condicin> AND <campo_2> <operation> <condicin>;

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Ejemplo:
SELECT emp_no,job_grade FROM
SELECT emp_no,job_grade FROM
SELECT * FROM employee where
SELECT * FROM employee where

employee where
employee where
emp_no between
last_name like

Pagina7/40

emp_no>45;
emp_no=45 or
40 and 45;
'P%';

emp_no=41;

2.8 Count
Paracontarunnumeroderegistros,seutilizalapalabraCount.
SELECT COUNT(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT count(*) FROM employee where job_grade=4;

2.9 Sum,avg,min,max
Paraunasuma,min,max,...deuncampo,seutilizanlapalabrasSum,Min,Max,Avg.
SELECT SUM(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT avg(salary) FROM employee where job_grade=2;

2.10Distinct

Paratenerlalistadevaloresdistingasdeuncampo,seutilizalapalabraDistinct.
SELECT DISTINCT(<campo_1>) FROM <nombre_tabla>;
Ejemplo:
SELECT distinct(job_grade) FROM employee;

2.11Orderby

Paraordenarlosregistrosregresados,hayqueutilizarlapalabreOrderby.
SELECT * FROM <nombre_tabla>
ORDER BY <campo_1>,<....>;
Ejemplo:
SELECT first_name,last_name FROM employee order by first_name,last_name;

2.12Uniones

Unionespermitendeunirlosresultadosdedosconsultas.Parapoderunirlas,tienenquetenerlos
mismoscampos.
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;

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina8/40

2.13Subconsultas

Subconsultassonconsultassobreotrasconsultas.LasubconsultasepuedeutilizarellacusulaFrom,o
ellacondicindelaclsulaWhere.Lasubconsultaseponeentreparntesis.EnMySQL,las
subconsultasdebentenersuspropiosalias.
SELECT t3.<campo_1>, t3.<campo_2> FROM (SELECT t.<campo_1>, t.<campo_2>
<where cluase>) t3
WHERE t3.<campo_1> IN (SELECT t2.<campo_1> FROM <nombre_tabla_2> t2);

FROM <nombre_tabla > t

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

Lasagrupacionespermitenagrupardatosysabercuantosdatoshaydecadavalor.
SELECT <campo_1>,<campo_2>, COUNT(*) FROM <nombre_tabla>
GROUP BY <campo_1>,<campo_2>;

LasagrupacionessepuedenfiltrarutilizandolaclausulaHAVING.
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.15OperadoresSQL

YahemosvistoanteriormentequtiposdedatossepuedenutilizarenOracle.Ysiemprequehayadatos,
habroperacionesentreellos,asqueahorasedescribirnquoperacionesyconquoperadoresse
realizan:
LosoperadoressepuedendividirenTRESconjuntos:
Aritmticos:utilizanvaloresnumricos
Lgicos(obooleanosodecomparacin):utilizanvaloresbooleanosolgicos.
Concatenacin:paraunircadenasdecaracteres.
OperadoresartmticosRetornanunvalornumrico:
Smbolo

Significado

Ejemplo

Operacinsuma

1+2

Operacinresta

12

Operacinmultiplicacin

1*2

Operadordivisin

1/2

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina9/40

OperadoreslgicosRetornanunvalorlgico(verdaderoofalso)
Smbolo

Significado

Ejemplo

Igualdad

1=2

!=<>^=

Desigualdad

1!=21<>21^=2

>

Mayorque

1>2

<

Menorque

1<2

>=

Mayoroigualque

1>=2

<=

Menoroigualque

1<=2

IN(RS)

Igualaalgnelementodelresultset.

1IN(1,2)
[TRUE]

ANYSOME

aalgnelementodelresultset(derecha).Debeserestar
10>=ANY(1,2,3,10)
precedidopor=,!=,<,<=,>,>=HaceunORlgicoentretodos
[TRUE]
loselementos.

ALL

atodosloselementosdelresultset(derecha),Debeserestar
10<=ALL(1,2,3,10)
precedidopor=,!=,<,<=,>,>=HaceunANDlgicoentretodos
[TRUE]
loselementos.

BEETWEENx Operandodelaizquierdaentrexey.Equivalenteaop>=x
ANDy
ANDop<=y

10BETWEEN1AND
100

EXISTS

Silaretornaalmenosunafila

EXISTS(SELECT1
FROMDUAL)

LIKE(*)

Escomo

'pepe'LIKE
'pe%'

ISNULL

Siesnulo

1ISNULL

ISNOTNULL SiesNonulo

1ISNOTNULL

NOTcond.

NOTEXISTSNOT
BETWEENNOTIN
NOT=

Niegalacondicinposterios

condANDcond HaceunANDlgicoentredoscondiciones

1=1AND2ISNULL

CondORcond HaceunORlgicoentredoscondiciones

1=1OR2ISNULL

Existenlossiguientescomodines:
%:ConjuntodeNcaracteres(de0a)
_:Unsolocarcter
Concatenacin

Oraclepuedehacerunaconversinautomticacuandoseutiliceesteoperadorconvaloresnumricos:10
||20='1020'
EsteprocesodedenominaCASTINGysepuedeaplicarentodosaquelloscasosenqueseutilizavalores
numricosenpuestodevaloresalfanumricosoinclusoviceversa.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina10/40

2.16Laausenciadevalor:NULL

Todovalor(seadeltipoquesea)puedecontenerelvalorNULLquenoesmsquelaausenciadevalor.
Asquecualquiercolumna(NUMBER,VARCHAR2,DATE)puedecontenerelvalorNULL,conloque
sedicequelacolumnaestaNULL.UnaoperacinretornaNULLsicualquieradelosoperandoses
NULL.ParacomprobarsiunavaloresNULLseutilizaeloperadorISNULLoISNOTNULL.

2.17Rendimiento

Unproblemacomnenlasencuestaabasededatoseselrendimiento.
Lascausasdeproblemaderendimientosonnumerosas.
Lasmscomunesson:
InstruccinsinoconmalaclausulaWHERE
Faltadeindicesobreuncampoutilizadocomofiltro
Maldiseodelabasededatos
Problemadehardware(faltadememoria,discoocupado,cpuocupadoporotraaplicacin,...)
Malaconfiguracindelservidor(malusodelamemoria,disco,cpu,...)
Malaprogramacinenelcliente.Faltadecommit,conexinnocerrada,...
Redsobrecargadaomuylenta
Cuandoseenfrentaaunproblemaderendimientohayqueprobarprimerodeidentificarlacausaylos
sntomas.ServidorsobrecargadoenCPU,disco,memoria?Unclienteafectadootodos?Cuandoaparece
elproblema?
Paraayudarainvestigarestosproblemasexistenherramientas.Algunosvienenconlabasededatos,
otrosestndesarrolladosaparte.Verladocumentacindesubasededatosparamasinformacin.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina11/40

3 Creacindeobjetos
3.1 Vistas
Lavistaesunasentenciadeseleccindedatospreparada.Permitefacilitarlasconsultasfuturas,
especialmentecuandosejuntanvariastablas.Permitetambinlimitarelaccesoadatos(seguridad).
3.1.1

Creacin

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW


[schema.]view
[(alias,...) inline_constraint(s)]
[out_of_line_constraint(s)]
[XMLType_view_clause]
AS subquery options
options:
WITH READ ONLY
WITH CHECK OPTION [CONSTRAINT constraint]

3.1.2
ALTER
ALTER
ALTER
ALTER
ALTER
ALTER

Modificacin
VIEW
VIEW
VIEW
VIEW
VIEW
VIEW

[schema.]view
[schema.]view
[schema.]view
[schema.]view
[schema.]view
[schema.]view

COMPILE;
ADD out_of_line_constraint;
MODIFY CONSTRAINT constraint {RELY | NORELY};
DROP CONSTRAINT constraint;
DROP PRIMARY KEY
UNIQUE (column [,column,...])

WhenaconstraintisinNOVALIDATEmode,Oracledoesnotenforceitanddoesnottakeitintoaccount
forqueryrewrite.IfyouspecifyRELYOraclewillstillnotenforcetheconstraintbutwilltakeitinto
accountforqueryrewrite.
AnalternativetoALTERVIEWCOMPILEisthebuiltinpl/sqlpackageDBMS_UTILITY
3.1.3

Eliminacin

DROP VIEW [schema.]view [CASCADE CONSTRAINTS]

3.1.4

Ejercicios

1. Creaunavistasobre2tablasligadas.
2. Usalavistaenunaconsulta.

3.2 Secuencias
Unasecuenciaesuncontadorqueseincrementaautomticamenteypermitegenerarnumeronicos.
3.2.1

Creacin

CREATE SEQUENCE [schema.]sequence_name option(s)


Options:
INCREMENT BY int
START WITH int
MAXVALUE int | NOMAXVALUE
MINVALUE int | NOMINVALUE
CYCLE | NOCYCLE

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina12/40

CACHE int | NOCACHE


ORDER | NOORDER

3.2.2

Modificacin

ALTER SEQUENCE [schema.]sequence_name option(s)


Options:
INCREMENT BY int
MAXVALUE int | NOMAXVALUE
MINVALUE int | NOMINVALUE
CYCLE | NOCYCLE
CACHE int | NOCACHE
ORDER | NOORDER

3.2.3

Eliminacin

DROP SEQUENCE [schema.]sequence_name

3.2.4

Ejercicios

1. Creaunasecuencia
2. Alteralasecuenciaparaqueelprximonumerogeneradosea20

3.3 Vistasmaterializadas
Unavistamaterializadaesunconjuntodedatosdeunaovariastablas(comounavista)perodelcualel
datoseguardafsicamente.Aumentaelrendimientodelasconsultasencomparacindelavistanormal,
perodisminuyeelrendimientodelasconsultasDMLsobrelastablasligadasalavistamaterializada,ya
quetienequemantenerlavistamaterializadaademasdelatablafuente.
3.3.1

Creacin

CREATE MATERIALIZED VIEW [schema.]mview


Mview_Options
[USING INDEX storage_options]
[{REFRESH [refresh_options] | NEVER REFRESH]
[FOR UPDATE] [{ENABLE|DISABLE} QUERY REWRITE]
AS subbquery;
storage_options:
PCTFREE int
PCTUSED int
INITRANS int
MAXTRANS int
STORAGE storage_clause
TABLESPACE tablespace
refresh_options:
FAST | COMPLETE | FORCE
ON [DEMAND | COMMIT]
{NEXT | START WITH} date
WITH {PRIMARY KEY | ROWID}
USING DEFAULT {MASTER|LOCAL} ROLLBACK SEGMENT
USING {MASTER|LOCAL} ROLLBACK SEGMENT rb_segment
idx_organized_tbl_clause:
storage_option(s)
{MAPPING TABLE | NOMAPPING}
[PCTTHRESHOLD int]
[COMPRESS int|NOCOMPRESS]
[ [INCLUDING column_name] OVERFLOW [storage_option(s)] ]
external_table_clause:
([TYPE access_driver_type]

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina13/40

DEFAULT DIRECTORY directory [ACCESS PARAMETERS {USING CLOB subquery | (opaque_format_spec) }]


LOCATION (directory:'location_specifier' [,directory2:'location_specifier2'...)
) [REJECT LIMIT {int|UNLIMITED}]
nested_storage_clause:
NESTED TABLE {nested_item | COLUMN_VALUE}
[ [ELEMENT] IS OF TYPE (ONLY type) ]] |
STORE AS storage_table
[RETURN AS {LOCATOR|VALUE} ]

3.3.2

[ [NOT] SUBSTITUTABLE AT ALL LEVELS ]]

Modificacin

ALTER MATERIALIZED VIEW [schema.]mview options iot_options


[USING INDEX index_options]
[REFRESH [refresh_options]]
[COMPILE | CONSIDER FRESH | {ENABLE|DISABLE} QUERY REWRITE]
ALTER MATERIALIZED VIEW [schema.]mview options iot_options
[USING INDEX index_options]
[REBUILD]
[COMPILE | CONSIDER FRESH | {ENABLE|DISABLE} QUERY REWRITE]
ALTER MATERIALIZED VIEW [schema.]mview options iot_options
[USING INDEX index_options]
MODIFY SCOPE FOR (ref_column/attribute) IS [schema.]scope_table
[COMPILE | CONSIDER FRESH | {ENABLE|DISABLE} QUERY REWRITE]
Options:
COMPRESS|NOCOMPRESS
CACHE | NOCACHE
PARALLEL int | NOPARALLEL
ALLOCATE EXTENT [( [DATAFILE filename]
[, SIZE int {K | M}]
[, INSTANCE int] )]
Partitioning clause
Physical_options
LOB Clause

3.3.3

Eliminacin

DROP MATERIALIZED VIEW [schema.] materialized_view

SnapshotissynonymouswithMaterializedView.
Paramsinformacinsobrelasvistasmaterializadas,veren
http://www.softics.ru/docs/oracle10r2/server.101/b10759/statements_6002.htm

3.4 Sinnimos
Unsinnimoesunnombredeobjetoquerefiereaunobjetoconotronombre,oquesepuedaencontrar
enotroesquema.
Unsinnimopublicesdisponibleparatodoslosusuarios(segnsusprivilegios).
3.4.1

Creacin

CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]synonym


FOR [schema.]object [@dblink]
'PUBLIC' will create a public synonym, accessible to all users (with the appropriate privileges.)
Unlike Views, Synonyms do not need to be recompiled when the underlying table is redefined.
There is a small performance hit when accessing data through a public synonym.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina14/40

Oracle will resolve object names in the following order:


current user
private synonym
public synonym
An alternative method to access data in another schema is to use:
ALTER SESSION set current_schema = Other_Schema

3.4.2

Eliminacin

DROP [PUBLIC] SYNONYM [schema.]synonym [FORCE]


FORCE will drop the synonym even there are dependent tables or user-defined types.

3.4.3

Ejercicios

1. Creaunsinnimopublicoparaunobjeto.Luegoconectatecomootrousuarioyconsultaelobjeto
viaelsinnimopblico.

3.5 DBLink
UnDBLinkpermitellamaraobjetosqueseencuentranenotrabasededatos(onlcuidoenunservidor
remoto).
Hayquetenercuidadosonelrendimientoligadoaconsultasremotas,yaquepuedeimpactardemanera
significativaenservidorremoto.
3.5.1

Creacin

CREATE [ SHARED ] [ PUBLIC ] DATABASE LINK dblink


[ CONNECT TO
{ CURRENT_USER
| user IDENTIFIED BY password
[ dblink_authentication ]
}
| dblink_authentication
]
[ USING 'connect_string' ] ;
dblink_authentication:
AUTHENTICATED BY user
IDENTIFIED BY password

SpecifySHAREDtouseasinglenetworkconnectiontocreateapublicdatabaselinkthatcanbeshared
amongmultipleusers.
SpecifyPUBLICtocreateapublicdatabaselinkavailabletoallusers.Ifyouomitthisclause,the
databaselinkisprivateandisavailableonlytoyou.
Dblink:Specifythecompleteorpartialnameofthedatabaselink.Ifyouspecifyonlythedatabasename,
thenOracleDatabaseimplicitlyappendsthedatabasedomainofthelocaldatabase.
RestrictiononCreatingDatabaseLinks
Youcannotcreateadatabaselinkinanotheruser'sschema,andyoucannotqualifydblinkwiththe
nameofaschema.Periodsarepermittedinnamesofdatabaselinks,soOracleDatabaseinterpretsthe

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina15/40

entirename,suchasralph.linktosales,asthenameofadatabaselinkinyourschemaratherthanasa
databaselinknamedlinktosalesintheschemaralph.)
TheCONNECTTOclauseletsyouenableaconnectiontotheremotedatabase.
SpecifyCURRENT_USERtocreateacurrentuserdatabaselink.Thecurrentusermustbeaglobaluser
withavalidaccountontheremotedatabase.
Ifthedatabaselinkisuseddirectly,thatis,notfromwithinastoredobject,thenthecurrentuseristhe
sameastheconnecteduser.
Whenexecutingastoredobject(suchasaprocedure,view,ortrigger)thatinitiatesadatabaselink,
CURRENT_USERistheusernamethatownsthestoredobject,andnottheusernamethatcalledthe
object.Forexample,ifthedatabaselinkappearsinsideprocedurescott.p(createdbyscott),anduser
janecallsprocedurescott.p,thecurrentuserisscott.
However,ifthestoredobjectisaninvokerrightsfunction,procedure,orpackage,theinvoker's
authorizationIDisusedtoconnectasaremoteuser.Forexample,iftheprivilegeddatabaselink
appearsinsideprocedurescott.p(aninvokerrightsprocedurecreatedbyscott),anduserJanecalls
procedurescott.p,thenCURRENT_USERisjaneandtheprocedureexecuteswithJane'sprivileges.
userIDENTIFIEDBYpassword:Specifytheusernameandpasswordusedtoconnecttotheremote
databaseusingafixeduserdatabaselink.Ifyouomitthisclause,thedatabaselinkusestheusername
andpasswordofeachuserwhoisconnectedtothedatabase.Thisiscalledaconnecteduserdatabase
link.
dblink_authentication
Specifytheusernameandpasswordonthetargetinstance.Thisclauseauthenticatestheusertothe
remoteserverandisrequiredforsecurity.Thespecifiedusernameandpasswordmustbeavalid
usernameandpasswordontheremoteinstance.Theusernameandpasswordareusedonlyfor
authentication.Nootheroperationsareperformedonbehalfofthisuser.
YoumustspecifythisclausewhenusingtheSHAREDclause.
USING'connectstring':Specifytheservicenameofaremotedatabase.Ifyouspecifyonlythedatabase
name,thenOracleDatabaseimplicitlyappendsthedatabasedomaintotheconnectstringtocreatea
completeservicename.Therefore,ifthedatabasedomainoftheremotedatabaseisdifferentfromthatof
thecurrentdatabase,thenyoumustspecifythecompleteservicename.
3.5.1.1

Examples

Theexamplesthatfollowassumetwodatabases,onewiththedatabasenamelocalandtheotherwith
thedatabasenameremote.TheexamplesusetheOracleDatabasedomain.Yourdatabasedomainwill
bedifferent.
DefiningaPublicDatabaseLink:Example
Thefollowingstatementdefinesasharedpublicdatabaselinknamedremotethatreferstothedatabase
specifiedbytheservicenameremote:
CREATE PUBLIC DATABASE LINK remote
USING 'remote';

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina16/40

Thisdatabaselinkallowsuserhronthelocaldatabasetoupdateatableontheremotedatabase
(assuminghrhasappropriateprivileges):
UPDATE employees@remote
SET salary=salary*1.1
WHERE last_name = 'Baer';

DefiningaFixedUserDatabaseLink:Example
Inthefollowingstatement,userhrontheremotedatabasedefinesafixeduserdatabaselinknamed
localtothehrschemaonthelocaldatabase:
CREATE DATABASE LINK local
CONNECT TO hr IDENTIFIED BY hr
USING 'local';

Oncethisdatabaselinkiscreated,hrcanquerytablesintheschemahronthelocaldatabaseinthis
manner:SELECT * FROM employees@local;
UserhrcanalsouseDMLstatementstomodifydataonthelocaldatabase:
INSERT INTO employees@local
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', SYSDATE, 'SH_CLERK');
UPDATE jobs@local SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM employees@local
WHERE employee_id = 999;

Usingthisfixeddatabaselink,userhrontheremotedatabasecanalsoaccesstablesownedbyother
usersonthesamedatabase.ThisstatementassumesthatuserhrhasSELECTprivilegesonthe
oe.customerstable.Thestatementconnectstotheuserhronthelocaldatabaseandthenqueriesthe
oe.customerstable:
SELECT * FROM oe.customers@local;

DefiningaCURRENT_USERDatabaseLink:Example
Thefollowingstatementdefinesacurrentuserdatabaselinktotheremotedatabase,usingtheentire
servicenameasthelinkname:
CREATE DATABASE LINK remote.us.oracle.com
CONNECT TO CURRENT_USER
USING 'remote';

TheuserwhoissuesthisstatementmustbeaglobaluserregisteredwiththeLDAPdirectoryservice.
Youcancreateasynonymtohidethefactthataparticulartableisontheremotedatabase.The
followingstatementcausesallfuturereferencestoemp_tabletoaccesstheemployeestableownedbyhr
ontheremotedatabase:
CREATE SYNONYM emp_table
FOR oe.employees@remote.us.oracle.com;

3.5.2

Eliminacin

DROP [ PUBLIC ] DATABASE LINK dblink

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina17/40

4 PL/SQLbsico
4.1 Introduccin
ElPL/SQLesunlenguajedeprogramacindeOracle,quepermitequeelcdigoseaejecutadoenel
servidorOraclemismo.Paracdigosquenecesitanmuchasmanipulacionesdedatos,elPL/SQLesmuy
eficienteyaqueseejecutalocalmente,conaccesodirectoalosdatos.
ElPL/SQLnoesCASESENSITIVE,esdecir,nodiferenciamaysculasdeminsculascomootros
lenguajesdeprogramacincomoCoJava.SinembargodebemosrecordarqueORACLEesCASE
SENSITIVEenlabsquedasdetexto(hastalaversin10.2R2quelopermitemediantenuevasvalores
paravariablesNLS_SORTyNLS_COMP).
LasinstructionesPL/SQLterminanconunpuntocoma(;),exceptoalgunasinstruccionesconBEGIN,
DECLARE,etc..
Loscomentariosdeunalneaseinicianconylosdevariaslneasiniciancon/*yterminancon*/
EstecaptuloestaengranpartebasadosobreelcursodePL/SQLdisponibleen
http://www.devjoker.com/contenidos/TutorialPLSQL/66/SQLDinamico.aspx

4.2 BloqueannimoPL/SQL
UnbloquePL/SQLesunconjuntodeinstruccionesPL/SQLrelacionadasentreellas.
UnsimplebloquePL/SQLiniciaconBEGINyterminaconEND;
Ejemplo:
SET SERVEROUTPUT ON;
BEGIN
dbms_output.put_line('Hola');
END;
/

4.3 Identificadores
UnidentificadoreselnombredeunobjetoPL/SQL,comoporejemplounaconstante,variable,excepcin,
paquete,funcin,procedimiento,tabla,cursor,...
Unidentificadorpuedetenerhasta30caracteres,debeiniciarconunaletra.

4.4 Variables
LasvariablessedeclaranantesdelapalabraBEGIN,yseprecedendelapalabraDECLARE.
Lasintaxises:nombre_de_variable[CONSTANT]tipo[NOTNULL][DEFAULTvalor_por_defecto];
4.4.1

Tiposdevariables

LostiposdevariablesquesepuedenusarenPL/SQLsonbsicamentelosmismosqueseusanpara
definircamposenunatabla,plusalgunosespecficosdelPL/SQL.
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina18/40

PLS_INTEGER:tiponumricodelPL/SQL,equivalenteaNUMBER,peromseficientesisenecesita
hacerclculosaritmticos.
%TYPE:refieredemaneradinmicaaotroobjeto.
4.4.2

Variableslocales

Pordefecto,unavariablesoloestdisponibleenelbloquePL/SQLdondeseencuentra,ylossubbloques
dentrodeestebloque.
Ejemplo:
DECLARE
v_cnt_emp number;
BEGIN
select count(*) into v_cnt_emp
from scott.emp
where sal>1000;
BEGIN
dbms_output.put_line ('Empleados con salario>1000 : '||v_cnt_emp);
END;
END;
/

4.4.3

Variablesglobales

Lasvariablesglobalessonvariablesquesepuedenllamardesdeotrocdigo.Soloestndisponiblesen
paquetes.

4.5 Controldeflujo
SeusaelIF..ELSIF..ELSEparacontrolarelflujoenPL/SQL.
IF(expresion)THEN
Instrucciones
ELSIF(expresion)THEN
Instrucciones
ELSE
Instrucciones
ENDIF;
Ejemplo:
DECLARE
v_cnt_emp number;
v_tot_emp number;
BEGIN
select count(*) into v_tot_emp
from scott.emp;
dbms_output.put_line ('Hay un total de '||v_tot_emp||' empleados.');
select count(*) into v_cnt_emp
from scott.emp
where sal>1000;
dbms_output.put_line ('Hay '||v_cnt_emp||' empleados que ganan mas de 1000 $.');
dbms_output.put_line ('Resultado de la analisis.');
IF (v_tot_emp=v_cnt_emp) then
dbms_output.put_line ('Los empleados ganan todos mas de 1000 $');
ELSIF (v_tot_emp<v_cnt_emp*2) then
dbms_output.put_line ('Mas de la mitad empleados ganan todos mas de 1000 $');
ELSE
dbms_output.put_line ('Menos de la mitad empleados ganan todos mas de 1000 $');

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina19/40

END IF;
END;
/

4.6 Bucles
Unabuclepermiterepetirunaaccinunsinnmerodeveces.Hayquetenercuidadoennocrearbucles
infinitas.
EnPL/SQLtenemosanuestradisposicinlossiguientesiteradoresobucles:
*LOOP
*WHILE
*FOR
4.6.1

LOOP

ElbucleLOOP,serepitetantasvecescomoseanecesariohastaquesefuerzasusalidaconlainstruccin
EXIT.Susintaxiseslasiguiente
LOOP
Instrucciones
IF(expresion)THEN
Instrucciones
EXIT;
ENDIF;

ENDLOOP;
Ejemplo:
DECLARE
v_cnt PLS_INTEGER DEFAULT 0;
BEGIN
LOOP
v_cnt:=v_cnt+1;
dbms_output.put_line ('Contador = '||v_cnt);
IF (v_cnt>=10) then
dbms_output.put_line ('Ya merito!');
exit;
END IF;
END LOOP;
END;

4.6.2

WHILE

ElbucleWHILE,serepitemientrasquesecumplaexpresion.
WHILE(expresion)LOOP
Instrucciones
ENDLOOP;
Ejemplo:
DECLARE
v_cnt PLS_INTEGER DEFAULT 0;
BEGIN
v_cnt:=10;
WHILE (v_cnt>0) LOOP
dbms_output.put_line ('Contador = '||v_cnt);
v_cnt:=v_cnt-1;
END LOOP;
END;

4.6.3

FOR

ElbucleFOR,serepitetantavecescomoleindiquemosenlosidentificadoresinicioyfinal.
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina20/40

FORcontadorIN[REVERSE]inicio..finalLOOP
Instrucciones
ENDLOOP;

EnelcasodeespecificarREVERSEelbucleserecorreensentidoinverso.
Ejemplo:

DECLARE
v_cnt PLS_INTEGER DEFAULT 0;
BEGIN
FOR v_cnt IN REVERSE 1..10 LOOP
dbms_output.put_line ('Contador = '||v_cnt);
END LOOP;
END;

4.7 Cursores
PL/SQLutilizacursoresparagestionarlasinstruccionesSELECT.Uncursoresunconjuntoderegistros
devueltoporunainstruccinSQL.Tcnicamenteloscursoressonfragmentosdememoriaquereservados
paraprocesarlosresultadosdeunaconsultaSELECT.
Podemosdistinguirdostiposdecursores:
*Cursoresimplicitos.EstetipodecursoresseutilizaparaoperacionesSELECTINTO.Seusan
cuandolaconsultadevuelveunnicoregistro.
*Cursoresexplicitos.Sonloscursoresquesondeclaradosycontroladosporelprogramador.Se
utilizancuandolaconsultadevuelveunconjuntoderegistros.Ocasionalmentetambinseutilizanen
consultasquedevuelvenunnicoregistroporrazonesdeeficiencia.Sonmsrpidos.
UncursorsedefinecomocualquierotravariabledePL/SQLydebenombrarsedeacuerdoalosmismos
conveniosquecualquierotravariable.Loscursoresimplicitosnonecesitandeclaracin.
ParaprocesarinstruccionesSELECTquedevuelvanmsdeunafila,sonnecesarioscursoresexplicitos
combinadosconunestructuradebloque.
Uncursoradmiteelusodeparmetros.Losparmetrosdebendeclararsejuntoconelcursor.
ElsiguientediagramarepresentacomoseprocesaunainstruccinSQLatravsdeuncursor.

Ejemplodecursorexplicito:
DECLARE
CURSOR c_emp IS /*CURSOR*/
select ename, sal from scott.emp;
BEGIN
FOR fila IN c_emp LOOP
/*no es necesario definir la variable fila, ser de tipo %ROW */
dbms_output.put_line(fila.ename||' tiene un salario de '||fila.sal);
END LOOP;

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina21/40

END;

Ejemplodecursorimplicito:

DECLARE
v_sal NUMBER;
BEGIN
SELECT sal INTO v_sal FROM scott.emp WHERE empno=7369;
dbms_output.put_line('El empleado numero 7369 tiene un salario de '||v_sal||' $');
end;

4.8 Excepciones
EnPL/SQLunaadvertenciaocondicindeerroresllamadaunaexcepcin.
Losbloquesdeexcepcionespermitenatraparerroresdeejecucinydarleseventualmenteun
tratamientoparaevitarquesepareelprogramademaneraanormal.
Lasexcepcionessecontrolandentrodesupropiobloque.Laestructuradebloquedeunaexcepcinse
muestraacontinuacin.
DECLARE
Declaraciones
BEGIN
Ejecucion
EXCEPTION
Excepcion
END;
Cuandoocurreunerror,seejecutalaporcindelprogramamarcadaporelbloqueEXCEPTION,
transfirindoseelcontrolaesebloquedesentencias.
ElsiguienteejemplomuestraunbloquedeexcepcionesquecapturalasexcepcionesNO_DATA_FOUND
yZERO_DIVIDE.CualquierotraexcepcionsercapturadaenelbloqueWHENOTHERSTHEN.
DECLARE
Declaraciones
BEGIN
Ejecucion
EXCEPTION
WHENNO_DATA_FOUNDTHEN
SeejecutacuandoocurreunaexcepciondetipoNO_DATA_FOUND
WHENZERO_DIVIDETHEN
SeejecutacuandoocurreunaexcepciondetipoZERO_DIVIDE
WHENOTHERSTHEN
Seejecutacuandoocurreunaexcepciondeuntiponotratado
enlosbloquesanteriores
END;
Comoyahemosdichocuandoocurreunerror,seejecutaelbloqueEXCEPTION,transfirindoseel
controlalassentenciasdelbloque.UnavezfinalizadalaejecucindelbloquedeEXCEPTIONnose
continuaejecutandoelbloqueanterior.
Siexisteunbloquedeexcepcinapropiadoparaeltipodeexcepcinseejecutadichobloque.Sinoexiste
unbloquedecontroldeexcepcionesadecuadoaltipodeexcepcinseejecutarelbloquedeexcepcin
WHENOTHERSTHEN(siexiste!).WHENOTHERSdebeserelltimomanejadordeexcepciones.
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina22/40

Lasexcepcionespuedenserdefinidasenformainternaoexplcitamenteporelusuario.Ejemplosde
excepcionesdefinidasenformainternasonladivisinporceroylafaltadememoriaentiempode
ejecucin.Estasmismascondicionesexcepcionalestienensuspropiotiposypuedenserreferenciadaspor
ellos:ZERO_DIVIDEySTORAGE_ERROR.
Lasexcepcionesdefinidasporelusuariodebenseralcanzadasexplcitamenteutilizandolasentencia
RAISE.
Conlasexcepcionessepuedenmanejarloserrorescmodamentesinnecesidaddemantenermltiples
chequeosporcadasentenciaescrita.Tambinproveeclaridadenelcdigoyaquepermitemantenerlas
rutinascorrespondientesaltratamientodeloserroresdeformaseparadadelalgicadelnegocio.
4.8.1

Excepcionespredefinidas

PL/SQLproporcionaungrannmerodeexcepcionespredefinidasquepermitencontrolarlascondiciones
deerrormshabituales.
Lasexcepcionespredefinidasnonecesitanserdeclaradas.Simplementeseutilizancuandoestasson
lanzadasporalgnerrordeterminado.
4.8.1.1

Excepcionesasociadasaloscursoresimplcitos.

Loscursoresimplicitosslopuedendevolverunafila,porloquepuedenproducirsedeterminadas
excepciones.Lasmscomunesquesepuedenencontrarsonno_data_foundytoo_many_rows.La
siguientetablaexplicabrevementeestasexcepciones.
NO_DATA_FOUND SeproducecuandounasentenciaSELECTintentarecuperardatosperoninguna
filasatisfacesuscondiciones.Esdecir,cuando"nohaydatos"
TOO_MANY_ROWS Dadoquecadacursorimplicitosloescapazderecuperarunafila,estaexcepcion
detectalaexistenciademsdeunafila.
Ejemplo:

DECLARE
v_sal NUMBER;
BEGIN
BEGIN
SELECT sal INTO v_sal FROM scott.emp WHERE empno=1;
dbms_output.put_line('El empleado numero 1 tiene un salario de '||v_sal||' $');
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('El empleado numero 1 no existe!');
END;
BEGIN
SELECT empno INTO v_sal FROM scott.emp WHERE sal>1000;
dbms_output.put_line('El empleado que tiene un salario>1000 $ es el empleado numero'||v_sal);
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line('HAY MAS DE UN EMPLEADO QUE GANA MAS DE 1000 $!');
END;
END;

4.8.1.2

Listadeexcepcionespredefinidas

ACCESS_INTO_NULL
inicializado
6530
COLLECTION_IS_NULL
inicializada 6531

CopyrightCdricSimon,2008

Elprogramaintentasignarvaloresalosatributosdeunobjetono
Elprogramaintentasignarvaloresaunatablaanidadaanno

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina23/40

CURSOR_ALREADY_OPEN Elprogramaintentabriruncursorqueyaseencontrabaabierto.
RecuerdequeuncursordecicloFORautomticamenteloabreyellonosedebeespecificarconla
sentenciaOPEN
6511
DUP_VAL_ON_INDEX
Elprogramaintentalmacenarvaloresduplicadosenunacolumnaquese
mantieneconrestriccindeintegridaddeunndicenico(uniqueindex)
1
INVALID_CURSOR Elprogramaintentefectuarunaoperacinnovlidasobreuncursor

1001
INVALID_NUMBER EnunasentenciaSQL,laconversindeunacadenadecaractereshaciaun
nmerofallacuandoesacadenanorepresentaunnmerovlido
1722
LOGIN_DENIED
ElprogramaintentconectarseaOracleconunnombredeusuarioopassword
invlido
1017
NO_DATA_FOUND UnasentenciaSELECTINTOnodevolvivaloresoelprogramareferenciun
elementonoinicializadoenunatablaindexada
100
NOT_LOGGED_ON ElprogramaefectuunallamadaaOraclesinestarconectado
1012
PROGRAM_ERROR PL/SQLtieneunproblemainterno 6501
ROWTYPE_MISMATCH
Loselementosdeunaasignacin(elvaloraasignarylavariablequelo
contendr)tienentiposincompatibles.Tambinsepresentaesteerrorcuandounparmetropasadoaun
subprogramanoesdeltipoesperado 6504
SELF_IS_NULL
ElparmetroSELF(elprimeroqueespasadoaunmtodoMEMBER)esnulo
30625
STORAGE_ERROR Lamemoriaseterminoestcorrupta
6500
SUBSCRIPT_BEYOND_COUNT
Elprogramaesttratandodereferenciarunelementodeun
arregloindexadoqueseencuentraenunaposicinmsgrandequeelnmerorealdeelementosdela
coleccin
6533
SUBSCRIPT_OUTSIDE_LIMIT
Elprogramaestreferenciandounelementodeunarreglo
utilizandounnmerofueradelrangopermitido(porejemplo,elelemento1)
6532
SYS_INVALID_ROWID
Laconversindeunacadenadecaractereshaciauntiporowidfall
porquelacadenanorepresentaunnmero 1410
TIMEOUT_ON_RESOURCE SeexcedieltiempomximodeesperaporunrecursoenOracle
51
TOO_MANY_ROWS UnasentenciaSELECTINTOdevuelvemsdeunafila
1422
VALUE_ERROR
Ocurriunerroraritmtico,deconversinotruncamiento.Porejemplo,sucede
cuandoseintentacalzarunvalormuygrandedentrodeunavariablemspequea 6502
ZERO_DIVIDE
Elprogramaintentefectuarunadivisinporcero 1476

4.8.2

Excepcionesdefinidasporelusuario

PL/SQLpermitealusuariodefinirsuspropiasexcepciones,lasquedebernserdeclaradasylanzadas
explcitamenteutilizandolasentenciaRAISE.
LasexcepcionesdebenserdeclaradasenelsegmentoDECLAREdeunbloque,subprogramaopaquete.
Sedeclaraunaexcepcincomocualquierotravariable,asignandoleeltipoEXCEPTION.Lasmismas
reglasdealcanceaplicantantosobrevariablescomosobrelasexcepciones.
DECLARE
Declaraciones
MyExcepcionEXCEPTION;
BEGIN
Ejecucion
EXCEPTION
Excepcion
END;
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

4.8.2.1

Pagina24/40

ReglasdeAlcance

Unaexcepcionesvlidadentrodesuambitodealcance,esdecirelbloqueoprogramadondehasido
declarada.Lasexcepcionespredefinidassonsiemprevlidas.
Comolasvariables,unaexcepcindeclaradaenunbloqueeslocalaesebloqueyglobalatodoslossub
bloquesquecomprende.
4.8.2.2

LasentenciaRAISE

LasentenciaRAISEpermitelanzarunaexcepcinenformaexplcita.Esposibleutilizarestasentencia
encualquierlugarqueseencuentredentrodelalcancedelaexcepcin.
DECLARE
DeclaramosunaexcepcionidentificadaporVALOR_NEGATIVO
VALOR_NEGATIVOEXCEPTION;
valorNUMBER;
BEGIN
Ejecucion
valor:=1;
IFvalor<0THEN
RAISEVALOR_NEGATIVO;
ENDIF;
EXCEPTION
Excepcion
WHENVALOR_NEGATIVOTHEN
dbms_output.put_line('Elvalornopuedesernegativo');
END;
ConlasentenciaRAISEpodemoslanzarunaexcepcindefinidaporelusuarioopredefinida,siendoel
comportamientohabituallanzarexcepcionesdefinidasporelusuario.
RecordarlaexistenciadelaexcepcinOTHERS,quesimbolizacualquiercondicindeexcepcinqueno
hasidodeclarada.Seutilizacomnmenteparacontrolarcualquiertipodeerrorquenohasidoprevisto.
Enesecaso,escomnobservarlasentenciaROLLBACKenelgrupodesentenciasdelaexcepcino
algunadelasfuncionesSQLCODESQLERRM,quesedetallanenelprximopunto.
4.8.2.3

UsodeSQLCODEySQLERRM

AlmanejarunaexcepcinesposibleusarlasfuncionespredefinidasSQLCodeySQLERRMparaaclarar
alusuariolasituacindeerroracontecida.
SQLcodedevuelveelnmerodelerrordeOracleyun0(cero)encasodeexitoalejecutarseuna
sentenciaSQL.
Porotraparte,SQLERRMdevuelveelcorrespondientemensajedeerror.
Estasfuncionessonmuytilescuandoseutilizanenelbloquedeexcepciones,paraaclararelsignificado
delaexcepcinOTHERS.
EstasfuncionesnopuedenserutilizadasdirectamenteenunasentenciaSQL,perossepuedeasignar
suvaloraalgunavariabledeprogramayluegousarestaltimaenalgunasentencia.
DECLARE

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina25/40

err_num NUMBER;
err_msg VARCHAR2(255);
result NUMBER;
BEGIN
SELECT 1/0 INTO result
FROM DUAL;
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SQLERRM;
DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num));
DBMS_OUTPUT.put_line(err_msg);
END;

TambinesposibleentregarlealafuncinSQLERRMunnmeronegativoquerepresenteunerrorde
Oracleystadevolverelmensajeasociado.
DECLARE
msg VARCHAR2(255);
BEGIN
msg := SQLERRM(-1403);
DBMS_OUTPUT.put_line(MSG);
END;

4.8.3

RAISE_APPLICATION_ERROR

EnocasionesqueremosenviarunmensajedeerrorpersonalizadoalproducirseunaexcepcinPL/SQL.
ParaelloesnecesarioutilizarlainstruccionRAISE_APPLICATION_ERROR;
Lasintaxisgeneraleslasiguiente:
RAISE_APPLICATION_ERROR(<error_num>,<mensaje>);
Siendo:
*error_numesunenteronegativocomprendidoentre20001y20999
*mensajeladescripciondelerror
Ejemplo:
DECLARE

v_div NUMBER;
BEGIN
SELECT 1/0 INTO v_div FROM DUAL;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'No se puede dividir por cero');
END;

4.9 Procedimientos,funciones,paquetes,disparadores
SonobjetosPL/SQLresidentesenelservidorPL/SQL.
4.9.1

Funciones

Unafuncinesuncdigocompiladosenelservidor,queseejecutanenlocal,yquepuedenaceptar
parmetrosdeentradaytieneunsoloparmetrodesalido.UnafuncinSIEMPREdeberegresarun
valor.
UnafuncinsepuedeusarenotrocdigoPL/SQL,oenSQLyaseaenunSELECT,unaclausula
WHERE,CONNECTBY,STARTWITH,ORDERBY,GROUPBY,comoVALUESenunINSERT,o
comoSETenunUPDATE.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

4.9.1.1

Pagina26/40

Funcionespredefinidas

PL/SQLtieneungrannmerodefuncionesincorporadas,sumamentetiles.Acontinuacinvamosa
veralgunasdelasmsutilizadas.
SYSDATE
Devuelvelafechadelsistema:
SELECTSYSDATEFROMDUAL;
NVL
DevuelveelvalorrecibidocomoparmetroenelcasodequeexpresinseaNULL,oexpresinencaso
contrario.
NVL(<expresion>,<valor>)
Elsiguienteejemplodevuelve0sielprecioesnulo,yelpreciocuandoestinformado:
SELECTCO_PRODUCTO,NVL(PRECIO,0)FROMPRECIOS;
DECODE
Decodeproporcionalafuncionalidaddeunasentenciadecontroldeflujoifelseifelse.
DECODE(<expr>,<cond1>,<val1>[,...,<condN>,<valN>],<default>)
Estafuncinevalaunaexpresin"<expr>",sisecumplelaprimeracondicin"<cond1>"devuelveel
valor1"<val1>",encasocontrarioevalalasiguientecondicinyashastaqueunadelascondicionesse
cumpla.Sinosecumpleningunacondicinsedevuelveelvalorpordefecto.
EsmuycomnescribirlafuncinDECODEidentadacomosisetratasedeunbloqueIF.
SELECTDECODE(co_pais,/*Expresionaevaluar*/
'ESP','ESPAA',/*Sico_pais='ESP'==>'ESPAA'*/
'MEX','MEXICO',/*Sico_pais='MEX'==>'MEXICO'*/
'PAIS'||co_pais)/*ELSE==>concatena*/
FROMPAISES;
TO_DATE
Convierteunaexpresinaltipofecha.Elparmetroopcionalformatoindicaelformatodeentradade
laexpresinnoeldesalida.
TO_DATE(<expresion>,[<formato>])
Enesteejemploconvertimoslaexpresion'01/12/2006'detipoCHARaunafecha(tipoDATE).Conel
parmetroformatoleindicamosquelafechaestescritacomodamesaoparaquedevuelveelunode
diciembreynoeldocedeenero.
SELECTTO_DATE('01/12/2006',
'DD/MM/YYYY')
FROMDUAL;
Esteotroejemplomuestralaconversinconformatodedayhora.
SELECTTO_DATE('31/12/200623:59:59',

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina27/40

'DD/MM/YYYYHH24:MI:SS')
FROMDUAL;
TO_CHAR
ConvierteunaexpresinaltipoCHAR.Elparmetroopcionalformatoindicaelformatodesalidade
laexpresin.
TO_CHAR(<expresion>,[<formato>])
SELECTTO_CHAR(SYSDATE,'DD/MM/YYYYY')
FROMDUAL;
TO_NUMBER
Convierteunaexpresionalfanumricaennumerica.Opcionalmentepodemosespecificarelformatode
salida.
TO_NUMBER(<expresion>,[<formato>])
SELECTTO_NUMBER('10')
FROMDUAL;
TRUNC
Truncaunafechaonmero.
Sielparmetrorecibidoesunafechaeliminalashoras,minutosysegundosdelamisma.
SELECTTRUNC(SYSDATE)FROMDUAL;
Sielparmetroesunnmerodevuelvelaparteentera.
SELECTTRUNC(9.99)FROMDUAL;
LENGTH
DevuelvelalongituddeuntipoCHAR.
SELECTLENGTH('HOLAMUNDO')FROMDUAL;
INSTR
Buscaunacadenadecaracteresdentrodeotra.Devuelvelaposiciondelaocurrenciadelacadena
buscada.
Susintaxiseslasiguiente:INSTR(<char>,<search_string>,<startpos>,<occurrence>)
SELECTINSTR('AQUIESDONDESEBUSCA','BUSCA',1,1)
FROMDUAL;
REPLACE
Reemplazauntextoporotroenunexpresiondebusqueda.
REPLACE(<expresion>,<busqueda>,<reemplazo>)
Elsiguienteejemploreemplazalapalabra'HOLA'por'VAYA'enlacadena'HOLAMUNDO'.
SELECTREPLACE('HOLAMUNDO','HOLA','VAYA')devuelveVAYAMUNDO
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina28/40

FROMDUAL;
SUBSTR
Obtieneunapartedeunaexpresion,desdeunaposicindeiniciohastaunadeterminadalongitud.
SUBSTR(<expresion>,<posicion_ini>,<longitud>)
SELECTSUBSTR('HOLAMUNDO',6,5)DevuelveMUNDO
FROMDUAL;
UPPER
Convierteunaexpresionalfanumericaamaysculas.
SELECTUPPER('holamundo')DevuelveHOLAMUNDO
FROMDUAL;
LOWER
Convierteunaexpresionalfanumericaaminsculas.
SELECTLOWER('HOLAMUNDO')Devuelveholamundo
FROMDUAL;
ROWIDTOCHAR
ConvierteunROWIDatipocaracter.
SELECTROWIDTOCHAR(ROWID)
FROMDUAL;
RPAD
AadeNvecesunadeterminadacadenadecaracteresaladerechaunaexpresin.Muyutilpara
generarficherosdetextodeanchofijo.
RPAD(<expresion>,<longitud>,<pad_string>)
Elsiguienteejemploaadepuntosalaexpresion'Holamundo'hastaalcanzarunalongitudde50
caracteres.
SELECTRPAD('HolaMundo',50,'.')
FROMDUAL;
LPAD
AadeNvecesunadeterminadacadenadecaracteresalaizquierdadeunaexpresin.Muyutilpara
generarficherosdetextodeanchofijo.
LPAD(<expresion>,<longitud>,<pad_string>)
Elsiguienteejemploaadepuntosalaexpresion'Holamundo'hastaalcanzarunalongitudde50
caracteres.
SELECTLPAD('HolaMundo',50,'.')
FROMDUAL;
RTRIM
Eliminalosespaciosenblancoaladerechadeunaexpresion
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina29/40

SELECTRTRIM('HolaMundo')
FROMDUAL;
LTRIM
Eliminalosespaciosenblancoalaizquierdadeunaexpresion
SELECTLTRIM('HolaMundo')
FROMDUAL;
TRIM
Eliminalosespaciosenblancoalaizquierdayderechadeunaexpresion
SELECTTRIM('HolaMundo')
FROMDUAL;
MOD
Devuelveelrestodeladivisinenteraentredosnmeros.
MOD(<dividendo>,<divisor>)
SELECTMOD(20,15)Devuelveelmodulodedividir20/15
FROMDUAL
4.9.1.2

Funcionesdefinidasporelusuario

Lasintaxisparaconstruirfuncioneseslasiguiente:
CREATE[ORREPLACE]
FUNCTION<fn_name>[(<param1>IN<type>,<param2>IN<type>,...)]
RETURN<return_type>
IS
result<return_type>;
BEGIN
return(result);
[EXCEPTION]
Sentenciascontroldeexcepcion
END[<fn_name>];
ElusodeORREPLACEpermitesobreescribirunafuncinexistente.Siseomite,ylafuncinexiste,se
producir,unerror.
Lasintaxisdelosparmetroseslamismaqueenlosprocedimientosalmacenado,exceptuandoque
solopuedenserdeentrada.
Ejemplo:
create table emp as select * from scott.emp;
CREATE OR REPLACE
FUNCTION fn_Obtener_Salario(p_empno NUMBER)
RETURN NUMBER
IS
result NUMBER;
BEGIN
SELECT sal INTO result
FROM emp
WHERE empno = p_empno;
return(result);
EXCEPTION
WHEN NO_DATA_FOUND THEN
return 0;

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina30/40

END ;

Sielsistemanosindicaqueellafuncinsehacreadoconerroresdecompilacinpodemosverestos
erroresdecompilacionconlaordenSHOWERRORSenSQL*Plus.
LasfuncionespuedenutilizarseensentenciasSQLdemanipulacindedatos(SELECT,UPDATE,
INSERTyDELETE):
SELECT

empno, ename,
fn_Obtener_Salario( empno)
FROM scott.emp;

4.9.2

Procedimientos

Losprocedimientossoncdigoscompiladosenelservidor,queseejecutanenelservidor,yquepueden
aceptarparmetrosdeentraday/odesalida.Unprocedimientosepuedeusarenunselect,peronoenun
whereclause.
Unprocedimientotieneunnombre,unconjuntodeparmetros(opcional)yunbloquedecdigo.
Lasintaxisdeunprocedimientoalmacenadoeslasiguiente:
CREATE[ORREPLACE]
PROCEDURE<procedure_name>[(<param1>[IN|OUT|INOUT]<type>,
<param2>[IN|OUT|INOUT]<type>,...)]
IS
Declaraciondevariableslocales
BEGIN
Sentencias
[EXCEPTION]
Sentenciascontroldeexcepcion
END[<procedure_name>];
ElusodeORREPLACEpermitesobreescribirunprocedimientoexistente.Siseomite,yel
procedimientoexiste,seproducir,unerror.
Lasintaxisesmuyparecidaaladeunbloqueannimo,salvoporquesereemplazalaseccin
DECLAREporlasecuenciaPROCEDURE...ISenlaespecificacindelprocedimiento.
Debemosespecificareltipodedatosdecadaparmetro.Alespecificareltipodedatodelparmetrono
debemosespecificarlalongituddeltipo.
Losparmetrospuedenserdeentrada(IN),desalida(OUT)odeentradasalida(INOUT).Elvalor
pordefectoesIN,ysetomaesevalorencasodequenoespecifiquemosnada.
create or replace
PROCEDURE Actualiza_Salario(p_empno NUMBER,
p_new_salario NUMBER)
IS
-- Declaracion de variables locales
BEGIN
-- Sentencias
UPDATE emp
SET sal = p_new_salario,
hiredate = SYSDATE
WHERE empno = p_empno;

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina31/40

END Actualiza_Salario;

Tambinpodemosasignarunvalorpordefectoalosparmetros,utilizandolaclausulaDEFAULTo
eloperadordeasigancin(:=).
create or replace
PROCEDURE Actualiza_Salario(p_empno NUMBER,
p_new_salario NUMBER DEFAULT 500)
IS
...
END Actualiza_Salario;

Unavezcreadoycompiladoelprocedimientoalmacenadopodemosejecutarlo.Sielsistemanosindica
queelprocedimientosehacreadoconerroresdecompilacinpodemosverestoserroresdecompilacin
conlaordenSHOWERRORSenSQL*Plus.
Existendosformasdepasarargumentosaunprocedimientoalmacenadoalahoradeejecutarlo(en
realidadesvlidoparacualquiersubprograma).Estasson:
*Notacinposicional:Sepasanlosvaloresdelosparmetrosenelmismoordenenqueelprocedure
losdefine.
BEGIN
Actualiza_Salario(7369,2500);
COMMIT;
END;

*Notacinnominal:Sepasanlosvaloresencualquierordennombrandoexplicitamenteelparmetro.
BEGIN
Actualiza_Salario(p_empno => 7369,p_new_salario
COMMIT;
END;

4.9.3

=> 2500);

Paquetes

Unpaqueteesunconjuntodefuncionesy/oprocedimiento.Permitefacilitarlaadministracindelos
cdigos(agrupaciones),ylaseguridad(aniveldepaqueteenvezdeporfuncin/procedimiento).Enel
paquetesepuedendefinirvariabledealcancedetodoelpaquete(globalvariables).
Loprimeroquedebemostenerencuentaesquelospaquetesestnformadospordospartes:la
especificacinyelcuerpo.Laespecificacindelunpaqueteysucuerposecreanporseparado.
Laespecificacineslainterfazconlasaplicaciones.Enellaesposibledeclararlostipos,variables,
constantes,excepciones,cursoresysubprogramasdisponiblesparasuusoposteriordesdefueradel
paquete.
Enlaespecificacindelpaqueteslosedeclaranlosobjetos(procedures,funciones,variables...),nose
implementaelcdigo.Losobjetosdeclaradosenlaespecificacindelpaquetesonaccesiblesdesdefuera
delpaqueteporotroscriptdePL/SQLoprograma.
Paracrearlaespecificacindeunpaquetelasintaxisgeneraleslasiguiente:
CREATE[ORREPLACE]PACKAGE<pkgName>
IS
Declaracionesdetiposyregistrospblicas
{[TYPE<TypeName>IS<Datatype>;]}
Declaracionesdevariablesyconstantespublicas
Tambinpodemosdeclararcursores
{[<ConstantName>CONSTANT<Datatype>:=<valor>;]}
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina32/40

{[<VariableName><Datatype>;]}
Declaracionesdeprocedimientosyfuncionespblicas
{[FUNCTION<FunctionName>(<Parameter><Datatype>,...)
RETURN<Datatype>;]}
{[PROCEDURE<ProcedureName>(<Parameter><Datatype>,...);]}
END<pkgName>;
Elcuerpoeslaimplementacindelpaquete.Elcuerpodelpaquetedebeimplementarloquesedeclar
inicialmenteenlaespecificacin.Eseldondedebemosescribirelcdigodelossubprogramas.
Enelcuerpodeunpackagepodemosdeclararnuevossubprogramasytipos,peroestossernprivados
paraelpropiopackage.
Lasintaxisgeneralparacrearelcuerpodeunpaqueteesmuyparecidaaladelaespecificacin,tansolo
seaadelapalabraclaveBODY,yseimplementaelcdigodelossubprogramas.
CREATE[ORREPLACE]PACKAGEBODY<pkgName>
IS
Declaracionesdetiposyregistrosprivados
{[TYPE<TypeName>IS<Datatype>;]}
Declaracionesdevariablesyconstantesprivadas
Tambinpodemosdeclararcursores
{[<ConstantName>CONSTANT<Datatype>:=<valor>;]}
{[<VariableName><Datatype>;]}
Implementaciondeprocedimientosyfunciones
FUNCTION<FunctionName>(<Parameter><Datatype>,...)
RETURN<Datatype>
IS
Variableslocalesdelafuncion
BEGIN
Implementeaciondelafuncion
return(<Result>);
[EXCEPTION]
Controldeexcepciones
END;

PROCEDURE<ProcedureName>(<Parameter><Datatype>,...)
IS
Variableslocalesdelafuncion
BEGIN
Implementaciondeprocedimiento
[EXCEPTION]
Controldeexcepciones
END;
END<pkgName>;
Esposiblemodificarelcuerpodeunpaquetesinnecesidaddealterarporellolaespecificacindel
mismo.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina33/40

Lospaquetespuedenllegaraserprogramasmuycomplejosysuelenalmacenargranpartedelalgica
denegocio.
Ejemplo:

4.9.4

Disparadores

Losdisparadores(triggers).Undisparadoresuncodigoquedisparacadavezquesehamodificadoel
datodeunatabla.Puededispararaniveldelaconsulta,oaniveldecadalneaafectadaporlaconsulta.
tambinpuededispararantesodespusdelaconsulta,ysoloporciertostiposdeconsulta
(insert/update/delete),yeventualmentesolocuandocierto(s)campo(s)estanafectados(s).
UntriggeresunbloquePL/SQLasociadoaunatabla,queseejecutacomoconsecuenciadeuna
determinadainstruccinSQL(unaoperacinDML:INSERT,UPDATEoDELETE)sobredichatabla.
Lasintaxisparacrearuntriggereslasiguiente:
CREATE[ORREPLACE]TRIGGER<nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE[OFcol1,col2,...,colN]
[OR{DELETE|INSERT|UPDATE[OFcol1,col2,...,colN]...]}
ON<nombre_tabla>
[FOREACHROW[WHEN(<condicion>)]]
DECLARE
variableslocales
BEGIN
Sentencias
[EXCEPTION]
Sentenciascontroldeexcepcion
END<nombre_trigger>;
ElusodeORREPLACEpermitesobreescribiruntriggerexistente.Siseomite,yeltriggerexiste,se
producir,unerror.
LostriggerspuedendefinirseparalasoperacionesINSERT,UPDATEoDELETE,ypuedenejecutarse
antesodespusdelaoperacin.ElmodificadorBEFOREAFTERindicaqueeltriggerseejecutarantes
odespuesdeejecutarselasentenciaSQLdefinidaporDELETEINSERTUPDATE.Siincluimosel
modificadorOFeltriggersoloseejecutarcuandolasentenciaSQLafectealoscamposincluidosenla
lista.
Elalcancedelosdisparadorespuedeserlafilaodeorden.ElmodificadorFOREACHROWindicaqueel
triggersedispararcadavezqueserealizanoperacionessobreunafiladelatabla.Siseacompaadel
modificadorWHEN,seestableceunarestriccin;eltriggersoloactuar,sobrelasfilasquesatisfaganla
restriccin.
Lasiguientetablaresumeloscontenidosanteriores.
INSERT,DELETE,UPDATE DefinequtipodeordenDMLprovocalaactivacindeldisparador.
BEFORE,AFTER
Definesieldisparadorseactivaantesodespusdequeseejecutelaorden.

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina34/40

FOREACHROW
Losdisparadoresconniveldefilaseactivanunavezporcadafilaafectadaporla
ordenqueprovoceldisparo.Losdisparadoresconniveldeordenseactivanslounavez,anteso
despusdelaorden.LosdisparadoresconniveldefilaseidentificanporlaclusulaFOREACHROWen
ladefinicindeldisparador.
LaclusulaWHENsloesvlidaparalosdisparadoresconniveldefila.
DentrodelambitodeuntriggerdisponemosdelasvariablesOLDyNEW.Estasvariablesseutilizan
delmismomodoquecualquierotravariablePL/SQL,conlasalvedaddequenoesnecesariodeclararlas,
sondetipo%ROWTYPEycontienenunacopiadelregistroantes(OLD)ydespues(NEW)delaaccin
SQL(INSERT,UPDATE,DELTE)quehaejecutadoeltrigger.Utilizandoestavariablepodemosacceder
alosdatosqueseestninsertando,actualizandooborrando.
ElsiguienteejemplomuestrauntriggerqueinsertaunregistroenlatablaEMP_AUDITcadavezque
modificamoselsalariodeunregistroenlatablaemp:
Create table emp_audit (empno number not null, fecha date not null, msg varchar2(500) not null);
create or replace TRIGGER TR_EMP_AU
AFTER UPDATE ON EMP
FOR EACH ROW
WHEN (OLD.sal<>NEW.sal)
DECLARE
-- local variables
BEGIN
INSERT INTO emp_audit
(empno,fecha,msg)
VALUES
(:NEW.empno,SYSDATE,'Salario modificado de '||:old.sal||' a '||:new.sal);
END ;

EltriggerseejecutarcuandosobrelatablaEMPseejecuteunasentenciaUPDATEquemodificael
salario.
Ejemplo:
BEGIN

Actualiza_Salario(p_empno => 7369,p_new_salario


COMMIT;
END;

4.9.4.1

=> 2500);

Ordendeejecucindelostriggers

Unamismatablapuedetenervariostriggers.Entalcasoesnecesarioconocerelordenenelquesevana
ejecutar.
LosdisparadoresseactivanalejecutarselasentenciaSQL.
*Siexiste,seejecutaeldisparadordetipoBEFORE(disparadorprevio)conniveldeorden.
*Paracadafilaalaqueafectelaorden:
oSeejecutasiexiste,eldisparadordetipoBEFOREconniveldefila.
oSeejecutalapropiaorden.
oSeejecutasiexiste,eldisparadordetipoAFTER(disparadorposterior)conniveldefila.
*Seejecuta,siexiste,eldisparadordetipoAFTERconniveldeorden.
4.9.4.2

Restriccionesdelostriggers

ElcuerpodeuntriggeresunbloquePL/SQL.CualquierordenquesealegalenunbloquePL/SQL,es
legalenelcuerpodeundisparador,conlassiguientesrestricciones:

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina35/40

*Undisparadornopuedeemitirningunaordendecontroldetransacciones:COMMIT,ROLLBACKo
SAVEPOINT.Eldisparadorseactivacomopartedelaejecucindelaordenqueprovoceldisparo,y
formapartedelamismatransaccinquedichaorden.Cuandolaordenqueprovocaeldisparoes
confirmadaocancelada,seconfirmaocancelatambineltrabajorealizadoporeldisparador.
*Porrazonesidnticas,ningnprocedimientoofuncinllamadoporeldisparadorpuedeemitir
rdenesdecontroldetransacciones.
*ElcuerpodeldisparadornopuedecontenerningunadeclaracindevariablesLONGoLONGRAW
4.9.4.3

Utilizacinde:OLDy:NEW

DentrodelambitodeuntriggerdisponemosdelasvariablesOLDyNEW.Estasvariablesseutilizan
delmismomodoquecualquierotravariablePL/SQL,conlasalvedaddequenoesnecesariodeclararlas,
sondetipo%ROWTYPEycontienenunacopiadelregistroantes(OLD)ydespues(NEW)delaaccin
SQL(INSERT,UPDATE,DELTE)quehaejecutadoeltrigger.Utilizandoestavariablepodemosacceder
alosdatosqueseestninsertando,actualizandooborrando.
LasiguientetablamuestralosvaloresdeOLDyNEW.
ACCIONSQL
OLD
NEW
INSERT

Nodefinido;todosloscampostomanvalorNULL.
Valoresqueserninsertadoscuandosecompletelaorden.
UPDATE

Valoresoriginalesdelafila,antesdelaactualizacin.
Nuevosvaloresquesernescritoscuandosecompletelaorden.
DELETE

Valores,antesdelborradodelafila.
Nodefinidos;todosloscampostomanelvalorNULL.
LosregistrosOLDyNEWsonslovlidosdentrodelosdisparadoresconniveldefila.
PodemosusarOLDyNEWcomocualquierotravariablePL/SQL.
Utilizacindepredicadosdelostriggers:INSERTING,UPDATINGyDELETING
DentrodeundisparadorenelquesedisparandistintostiposderdenesDML(INSERT,UPDATEy
DELETE),haytresfuncionesbooleanasquepuedenemplearseparadeterminardequoperacinse
trata.EstospredicadossonINSERTING,UPDATINGyDELETING.
Sucomportamientoeselsiguiente:
INSERTING TRUEsilaordendedisparoesINSERT;FALSEenotrocaso.
UPDATING TRUEsilaordendedisparoesUPDATE;FALSEenotrocaso.
DELETING TRUEsilaordendedisparoesDELETE;FALSEenotrocaso.
Sintaxiscompleta:
CREATE [OR REPLACE] TRIGGER [schema.]trigger
BEFORE event
[WHEN (condition)]
{pl_sql_block | call_procedure_statement}
CREATE [OR REPLACE] TRIGGER [schema.]trigger
AFTER event

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina36/40

[WHEN (condition)]
{pl_sql_block | call_procedure_statement}
CREATE [OR REPLACE] TRIGGER [schema.]trigger
INSTEAD OF event
[WHEN (condition)]
{pl_sql_block | call_procedure_statement}
event can be one or more of the following (separate multiple events with OR)
DELETE event_ref referencing_clause
INSERT event_ref referencing_clause
UPDATE event_ref referencing_clause
UPDATE OF column, column... event_ref
db/ddl_event ON [schema.object]
db/ddl_event ON DATABASE
event_ref:
ON [schema.]table
ON [schema.]view
ON [NESTED TABLE nested_table_column OF] [schema.]view
referencing_clause:
FOR EACH ROW
REFERENCING OLD [AS] old [FOR EACH ROW]
REFERENCING NEW [AS] new [FOR EACH ROW]
REFERENCING PARENT [AS] parent [FOR EACH ROW]
db/ddl_event:
ALTER
ANALYSE
ASSOCIATE STATISTICS
AUDIT
COMMENT
CREATE
DDL
DISASSOCIATE STATISTICS
DROP
GRANT
LOGON
LOGOFF
NOAUDIT
RENAME
REVOKE
TRUNCATE
SERVERERROR
STARTUP
SHUTDOWN
SUSPEND
Multiple db/ddl_events can be separated with OR
Multiple OLD, NEW and PARENT correlation names can be defined in one REFERENCING clause.
Database constraints are a factor of 8x faster than triggers.

4.9.5

Ejercicios

1. Crearunafuncinqueagrega10alvalorpasadoenparametroyregresaelresultado
2. Crearunprocedimientoqueinsertaunnuevoempleado
3. Crearunpaqueteconprocedimientoparamodificarunempleado,yunafuncinparaobtenerla
fechadenacimientodelempleado
4. Usarlosprocedimientos/funcionesenselect
5. Crearuntriggerquegeneralaclaveprimariadelempleadobasadoenunasecuencia

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina37/40

5 SQLLoader
SQLLoaderesunaherramientadeOraclequepermitecargardemaneramuyeficiente(rpida)datos
desdeunarchivoexterneo(textoobinario)haciaunatabladeOracle.
Selanzadesdelalneadecomando,loquepermiteusarloenscript.
Senecesita,ademsdelarchivoacargar,unclienteOracleinstalado(depreferencialamismaversinde
clientequeelservidor),yunarchivodeparmetros(ficherodecontrol).
AlSQLLoader(sqlldr)selepasancomoparmetros(losmsimportantes)elficheroquecontienelos
datosquesevanacargarylarutadelficherodecontrolquecontienelasaccionesarealizar.Elformato
delosdatos,dondesecargaranycualquierotrotipodecontrol.
SYNTAXIS

sqlldr userid=USUARIO/CONTRASEA@BASE control=/RUTA/DEL/FICHERO/DE/CONTROL


data=/RUTA/DEL/FICHERO/QUE/CONTIENE/LOS/DATOS log=/LO/MISMO bad=/A/DONDE/VAN/LOS/DATOS/MALOS
discard=/A/DONDE/VAN/LOS/DATOS/DESCARTADOS

EJEMPLO:
sqlldr userid=alumno/123@curso control=/tmp/test.ctl data=/tmp/test.txt

Comopuedesvernoesmuycomplicado.Simplementeteconectasconunusuariodelabasededatosyle
dicescualeselficherodetextoquecontienelainformacinycualeselquecontienelasespecificaciones
sobreloquesevaahacerconesainformacin
Paramsinformacin,veren:
http://downloaduk.oracle.com/docs/cd/B19306_01/server.102/b14215/part_ldr.htm
ParmetrosComunes
userid=USUARIO/CONTRASEA@BASEUsuario,contraseaeinstanciaalaqueteconectas.
control=Rutadelarchivodecontrolquecontienelasdirectivasdeloquesevaahacer.
data=Rutadelarchivoquecontienelosdatos.
log=Rutadelarchivodondequieresquesegenereellog.
discard=Rutadelarchivodondequieresqueteenvelosregistrosdescartadosynocargados.
bad=Rutadelficherodondevanapararlosregistrosmalos.
ArchivodeControl
Elarchivodecontrol(Controlfileenbrbaro)esdondeseespecificacmosevanacargarlosdatos.
Normalmentesueleresponderalsiguienteesquema:
LOADDATA
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
INTOTABLETU_TABLA_DE_DESTINO
FIELDSTERMINATEDBY"|"OPTIONALLYENCLOSEDBY'"'
TRAILINGNULLCOLS
(
CAMPO0POSITION(1:15),
CAMPO1CHAR"ltrim(rtrim(:CAMPO1))",
CAMPO2CHAR"ltrim(rtrim(:CAMPO2))",
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina38/40

CAMPO3NUMERICOINTEGEREXTERNAL,
CAMPO4FECHADATE"DDMonthYY"
)
Comoves,siloscampostienenunalongitudfijapuedesespecificarlelasposiciones,desdeelcarcter1a
la15ysucesivamente.Osino,puedesdejarqueOracleinterpreteloscamposylosinserte.Enestecaso
estintroduciondodatosAPPENDalfinaldelatabla.(PodraserREPLACEparaquereemplazara
datospreexistentes).Comopuedesimaginarpordefectocadalineaesunafila.Yenesteejemplocada
campoestdelimitadoporelcarcter|.TRAILINGNULLCOLSsirveparaqueinterpretequelos
campossincontenidoseaninterpretadoscomoNULOS.
SqlLoaderyproblemasconfechas
Siestascargandodatosconfechasesposiblequetecauseproblemasalintentarinsertarcolumnascon
fechasycamposnulos.Unamaneradeevitarloesborrarloscaracteresenblancodelcampodefecha.
Ejemplo:
campo_de_fecha "to_date (ltrim(rtrim(:campo_de_fecha)), 'yyyy-mm-dd hh24:mi')"

Ejemplocompleto:
1)Crearlatabla:
create table cim (CX char(2) not null, LANG char(2) not null, CODE varchar2(10) not null, descripcion
varchar2(1000) not null);

2)Copiarelarchivodedatoscim10.txten/tmp
3)Crearelarchivodecontroltest.ctlen/tmp:
LOAD DATA
INTO TABLE cim
TRUNCATE
FIELDS TERMINATED BY X'09'
TRAILING NULLCOLS
(
CX,
LANG,
CODE,
DESCRIPCION
)

4)Cargarlosdatos:

sqlldr userid=alumno/123@core2d control=/tmp/test.ctl data=/tmp/cim-10.txt log=/home/oracle/test.log

5)Validarquelosdatoshansidocargados

CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina39/40

6 Respaldoyreposicindelabasede
datos
6.1 Respaldosfsicosonline
Estetipoderespaldoeslamejoreleccinparaunplanderecuperacindespusdeundesastre.
Losrespaldos'online'permitenhacerrespaldosmientraselsistemaestenuso.Sepuedenhacer
respaldosdiferenciales,oacumulativos.
SoloestndisponiblesilabasededatoscorreenmodoARCHIVELOG.Estetipode
respaldo/restauracinservistoenuncursoavanzadoynohacepartedeestecursobsico.
Losrespaldosencalientedebensiempretenercomobaseunrespaldoenfro.Sinrespaldocorrectoy
completoenfro,nosepodrhacerunareposicinusandolosrespaldoshechosencaliente.
6.1.1

Respaldosencaliente(online)

Parahacerunrespaldoencaliente,cadatablespacedebesercambiadoamododebackupantesde
iniciarelrespaldo.
Ejemplo:
ALTER TABLESPACE xyz BEGIN BACKUP;
cp xyfFile1 /backupDir/
ALTER TABLESPACE xyz END BACKUP;

Desde10gestambinposibleponertodoslostablespaceenmododebackupconunsolocomando:
ALTER DATABASE BEGIN BACKUP;

Noolvidendeguardartambinunacopiadetodoslosrchivelogs'ydeloscontrolfiles.
ALTER SYSTEM SWITCH LOGFILE;
-- Force log switch to update control file headers
ALTER DATABASE BACKUP CONTROLFILE TO '/backupDir/control.dbf';
cp /camino_hacia_los_logs/*.arc /camino_de_backup/

Sisubasededatosterminoanormalmente(crash)mientrasunoovariostablespacesestabanenmodode
backup,hayquemencionaraOracledetermniarelmododebackupcuandolabasededatosesmontada
(noabierta).
ALTER DATABASE END BACKUP;

6.2 Restauracinhacaunciertopuntoelenpasado
Lasrestauracionesmsfcilsonlasrestauracionesapartirdeunrespaldolgico,odeunrespaldo
'offline'.
Encasodereposicindesdeunrespaldoencaliente,sernecesarioaplicarlosarchivelogs,para
recuperartodaslastransaccionesejecutadas(yconfirmadasconuncommit).
LastablasdeFLASHBACKpermitenrecuperarfcilmentetablasbotadasoregistrosborradossin
necesidaddehaceunarestauracincompletadelabasededatos.
Desde10gesmuyfcilcrearrespaldosyrestaurardatosusandoenEnterpriseManager.
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

CursodeadministracindeOracle10g(10.2)

Pagina40/40

Verdetallesen:http://examples.oreilly.com/unixbr/oracle.html
CopyrightCdricSimon,2008

Versin1.1

Reproduccinprohibida

También podría gustarte