Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso de Oracle 10g Administracion
Curso de Oracle 10g Administracion
Versin1.0
CopyrightCdricSimon,2008
SolucionJava.com
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);
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
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
3.1.4
Ejercicios
1. Creaunavistasobre2tablasligadas.
2. Usalavistaenunaconsulta.
3.2 Secuencias
Unasecuenciaesuncontadorqueseincrementaautomticamenteypermitegenerarnumeronicos.
3.2.1
Creacin
CopyrightCdricSimon,2008
Versin1.1
Reproduccinprohibida
CursodeadministracindeOracle10g(10.2)
Pagina12/40
3.2.2
Modificacin
3.2.3
Eliminacin
3.2.4
Ejercicios
1. Creaunasecuencia
2. Alteralasecuenciaparaqueelprximonumerogeneradosea20
3.3 Vistasmaterializadas
Unavistamaterializadaesunconjuntodedatosdeunaovariastablas(comounavista)perodelcualel
datoseguardafsicamente.Aumentaelrendimientodelasconsultasencomparacindelavistanormal,
perodisminuyeelrendimientodelasconsultasDMLsobrelastablasligadasalavistamaterializada,ya
quetienequemantenerlavistamaterializadaademasdelatablafuente.
3.3.1
Creacin
CopyrightCdricSimon,2008
Versin1.1
Reproduccinprohibida
CursodeadministracindeOracle10g(10.2)
Pagina13/40
3.3.2
Modificacin
3.3.3
Eliminacin
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
CopyrightCdricSimon,2008
Versin1.1
Reproduccinprohibida
CursodeadministracindeOracle10g(10.2)
Pagina14/40
3.4.2
Eliminacin
3.4.3
Ejercicios
1. Creaunsinnimopublicoparaunobjeto.Luegoconectatecomootrousuarioyconsultaelobjeto
viaelsinnimopblico.
3.5 DBLink
UnDBLinkpermitellamaraobjetosqueseencuentranenotrabasededatos(onlcuidoenunservidor
remoto).
Hayquetenercuidadosonelrendimientoligadoaconsultasremotas,yaquepuedeimpactardemanera
significativaenservidorremoto.
3.5.1
Creacin
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
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
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
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:
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