Sunteți pe pagina 1din 216

2.

41





!"!#$%&! ($!#)*$! +$ ,&!$! +$ +&#)!
indIce
!"#

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$#
!"#$%&
(I) qe:t|n y d|:eo de bo:e: de doto: ............................................................................9
!%&%# doto: y orch|uo: _________________________________________________ 9
(I.I.I) |o nece:|dod de qe:t|onor doto: ......................................................................................................... 9
(I.I.2) :|:temo: de |nformoc|n ...................................................................................................................... IO
(I.I.1) orch|uo: .................................................................................................................................................... II
(I.I.4) oeroc|one: re|oc|onodo: con u:o de f|chero: en bo:e: de doto: ............................................. I
(I.I.s) t|o: de :|:temo: de |nformoc|n ...................................................................................................... I1
(I.I.) ut|||dod de |o: :|:temo: qe:tore: de bo:e: de doto: ..................................................................... I9
(I.I.1) n|ue|e: de ob:trocc|n de uno bo:e de doto: ............................................................................... 2O
!%&"# comonente: de |o: 5CD _______________________________________ 2I
(I.2.I) func|one:. |enquoje: de |o: 5CD ..................................................................................................... 2I
(I.2.2) recur:o: humono: de |o: bo:e: de doto: ....................................................................................... 22
(I.2.1) e:tructuro mu|t|coo ......................................................................................................................... 21
(I.2.4) func|onom|ento de| 5CD ................................................................................................................ 2s
!%&$# orqu|tecturo de |o: 5CD. e:tndore: ____________________________ 2s
(I.1.I) orqon|:mo: de e:tondor|zoc|n ........................................................................................................ 2s
(I.1.2) |5Oll1CIl5C2IlvC1 ............................................................................................................................. 2
(I.1.1) D1ClCodo:y| ..................................................................................................................................... 2
(I.1.4) AN5|lX1l5ARC .................................................................................................................................. 2
(I.1.s) Mode|o AN5|lX1l5ARC ....................................................................................................................21
(I.1.) roce:o de creoc|n y mon|u|oc|n de uno bo:e de doto: octuo| ...................................... 1O
(I.1.1) formo: de ejecuc|n de un 5CD ................................................................................................... 1O
!%&'# t|o: de 5CD __________________________________________________ 1I
(I.4.I) |ntroducc|n ........................................................................................................................................... 1I
(I.4.2) mode|o jerrqu|co .............................................................................................................................. 12
(I.4.1) mode|o en red (Codo:y|) .................................................................................................................. 11
(I.4.4) mode|o re|oc|ono| ............................................................................................................................... 11
(I.4.s) mode|o de bo:e: de doto: or|entodo: o objeto: ........................................................................ 14
(I.4.) bo:e: de doto: objeto-re|oc|ono|e: ................................................................................................ 14
(I.4.1) bo:e: de doto: No5L ....................................................................................................................... 14
!%&(# d|:eo concetuo| de bo:e: de doto:. e| mode|o ent|dod l re|oc|n _ 1s
(I.s.I) |ntroducc|n .......................................................................................................................................... 1s
(I.s.2) comonente: de| mode|o ................................................................................................................. 1s
(I.s.1) re|oc|one: ............................................................................................................................................... 11
(I.s.4) otr|buto: ................................................................................................................................................ 4O
!"!#$%&! ($!#)*$! +$ ,&!$! +$ +&#)!
indIce
!'#
(I.s.s) mode|o ent|dod re|oc|n extend|do ............................................................................................... 4I
(2) bo:e: de doto: re|oc|ono|e: ...................................................................................... 49
!"&%# e| mode|o re|oc|ono| ____________________________________________ 49
(2.I.I) |ntroducc|n .......................................................................................................................................... 49
(2.I.2) objet|uo: ................................................................................................................................................ sO
(2.I.1) h|:tor|o de| mode|o re|oc|ono| ......................................................................................................... sO
!"&"# e:tructuro de |o: bo:e: de doto: re|oc|ono|e: _____________________ s2
(2.2.I) re|oc|n o tob|o ................................................................................................................................... s2
(2.2.2) tu|o ..................................................................................................................................................... s2
(2.2.1) dom|n|o ................................................................................................................................................ s1
(2.2.4) qrodo .................................................................................................................................................... s1
(2.2.s) cord|no||dod ........................................................................................................................................ s1
(2.2.) :|nn|mo: ............................................................................................................................................. s1
(2.2.1) def|n|c|n formo| de re|oc|n .......................................................................................................... s4
(2.2.s) ro|edode: de |o: tob|o: (o re|oc|one:) ..................................................................................... s4
(2.2.9) t|o: de tob|o: .................................................................................................................................... ss
(2.2.IO) c|oue: ................................................................................................................................................... ss
(2.2.II) nu|o: ...................................................................................................................................................... s
!"&$# re:tr|cc|one: ____________________________________________________ s1
(2.1.I) |nherente: .............................................................................................................................................. s1
(2.1.2) :emnt|co: ............................................................................................................................................ s1
!"&'# |o: I2 req|o: de Codd ___________________________________________ s9
!"&(# o:o de ent|dodlre|oc|n de Chen o| mode|o re|oc|ono| ___________ O
(2.s.I) tron:formoc|n de |o: ent|dode: fuerte: ....................................................................................... O
(2.s.2) tron:formoc|n de re|oc|one: .......................................................................................................... O
(2.s.1) ent|dode: db||e: ............................................................................................................................... s
(2.s.4) re|oc|one: |5A ...................................................................................................................................... s
(2.s.s) noto: f|no|e:.........................................................................................................................................
!"&)# rere:entoc|n de e:quemo: de bo:e: de doto: re|oc|ono|e: _______
(2..I) qrofo: re|oc|ono|e: .............................................................................................................................. 1
(2..2) e:quemo: re|oc|ono|e: der|uodo: de| mode|o ent|dodlre|oc|n ............................................ 1
!"&*# normo||zoc|n__________________________________________________ 1O
(2.1.I) rob|emo: de| e:quemo re|oc|ono| ................................................................................................ 1O
(2.1.2) formo: normo|e:...................................................................................................................................1I
(2.1.1) r|mero formo normo| (IFN) ........................................................................................................... 12
(2.1.4) deendenc|o: func|ono|e: ................................................................................................................. 12
(2.1.s) :equndo formo normo| (2FN) ......................................................................................................... 11
(2.1.) tercero formo normo| (1FN)............................................................................................................14
(2.1.1) formo normo| de oyce-Codd (FNC o CFN) ......................................................................... 1s
(2.1.s) cuorto formo normo| (4FN). deendenc|o: mu|t|uo|uodo: ................................................... 1
(2.1.9) qu|nto formo normo| (sFN) ............................................................................................................ 11
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!(#
(2.1.IO) formo normo| de dom|n|o c|oue (FNDC) .................................................................................. 19
(1) 5L (|). DDL y DML .................................................................................................... sI
!$&%# noto: reu|o: ___________________________________________________ sI
(1.I.I) uer:|n de 5L ....................................................................................................................................... sI
(1.I.2) formoto de |o: |n:trucc|one: en |o: ounte: .................................................................................. sI
!$&"# |ntroducc|n ___________________________________________________ s1
(1.2.I) objet|uo: .................................................................................................................................................s1
(1.2.2) h|:tor|o de| |enquoje 5L ..................................................................................................................s1
(1.2.1) func|onom|ento .................................................................................................................................. s4
(1.2.4) roce:o de |o: |n:trucc|one: 5L .................................................................................................... ss
!$&$# e|emento: de| |enquoje 5L ____________________________________ ss
(1.1.I) cd|qo 5L ........................................................................................................................................... ss
(1.1.2) normo: de e:cr|turo ........................................................................................................................... s
!$&'# DDL __________________________________________________________ s
(1.4.I) |ntroducc|n ......................................................................................................................................... s
(1.4.2) creoc|n de bo:e: de doto:.............................................................................................................. s
(1.4.1) objeto: de |o bo:e de doto: .............................................................................................................. s1
(1.4.4) creoc|n de tob|o: .............................................................................................................................. s1
(1.4.s) t|o: de doto: ...................................................................................................................................... ss
(1.4.) dom|n|o: ............................................................................................................................................... 92
(1.4.1) con:u|tor |o: tob|o: de| u:uor|o ...................................................................................................... 91
(1.4.s) borror tob|o: ....................................................................................................................................... 94
(1.4.9) mod|f|cor tob|o: ................................................................................................................................. 9s
(1.4.IO) re:tr|cc|one: ........................................................................................................................................ 91
!$&(# DML _________________________________________________________ IO
(1.s.I) |ntroducc|n ....................................................................................................................................... IO
(1.s.2) |n:erc|n de doto: ............................................................................................................................ IO
(1.s.1) octuo||zoc|n de req|:tro: ............................................................................................................... IO1
(1.s.4) borrodo de req|:tro: ......................................................................................................................... IOs
!$&)# tron:occ|one: _________________________________________________ IO9
(1..2) COMM|1 ............................................................................................................................................. IO9
(1..1) ROLLACk ........................................................................................................................................ IO9
(1..4) e:todo de |o: doto: duronte |o tron:occ|n .............................................................................. IO9
!$&*# otro: |n:trucc|one: DDL _________________________________________ IIO
(1.1.I) |nd|ce:.................................................................................................................................................... IIO
(1.1.2) :ecuenc|o: .............................................................................................................................................. III
(1.1.1) :|nn|mo: .............................................................................................................................................. II1
(4) 5L (||). Con:u|to: ...................................................................................................... IIs
!'&%# con:u|to: de doto: con 5L. DL ________________________________ IIs
(4.I.I) cooc|dode: .......................................................................................................................................... IIs
!"!#$%&! ($!#)*$! +$ ,&!$! +$ +&#)!
indIce
!)#
(4.I.2) :|ntox|: :enc|||o de| comondo 5LC1 ........................................................................................... IIs
!'&"# c|cu|o: _______________________________________________________ II
(4.2.I) or|tmt|co: ............................................................................................................................................ II
(4.2.2) concotenoc|n de texto: .................................................................................................................. II
!'&$# cond|c|one: ____________________________________________________ II1
(4.1.I) oerodore: de comoroc|n............................................................................................................ II1
(4.1.2) uo|ore: |q|co: ..................................................................................................................................... IIs
(4.1.1) 1vN ............................................................................................................................................ IIs
(4.1.4) |N ........................................................................................................................................................... II9
(4.1.s) L|k ....................................................................................................................................................... II9
(4.1.) |5 NULL ................................................................................................................................................ II9
(4.1.1) recedenc|o de oerodore: ............................................................................................................ I2O
!'&'# ordenoc|n ___________________________________________________ I2O
!'&(# func|one: ______________________________________________________ I2I
(4.s.I) func|one: ............................................................................................................................................... I2I
(4.s.2) func|one: numr|co: ......................................................................................................................... I22
(4.s.1) func|one: de coroctere: ................................................................................................................... I21
(4.s.4) func|one: de trobojo con nu|o:...................................................................................................... I2s
(4.s.s) func|one: de exre:|one: requ|ore:............................................................................................... I2
(4.s.) func|one: de fecho y monejo de fecho: e |nteruo|o: ................................................................ I1I
(4.s.1) func|one: de conuer:|n ................................................................................................................... I11
(4.s.s) func|n DCOD............................................................................................................................... I1s
(4.s.9) func|one: XML ................................................................................................................................... I1
!'&)# obtener doto: de mu|t||e: tob|o: _______________________________ I4I
(4..I) roducto cruzodo o corte:|ono de tob|o: .................................................................................... I4I
(4..2) o:oc|ondo tob|o: ............................................................................................................................... I42
(4..1) re|oc|one: :|n |quo|dod .................................................................................................................... I42
(4..4) :|ntox|: 5L I999 ............................................................................................................................... I41
!'&*# oqruoc|one: _________________________________________________ I4
(4.1.I) func|one: de c|cu|o con qruo:..................................................................................................... I41
(4.1.2) cond|c|one: HAV|NC ........................................................................................................................ I4s
!'&+# :ubcon:u|to: __________________________________________________ I49
(4.s.I) u:o de :ubcon:u|to: :|m|e: ............................................................................................................ I49
(4.s.2) u:o de :ubcon:u|to: de mu|t||e: f||o: ......................................................................................... IsO
(4.s.1) con:u|to: X|515 ................................................................................................................................. IsI
!'&,# comb|noc|one: e:ec|o|e: ______________________________________ Is2
(4.9.I) un|one: ................................................................................................................................................. Is2
(4.9.2) |nter:ecc|one: ..................................................................................................................................... Is2
(4.9.1) d|ferenc|o ............................................................................................................................................ Is2
!'&%-# con:u|to: ouonzodo: _________________________________________ Is1
(4.IO.I) con:u|to: con ROvNUM ................................................................................................................ Is1
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!*#
(4.IO.2) con:u|to: :obre e:tructuro: jerrqu|co: ..................................................................................... Is4
!'&%%# con:u|to: de oqruoc|n ouonzodo _____________________________ Is1
(4.II.I) ROLLU ............................................................................................................................................... Is1
(4.II.2) CU ................................................................................................................................................... Iss
(4.II.1) CROU|NC ....................................................................................................................................... IO
(4.II.4) CROU|NC 515.............................................................................................................................. I2
(4.II.s) conjunto: de oqruoc|one: comb|nodo: .................................................................................... I1
!'&%"# DL en |n:trucc|one: DML _____________________________________ I1
(4.I2.I) re||eno de req|:tro: o ort|r de f||o: de uno con:u|to .............................................................. I1
(4.I2.2) :ubcon:u|to: en |o |n:trucc|n UDA1 ..................................................................................... I4
(4.I2.1) :ubcon:u|to: en |o |n:trucc|n DL1 ...................................................................................... Is
!'&%$# u|:to: ________________________________________________________ Is
(4.I1.I) |ntroducc|n ....................................................................................................................................... Is
(4.I1.2) creoc|n de u|:to:............................................................................................................................. I
(4.I1.1) mo:tror |o ||:to de u|:to: ................................................................................................................ I1
(4.I1.4) borror u|:to: ...................................................................................................................................... I1
(s) Ll5L .......................................................................................................................... I9
!(&%# |ntroducc|n o| 5L roced|mento| ______________________________ I9
(s.I.2) func|one: que ueden reo||zor |o: roqromo: Ll5L ............................................................ I9
(s.I.1) conceto: b:|co: ............................................................................................................................... I1O
!(&"# e:cr|turo de Ll5L ____________________________________________I1O
(s.2.I) e:tructuro de un b|oque Ll5L ................................................................................................... I1O
(s.2.2) e:cr|turo de |n:trucc|one: Ll5L .................................................................................................. I1I
!(&$# uor|ob|e: ______________________________________________________ I12
(s.1.I) u:o de uor|ob|e: ................................................................................................................................. I12
(s.1.2) DM5_OU1U1.U1_L|N ............................................................................................................ I14
(s.1.1) o|conce de |o: uor|ob|e: .................................................................................................................. I14
(s.1.4) oerodore: y func|one: .................................................................................................................... I1s
(s.1.s) oquete: e:tndor ........................................................................................................................... I1s
!(&'# |n:trucc|one: 5L erm|t|do: ____________________________________ I1
(s.4.I) |n:trucc|one: 5LC1 en Ll5L ................................................................................................... I1
(s.4.2) |n:trucc|one: DML y de tron:occ|n ............................................................................................. I1
!(&(# |n:trucc|one: de contro| de f|ujo _________________________________ I11
(s.s.I) |n:trucc|n |F ....................................................................................................................................... I11
(s.s.2) :entenc|o CA5 .................................................................................................................................. I19
(s.s.1) buc|e: ................................................................................................................................................... I19
!(&)# cur:ore: _______________________________________________________ Is2
(s..I) |ntroducc|n ........................................................................................................................................ Is2
(s..2) roce:om|ento de cur:ore: ............................................................................................................. Is2
(s..1) dec|oroc|n de cur:ore: ................................................................................................................... Is2
!"!#$%&! ($!#)*$! +$ ,&!$! +$ +&#)!
indIce
!+#
(s..4) oerturo de cur:ore: ........................................................................................................................ Is2
(s..s) |n:trucc|n F1CH ............................................................................................................................ Is1
(s..) cerror e| cur:or ................................................................................................................................... Is1
(s..1) otr|buto: de |o: cur:ore: .................................................................................................................. Is1
(s..s) uor|ob|e: de req|:tro ......................................................................................................................... Iss
(s..9) cur:ore: y req|:tro: ............................................................................................................................ Is
(s..IO) cur:ore: ouonzodo: ........................................................................................................................ Is1
!(&*# excec|one: ___________________________________________________ Is9
(s.1.I) |ntroducc|n......................................................................................................................................... Is9
(s.1.2) coturo de excec|one: .................................................................................................................. I9O
(s.1.1) excec|one: redef|n|do:................................................................................................................ I9O
(s.1.4) excec|one: :|n def|n|r ...................................................................................................................... I92
(s.1.s) func|one: de u:o con excec|one: ................................................................................................. I91
(s.1.) excec|one: de u:uor|o .................................................................................................................... I91
!(&+# roced|m|ento: _______________________________________________ I94
(s.s.I) |ntroducc|n ........................................................................................................................................ I94
(s.s.2) e:tructuro de un roced|m|ento ................................................................................................... I94
(s.s.1) de:orro||o de roced|m|ento: ......................................................................................................... I9s
(s.s.4) ormetro: ......................................................................................................................................... I9s
(s.s.s) borror roced|m|ento: ..................................................................................................................... I91
!(&,# func|one: _____________________________________________________ I91
(s.9.I) |ntroducc|n ........................................................................................................................................ I91
(s.9.2) :|ntox|: ................................................................................................................................................. I9s
(s.9.1) u:o de func|one: ................................................................................................................................ I9s
(s.9.4) ut|||zor func|one: de:de 5L .......................................................................................................... I99
(s.9.s) e||m|nor func|one: .......................................................................................................................... 2OO
(s.9.) recur:|u|dod ..................................................................................................................................... 2OO
(s.9.1) mo:tror roced|m|ento: o|mocenodo: ...................................................................................... 2OO
!(&%-# oquete: ___________________________________________________ 2OO
(s.IO.I) |ntroducc|n..................................................................................................................................... 2OO
(s.IO.2) creoc|n de oquete: ..................................................................................................................... 2OI
!(&%%# tr|qqer: ______________________________________________________ 2O2
(s.II.I) |ntroducc|n ....................................................................................................................................... 2O2
(s.II.2) creoc|n de tr|qqer: ......................................................................................................................... 2O1
(s.II.1) :|ntox|: de |o creoc|n de tr|qqer: ................................................................................................ 2O4
(s.II.4) referenc|o: Nv y OLD ................................................................................................................. 2Os
(s.II.s) |F |N5R1|NC, |F UDA1|NC e |F DL1|NC ........................................................................2O
(s.II.) tr|qqer: de t|o |N51AD OF ....................................................................................................... 2O1
(s.II.1) odm|n|:troc|n de tr|qqer: ............................................................................................................. 2Os
(s.II.s) re:tr|cc|one: de |o: tr|qqer: ............................................................................................................ 2Os
(s.II.9) orden de ejecuc|n de |o: tr|qqer: ............................................................................................... 2Os
(s.II.IO) rob|emo: con |o: tob|o: mutonte: ..........................................................................................2O9
!,#

()*
+&,-$." / #$,&01 #&
23,&, #& #3-1,
()4)* #3-1, / 35%6$71,
()4)4)* 83 "&%&,$#3# #& +&,-$1"35 #3-1,
En el mundo actual exIste una cada vez mayor demanda de datos. Esta demanda
sIempre ha sIdo patente en empresas y socIedades, pero en estos aos la demanda
todavia de ha dIsparado ms debIdo al acceso multItudInarIo a nternet.
El propIo nombre 402)*%3#".& hace referencIa al hecho de ser una cIencIa que
trabaja con InformacIon. 0esde los albores de la creacIon de ordenadores, la
InformacIon se ha consIderado como uno de los pIlares de las computadoras dIgItales.
Por ello las bases de datos son una de las aplIcacIones ms antIguas de la InformtIca.
En InformtIca se conoce como +&#) a cualquIer elemento InformatIvo que tenga
relevancIa para el sIstema. 0esde el InIcIo de la InformtIca se ha reconocIdo al dato
como al elemento fundamental de trabajo en un ordenador. Por ello se han realIzado
numerosos estudIos y aplIcacIones para mejorar la gestIon que desde las computadoras
se realIza de los datos.
nIcIalmente los datos que se necesItaba almacenar y gestIonar eran pocos, pero
poco a poco han Ido crecIendo. En la actualIdad las numerosas aplIcacIones de nternet
han producIdo enormes sIstemas de InformacIon que Incluso para poder gestIonarles
requIeren decenas de mquInas hacIendo la InformacIon accesIble desde cualquIer parte
del planeta y en un tIempo rpIdo. Eso ha requerIdo que la cIencIa de las bases de datos
est en contInua renovacIon para hacer frente a esas enormes necesIdades.
Pero Incluso podemos remontarnos ms al hablar de datos. El ser humano desde
sIempre ha necesItado gestIonar datos; de esta forma se controlaban almacenes de
alImentos, controles de InventarIo y otras muchos sIstemas de datos. Como herramIenta
el ser humano al prIncIpIo solo poseia su memorIa y clculo y como mucho la ayuda de
sus dedos.
La escrItura fue la herramIenta que permItIo al ser humano poder gestIonar bases
cada vez ms grandes de datos. Adems de permItIr compartIr esa InformacIon entre
dIferentes personas, tambIn posIbIlIto que los datos se guardaran de manera contInua
e Incluso estuvIeran dIsponIbles para las sIguIentes generacIones. Los problemas
actuales con la prIvacIdad ya aparecIeron con la propIa escrItura y asi el cIfrado de
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!%-#
datos es una tcnIca tan antIgua como la propIa escrItura para conseguIr uno de los
todavia requIsItos fundamentales de la gestIon de datos, la !$(/*"+&+.
Para poder almacenar datos y cada vez ms datos, el ser humano Ideo nuevas
herramIentas archIvos, cajones, carpetas y fIchas en las que se almacenaban los datos.
Antes de la aparIcIon del ordenador, el tIempo requerIdo para manIpular estos datos
era enorme. SIn embargo el proceso de aprendIzaje era relatIvamente sencIllo ya que se
usaban elementos que el usuarIo reconocia perfectamente.
Por esa razon, la InformtIca adapto sus herramIentas para que los elementos que el
usuarIo maneja en el ordenador se parezcan a los que utIlIzaba manualmente. Asi en
InformtIca se sIgue hablado de fIcheros, formularIos, carpetas, dIrectorIos,....
()4)49* ,$,-&:3, #& $";15:3%$."
83 &:<5&,3 %1:1 ,$,-&:3
Segun la FAE, la defInIcIon de sIstema es Conjunto de cosas que ordenadamente
relaconadas entre s contribuyen a un determinado objeto .
La clIentela fundamental del profesIonal de la InformtIca es la empresa. La
empresa se puede entender como un sIstema formado por dIversos objetos: el .&8"#&9,
los *$./*!)! :/%&0)!, los "0%/$,9$!, los !$*;".")! que presta, etc.
El sIstema completo que forma la empresa, por otra parte, se suele dIvIdIr en los
sIguIentes subsIstemas:
</,!"!#$%& 8*)+/.#";)= TambIn llamado subsIstema real o fisIco. Fepresenta
la parte de la empresa encargada de gestIonar la produccIon de la mIsma.
</,!"!#$%& 2"0&0."$*)= Encargado de la gestIon de los bIenes economIcos de la
empresa
</,!"!#$%& +"*$.#";)= Encargado de la gestIon organIzatIva de la empresa
Hay que hacer notar que cada subsIstema se asocIa a un departamento concreto de la
empresa.
,$,-&:3, #& $";15:3%$."
Los sIstemas que aglutInan los elementos que IntervIenen para gestIonar la InformacIon
que manejan los subsIstemas empresarIales es lo que se conoce como SIstemas de
nformacIon. Se suele utIlIzar las sIglas <4 o 4< (de lnjormaton Server) para referIrse a
ello).
Fealmente un sIstema de InformacIon solo Incluye la InformacIon que nos Interesa de
la empresa y los elementos necesarIos para gestIonar esa InformacIon.
Un sIstema de InformacIon genrIco est formado por los sIguIentes elementos:
>$./*!)! 2?!".)!= Carpetas, documentos, equIpamIento, dIscos,...
>$./*!)! :/%&0)!= Personal que maneja la InformacIon
@*)#).)9)= Normas que debe cumplIr la InformacIon para que sea manejada
(formato de la InformacIon, modelo para los documentos,...)
Las empresas necesItan Implantar estos sIstemas de InformacIon debIdo a la
competencIa que las oblIga a gestIonar de la forma ms efIcIente sus datos para una
mayor calIdad en la organIzacIon de las actIvIdades de los subsIstemas empresarIales.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%%#

%1:<1"&"-&, #& =" ,$,-&:3 #& $";15:3%$." &8&%-5."$%1
En el caso de una ($!#"10 $9$.#*10".& +$ 9& "02)*%&."10 (lo que actualmente se
consIdera un !"!#$%& +$ "02)*%&."10 $9$.#*10".)), los componentes son:
A&#)!= Se trata de la InformacIon relevante que almacena y gestIona el sIstema
de InformacIon. Ejemplos de datos son: Snchez, 12764569F, Calle Mayo 5,
Azul
B&*+C&*$= EquIpamIento fisIco que se utIlIza para gestIonar los datos. cada uno
de los dIsposItIvos electronIcos que permIten el funcIonamIento del sIstema de
InformacIon.
<)2#C&*$= AplIcacIones InformtIcas que se encargan de la gestIon de la base
de datos y de las herramIentas que facIlItan su uso.
>$./*!)! :/%&0)!= Personal que maneja el sIstema de InformacIon.

()4)4>* 35%6$71,
Los fIcheros o archIvos son la herramIenta fundamental de trabajo en una computadora
todavia a dia de hoy. Las computadoras sIguen almacenando la InformacIon en fIcheros,
eso si de estructura cada vez ms compleja.
Los datos deben de ser almacenados en componentes de almacenamIento
permanente, lo que se conoce como %$%)*"& !$./0+&*"& (dIscos duros u otras unIdades
de dIsco). En esas memorIas, los datos se estructuran en archIvos (tambIn llamados
fIcheros).
Un fIchero es una secuencIa de numeros bInarIos que organIza InformacIon
relacIonada a un mIsmo aspecto.
En general sobre los archIvos se pueden realIzar las sIguIentes operacIones:
D,*"* (oen). Prepara el fIchero para su proceso.
E$**&* (close). CIerra el fIchero ImpIdIendo su proceso InmedIato.
F$$* (read). DbtIene InformacIon del fIchero.
G!.*","* (wrte). Craba InformacIon en el fIchero.
@)!".")0&*!$ (seek). Coloca el puntero de lectura en una posIcIon concreta del
mIsmo (no se puede realIzar en todos los tIpos de fIcheros).
H"0 +$ 2".:$*) (eoj). ndIca sI hemos llegado al fInal del fIchero.
Cuando los fIcheros almacenan datos, se dIce que constan de *$("!#*)!. Cada regIstro
contIene datos relatIvos a un mIsmo elemento u objeto. Por ejemplo en un fIchero de
personas, cada regIstro contIene datos de una persona. SI el archIvo contIene datos de
1000 personas, constar de 1000 regIstros.
A contInuacIon se explIcan los tIpos ms habItuales de fIcheros.
;$%6&51, ,&%=&"%$38&,
En estos fIcheros, los datos se organIzan secuencIalmente en el orden en el que fueron
grabados. Para leer los ultImos datos hay que leer los anterIores. Es decIr leer el
regIstro numero nueve, ImplIca leer prevIamente los ocho anterIores.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!%"#
7&"-3?3,
FpIdos para obtener regIstros contIguos de una base de datos
No hay huecos en el archIvo al grabarse los datos seguIdos, datos ms
compactos.
#&,7&"-3?3,
Consultas muy lentas al tener que leer todos los datos anterIores al dato que
queremos leer
AlgorItmos de lectura y escrItura ms complejos
No se pueden elImInar regIstros del fIchero (se pueden marcar de manera
especIal para que no sean tenIdos en cuenta, pero no se pueden borrar)
El borrado provoca archIvos que no son compactos
La ordenacIon de los datos requIere volver a crearle de nuevo
;$%6&51, #& 3%%&,1 #$5&%-1 1 38&3-15$1
Se puede leer una posIcIon concreta del fIchero, con saber la posIcIon (normalmente en
bytes) del dato a leer. Cuando se almacenan regIstros, posIcIonarnos en el quInto
regIstro se haria de golpe, lo unIco necesItamos saber el tamao del regIstro, que en
este tIpo de fIcheros debe de ser el mIsmo. SuponIendo que cada regIstro ocupa 100
bytes, el quInto regIstro comIenza en la posIcIon 400. Lo que se hace es colocar el
llamado 8/0#$*) +$ &*.:";) en esa posIcIon y despus leer.

49/!#*&."10 6I GJ$%89) +$ 2".:$*) +$ &..$!) +"*$.#)
7&"-3?3,
Acceso rpIdo al no tener que leer los datos anterIores
La modIfIcacIon de datos es ms sencIlla
PermIten acceso secuencIal
PermIten leer y escrIbIr a la vez
Aptos para organIzacIones *$9&#";&! +"*$.#&!, en las que la clave del regIstro se
relacIona con su posIcIon en el archIvo
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$#
#&,7&"-3?3,
Salvo en archIvos relatIvos dIrectos, no es apto por si mIsmo para usar en bases
de datos, ya que los datos se organIzan en base a una clave
No se pueden borrar datos (si marcar para borrado, pero generarn huecos)
Las consultas sobre multItud de regIstros son ms lentas que en el caso
anterIor.
;$%6&51, ,&%=&"%$38&, &"%3#&"3#1,
Son fIcheros secuencIales gestIonados medIante punteros, datos especIales que
contIenen la dIreccIon de cada regIstro del fIchero. Cada regIstro posee ese puntero que
IndIca la dIreccIon del sIguIente regIstro y que se puede modIfIcar en cualquIer
momento. El puntero permIte recorrer los datos en un orden concreto.
Cuando aparece un nuevo regIstro, se aade al fInal del archIvo, pero los punteros se
reordenan para que se mantenga el orden.

49/!#*&."10 -I $J$%89) +$ 2".:$*) !$./$0."&9 $0.&+$0&+)= F)!
8/0#$*)! 9$ *$.)**$0 8)* 9& .9&;$
7&"-3?3,
El fIchero mantIene el orden en el que se aadIeron los regIstros y un segundo
orden en base a una clave
La ordenacIon no requIere reorganIzar todo el fIchero, sIno solo modIfIcar los
punteros
Las mIsmas ventajas que el acceso secuencIal
En esta caso si se borran los regIstros y al reorganIzar, se perdern
defInItIvamente
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!%'#
#&,7&"-3?3,
No se borran los regIstros, sIno que se marcan para ser Ignorados. Por lo que se
malgasta espacIo
AadIr regIstros o modIfIcar las claves son operacIones que requIeren recalcular
los punteros
;$%6&51, ,&%=&"%$38&, $"#&@3#1,
Se utIlIzan dos fIcheros para los datos, uno posee los regIstros almacenados de forma
secuencIal, pero que permIte su acceso aleatorIo. El otro posee una tabla con punteros
a la posIcIon ordenada de los regIstros. Ese segundo fIchero es el ?0+".$I una tabla con
la ordenacIon deseada para los regIstros y la posIcIon que ocupan en el archIvo.
El archIvo de indIces posee unas cuantas entradas solo en las que se IndIca la
posIcIon de cIertos valores claves en el archIvo (cada 10, 15 ,20,... regIstros del archIvo
prIncIpal se aade una entrada en el de indIces). El archIvo prIncIpal tIene que estar
sIempre ordenado y asi cuando se busca un regIstro, se busca su valor clave en la tabla
de indIces, la cual poseer la posIcIon del regIstro buscado. 0esde esa posIcIon se busca
secuencIalmente el regIstro hasta encontrarlo.
ExIste un archIvo llamado de +$!,)*+&%"$0#) u );$*29)C en el que se colocan los
nuevos regIstros que se van aadIendo (para no tener que ordenar el archIvo prIncIpal
cada vez que se aade un nuevo regIstro) este archIvo est desordenado. Se utIlIza solo
sI se busca un regIstro y no se encuentra en el archIvo prIncIpal. En ese caso se recorre
todo el archIvo de overflow hasta encontrarlo.
Para no tener demasIados archIvos en overflow (lo que restaria velocIdad), cada
cIerto tIempo se reorganIza el archIvo prIncIpal. Ejemplo:

49/!#*&."10 KI $J$%89) +$ 2".:$*) !$./$0."&9 "0+$L&+)
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%(#

7&"-3?3,
El archIvo est sIempre ordenado en base a una clave
La busqueda de datos es rapIdisIma
PermIte la lectura secuencIal (que adems ser en el orden de la clave)
El borrado de regIstros es posIble (aunque ms problemtIco que en el caso
anterIor)
#&,7&"-3?3,
Para un uso optImo hay que reorganIzar el archIvo prIncIpal y esta operacIon es
muy costosa ya que hay que reescrIbIr de nuevo y de forma ordenada todo el
archIvo.
La adIcIon de regIstros requIere ms tIempo que en los casos anterIores al tener
que reordenar los indIces
;$%6&51, $"#&@3#1A&"%3#&"3#1,
UtIlIza punteros e indIces, es una varIante encadenada del caso anterIor. Hay un fIchero
de indIces equIvalente al comentado en el caso anterIor y otro fIchero de tIpo
encadenado con punteros a los sIguIentes regIstros. Cuando se aaden regIstros se
aaden en un tercer regIstro llamado de desbordamIento u overjlow. En ese archIvo los
datos se almacenan secuencIalmente, se accede a ellos sI se busca un dato y no se
encuentra en la tabla de indIces.

49/!#*&."10 MI GJ$%89) +$ &*.:";) !$./$0."&9 "0+$L&+) N $0.&+$0&+)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!%)#
7&"-3?3,
Posee las mIsmas ventajas que los archIvos secuencIales Indexados, adems de
una mayor rapIdez al reorganIzar el fIchero (solo se modIfIcan los punteros)
#&,7&"-3?3,
FequIeren compactar los datos a menudo para reorganIzar indIces y quItar el
fIchero de desbordamIento.
()4)4B* 1<&53%$1"&, 5&83%$1"3#3, %1" =,1 #& ;$%6&51, &"
23,&, #& #3-1,
21553#1 / 5&%=<&53%$." #& 5&+$,-51,
Algunos de los tIpos de fIcheros vIstos anterIormente no admIten el borrado real de
datos, sIno que solo permIten aadIr un dato que IndIca sI el regIstro est borrado o no.
Esto es Interesante ya que permIte anular una operacIon de borrado. Por ello esta
tcnIca de marcar regIstros, se utIlIza casI sIempre en todos los tIpos de archIvos.
En otros casos los datos antes de ser elImInados del todo pasan a un fIchero especIal
(conocIdo como 8&8$9$*&) en el que se mantIenen durante cIerto tIempo para su posIble
recuperacIon.
;53+:&"-3%$." / %1:<3%-3%$." #& #3-1,
La fragmentacIon en un archIvo hace referencIa a la posIbIlIdad de que ste tenga
huecos InterIores debIdo a borrado de datos u a otras causas. Causa los sIguIentes
problemas:
|ayor espacIo de almacenamIento
LentItud en las operacIones de lectura y escrItura del fIchero
Por ello se requIere .)%8&.#&* los datos. Esta tcnIca permIte elImInar los huecos
InterIores a un archIvo. Las formas de realIzarla son:
>$$!.*","* $9 &*.:";) 8&*& $9"%"0&* 9)! :/$.)!= Es la mejor, pero logIcamente
es la ms lenta al requerIr releer y reorganIzar todo el contenIdo del fIchero.
D8*);$.:&* :/$.)!. 0e forma que los nuevos regIstros se Inserten en esos
huecos. Esta tcnIca suele requerIr un paso prevIo para reorganIzar esos
huecos.
%1:<5&,$." #& #3-1,
En muchos casos para ahorrar espacIo de almacenamIento, se utIlIzan tcnIcas de
compresIon de datos. La ventaja es que los datos ocupan menos espacIo y la desventaja
es que al manIpular los datos hay que descomprImIrlos lo que hace que la manIpulacIon
de los datos sea lenta.
%$;53#1 #& #3-1,
Dtra de las opcIones habItuales sobre fIcheros de datos es utIlIzar tcnIcas de cIfrado
para proteger los fIcheros en caso de que alguIen no autorIzado se haga con el fIchero.
Para leer un fIchero de datos, haria falta descIfrar el fIchero. Para descIfrar
necesItamos una clave o bIen aplIcar mtodos de descIfrado; logIcamente cuanto mejor
sea la tcnIca de cIfrado, ms dIficIl ser descIfrar los datos medIante la fuerza bruta.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%*#
()4)4C* -$<1, #& ,$,-&:3, #& $";15:3%$."
En la evolucIon de los sIstemas de InformacIon ha habIdo dos puntos determInantes, que
han formado los dos tIpos fundamentales de sIstemas de InformacIon.
,$,-&:3, #& $";15:3%$." 15$&"-3#1, 38 <51%&,1
En estos sIstemas de InformacIon se crean dIversas aplIcacIones (software) para
gestIonar dIferentes aspectos del sIstema. Cada aplIcacIon realIza unas determInadas
operacIones. Los datos de dIchas aplIcacIones se almacenan en archIvos dIgItales dentro
de las unIdades de almacenamIento del ordenador (a veces en archIvos bInarIos, o en
hojas de clculo, o Incluso en archIvos de texto).
Cada programa almacena y utIlIza sus propIos datos de forma un tanto caotIca. La
ventaja de este sIstema (la unIca ventaja), es que los procesos son IndependIentes por
lo que la modIfIcacIon de uno no afectaba al resto. Pero tIene grandes InconvenIentes:
A&#)! *$+/0+&0#$!= Ya que se repIten contInuamente
A&#)! "0.)0!"!#$0#$!= Ya que un proceso cambIa sus datos y no el resto. Por lo
que el mIsmo dato puede tener valores dIstIntos segun qu aplIcacIon acceda a
l.
E)!#$ +$ &9%&.$0&%"$0#) $9$;&+)= Al almacenarse varIas veces el mIsmo
dato, se requIere ms espacIo en los dIscos. Luego se agotarn antes.
A"2?."9 &..$!) & 9)! +&#)!= Cada vez que se requIera una consulta no prevIsta
InIcIalmente, hay que modIfIcar el codIgo de las aplIcacIones o Incluso crear
una nueva aplIcacIon.
A$8$0+$0."& +$ 9)! +&#)! & 0";$9 2?!".)= Para poder saber como se almacenan
los datos, es decIr qu estructura se utIlIza de los mIsmos, necesItamos ver el
codIgo de la aplIcacIon; es decIr el codIgo y los datos no son IndependIentes.
O"$%8)! +$ 8*).$!&%"$0#) $9$;&+)!. Al no poder optImIzar el espacIo de
almacenamIento.
A"2"./9#&+ 8&*& $9 &..$!) !"%/9#30$) & 9)! +&#)!= Es casI ImposIble de
conseguIr ya que se utIlIzan archIvos que no admIten esta posIbIlIdad. 0os
usuarIos no pueden acceder a los datos de forma concurrente.
A"2"./9#&+ 8&*& &+%"0"!#*&* 9& !$(/*"+&+ +$9 !"!#$%&= Ya que cada aplIcacIon
se crea IndependIentemente; es por tanto muy dIficIl establecer crIterIos de
segurIdad unIformes.

49/!#*&."10 PI <"!#$%&! +$ 402)*%&."10 )*"$0#&+)! &9 8*).$!)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!%+#
A estos sIstemas se les llama sIstemas de gestIon de fIcheros. Se consIderan tambIn asi
a los sIstemas que utIlIzan programas ofImtIcos (como Q)*+ o GL.$9 por ejemplo) para
gestIonar sus datos (muchas pequeas empresas utIlIzan esta forma de admInIstrar sus
datos). 0e hecho estos sIstemas producen los mIsmos (sI no ms) problemas.
,$,-&:3, #& $";15:3%$." 15$&"-3#1, 3 81, #3-1,4 23,&, #& #3-1,
En este tIpo de sIstemas los datos se centralIzan en una ,&!$ +$ +&#)! comun a todas
las aplIcacIones. Estos sern los sIstemas que estudIaremos en este curso.
En esos sIstemas los datos se almacenan en una unIca estructura logIca que es
utIlIzable por las aplIcacIones. A travs de esa estructura se accede a los datos que son
comunes a todas las aplIcacIones.
Cuando una aplIcacIon modIfIca un dato, dIcho dato la modIfIcacIon ser vIsIble para
el resto de aplIcacIones.

49/!#*&."10 RI <"!#$%&! +$ "02)*%&."10 )*"$0#&+)! & +&#)!
7&"-3?3,
40+$8$0+$0."& +$ 9)! +&#)! N 9)! 8*)(*&%&! N 8*).$!)!= Esto permIte
modIfIcar los datos sIn modIfIcar el codIgo de las aplIcacIones.
S$0)* *$+/0+&0."&. No hace falta tanta repetIcIon de datos. Solo se IndIca la
forma en la que se relacIonan los datos=
40#$(*"+&+ +$ 9)! +&#)!. |ayor dIfIcultad de perder los datos o de realIzar
IncoherencIas con ellos.
S&N)* !$(/*"+&+ $0 9)! +&#)!= Al permItIr lImItar el acceso a los usuarIos. Cada
tIpo de usuarIo podr acceder a unas cosas..
A&#)! %3! +)./%$0#&+)!= CracIas a los %$#&+&#)! que permIten descrIbIr la
InformacIon de la base de datos.
D..$!) & 9)! +&#)! %3! $2"."$0#$= La organIzacIon de los datos produce un
resultado ms optImo en rendImIento.
S$0)* $!8&.") +$ &9%&.$0&%"$0#)= CracIas a una mejor estructuracIon de los
datos.
D..$!) !"%/9#30$) & 9)! +&#)!= Es ms fcIl controlar el acceso de usuarIos de
forma concurrente.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,#
#&,7&"-3?3,
40!#&9&."10 .)!#)!&= El control y admInIstracIon de bases de datos requIere de
un software y hardware poderoso
>$T/"$*$ 8$*!)0&9 ./&9"2".&+)= 0ebIdo a la dIfIcultad de manejo de este tIpo
de sIstemas.
4%89&0#&."10 9&*(& N +"2?."9= 0ebIdo a los puntos anterIores. La adaptacIon del
personal es mucho ms complIcada y lleva bastante tIempo.
D/!$0."& +$ $!#30+&*$! *$&9$!= Lo cual sIgnIfIca una excesIva dependencIa
hacIa los sIstemas comercIales del mercado. Aunque, hoy en dia, una buena
parte de esta tecnologia est aceptada como estndar de hecho.
()4)4D* =-$8$#3# #& 81, ,$,-&:3, +&,-15&, #& 23,&, #& #3-1,
Un sIstema gestor de bases de datos o <UVA (aunque se suele utIlIzar ms a menudo las
sIglas AVS< procedentes del Ingls, 0ata ase Manayement System) es el software
que permIte a los usuarIos procesar, descrIbIr, admInIstrar y recuperar los datos
almacenados en una base de datos.
En estos sIstemas se proporcIona un conjunto coordInado de programas,
procedImIentos y lenguajes que permIten a los dIstIntos usuarIos realIzar sus tareas
habItuales con los datos, garantIzando adems la segurIdad de los mIsmos.
!"#$

49/!#*&."10 WI G!T/$%& +$9 2/0.")0&%"$0#) N
/#"9"+&+ +$ /0 !"!#$%& ($!#)* +$ ,&!$! +$ +&#)!
El xIto del SC80 resIde en mantener la segurIdad e IntegrIdad de los datos.
LogIcamente tIene que proporcIonar herramIentas a los dIstIntos usuarIos. Entre las
herramIentas que proporcIona estn:
B$**&%"$0#&! 8&*& 9& .*$&."10 N $!8$."2".&."10 +$ 9)! +&#)!. Asi como la
estructura de la base de datos.
B$**&%"$0#&! 8&*& &+%"0"!#*&* N .*$&* 9& $!#*/.#/*& 2?!".& requerIda en las
unIdades de almacenamIento.
B$**&%"$0#&! 8&*& 9& %&0"8/9&."10 +$ 9)! +&#)! de las bases de datos, para
aadIr, modIfIcar, suprImIr o consultar datos.
B$**&%"$0#&! +$ *$./8$*&."10 en caso de desastre
B$**&%"$0#&! 8&*& 9& .*$&."10 +$ .)8"&! +$ !$(/*"+&+
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!"-#
B$**&%"$0#&! 8&*& 9& ($!#"10 +$ 9& .)%/0".&."10 de la base de datos
B$**&%"$0#&! 8&*& 9& .*$&."10 +$ &89".&.")0$! que utIlIcen esquemas
externos de los datos
B$**&%"$0#&! +$ "0!#&9&."10 de la base de datos
B$**&%"$0#&! 8&*& 9& $L8)*#&."10 $ "%8)*#&."10 de datos
()4)4E* "$7&8&, #& 32,-53%%$." #& ="3 23,& #& #3-1,
$"-51#=%%$."
En cualquIer sIstema de InformacIon se consIdera que se pueden observar los datos
desde dos puntos de vIsta:
X";$9 $L#$*0). Esta es la vIsIon de los datos que poseen los usuarIos del
SIstema de nformacIon.
X";$9 2?!".). Esta es la forma en la que realmente estn almacenados los datos.
Fealmente la base de datos es la mIsma, pero se la puede observar desde estos dos
puntos de vIsta. Al Igual que una casa se la pueda observar pensando en los materIales
concretos con los que se construye o bIen pensando en ella con el plano en papel.
En todo sIstema de InformacIon dIgItal, los usuarIos ven los datos desde las
aplIcacIones creadas por los programadores. A ese nIvel se manejan formularIos,
Informes en pantalla o en papel,...
Pero la realIdad fisIca de esos datos, tal cual se almacenan en los dIscos queda
oculta a los usuarIos. Esa forma de ver la base de datos est reservada a los
admInIstradores. Es el nIvel fisIco el que permIte ver la base de datos en funcIon de
como realmente se estn almacenando en el ordenador, en qu carpeta, qu archIvos se
usan,
En el caso de los SIstemas de 8ase de datos, se aade un tercer nIvel, un tercer
punto de vIsta, es el 0";$9 .)0.$8#/&9. Ese nIvel se sItua entre el fisIco y el externo.
En cada nIvel se manejan esquemas de la base de datos, al Igual que al construIr una
casa, los dIstIntos profesIonales manejan dIstIntos tIpos de planos (elctrIcos, de
albailera, de tuberas de agua,). Con lo cual una base de datos requiere disear al
menos tres esquemas (en realIdad son ms).
&,F=&:3 ;!,$%1
Fepresenta la forma en la que estn almacenados los datos. Esta vIsIon solo la requIere
el &+%"0"!#*&+)*Y&. El admInIstrador la necesIta para poder gestIonar ms
efIcIentemente la base de datos.
En este esquema se habla de archIvos, dIrectorIos o carpetas, unIdades de dIsco,
servidores,
&,F=&:3 %1"%&<-=38
Se trata de un esquema teorIco de los datos en el que fIguran organIzados en
estructuras reconocIbles del mundo real y en el que tambIn aparece la forma de
relacIonarse los datos. Este esquema es el paso que permIte modelar un problema real a
su forma correspondIente en el ordenador.
Este esquema es la base de datos de todos los dems. Como se ver ms adelante, es
el prImer paso a realIzar al crear una base de datos. En defInItIva es el plano o modelo
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"%#
general de la base de datos. El esquema conceptual lo realIzan +"!$Z&+)*$!Y&! o
&0&9"!#&!.
&,F=&:3 &@-&5"1
En realIdad son varIos. Se trata de la vIsIon de los datos que poseen los /!/&*")! N
/!/&*"&! 2"0&9$!= Esa vIsIon es la que obtIenen a travs de las aplIcacIones. Las
aplIcacIones creadas por los desarrolladores abstraen la realIdad conceptual de modo
que el usuarIo no conoce las relacIones entre los datos, como tampoco conoce donde
realmente se estn almacenando los datos.
Los esquemas externos los realIzan las 8*)(*&%&+)*&!Y$! segun las IndIcacIones
formales de los y las &0&9"!#&!.
Fealmente cada aplIcacIon produce un esquema externo dIferente (aunque algunos
pueden coIncIdIr) o ;"!#& +$ /!/&*"). El conjunto de todas las vIstas de usuarIo es lo que
se denomIna $!T/$%& $L#$*0) (9),&9.
()49* %1:<1"&"-&, #& 81, GHIJ
()494)* ;="%$1"&,4 8&"+=3?&, #& 81, GHIJ
Los SC80 tIenen que realIzar tres tIpos de funcIones para ser consIderados vlIdos.
;="%$." #& #&,%5$<%$." 1 #&;$"$%$."
PermIte al dIseador de la base de datos crear las estructuras apropIadas para Integrar
adecuadamente los datos. Se dIce que esta funcIon es la que permIte defInIr las tres
estructuras de la base de datos (relacIonadas con los tres nIveles de abstraccIon).
G!#*/.#/*& "0#$*0&
G!#*/.#/*& .)0.$8#/&9
G!#*/.#/*& $L#$*0&
Fealmente esta funcIon trabajo con %$#&+&#)!. Los metadatos es la InformacIon de la
base de datos que realmente sIrve para descrIbIr a los datos. Es decIr, Snchez
Rodryuez y Creso son datos; pero Prmer Aelldo es un metadato. TambIn son
datos decIr que la base de datos contIene Alumnos o que el dn lo forman 9 caracteres
de los cuales los 8 prImeros son numeros y el noveno un carcter en mayusculas.
La funcIon de defInIcIon sIrve pues para .*$&*I $9"%"0&* ) %)+"2".&* %$#&+&#)!.
Para ello permIte usar un 9$0(/&J$ +$ +$!.*"8."10 +$ +&#)! o AAF. |edIante ese
lenguaje:
Se defInen las estructuras de datos
Se defInen las relacIones entre los datos
Se defInen las reglas que han de cumplIr 9)! datos
;="%$." #& :3"$<=83%$."
PermIte modIfIcar y utIlIzar los +&#)! de la base de datos. Se realIza medIante un
9$0(/&J$ +$ %)+"2".&."10 +$ +&#)! o ASF= |edIante ese lenguaje se puede:
AadIr datos
ElImInar datos
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!""#
|odIfIcar datos
8uscar datos
Actualmente se suele dIstInguIr aparte la funcIon de buscar datos en la base de datos
(2/0."10 +$ .)0!/9#&). Para lo cual se proporcIona un 9$0(/&J$ +$ .)0!/9#& +$ +&#)! o
A[F=
;="%$." #& %1"-518
|edIante esta funcIon los admInIstradores poseen mecanIsmos para proteger los datos;
de modo que se permIte a cada usuarIo ver cIertos datos y otros no; o bIen usar cIertos
recursos concretos de la base de datos y prohIbIr otros.
Es decIr sImplemente permIte controlar la segurIdad de la base de datos. El lenguaje
que Implementa esta funcIon es el 9$0(/&J$ +$ .)0#*)9 +$ +&#)! o AEF=
()4949* 5&%=5,1, 6=:3"1, #& 83, 23,&, #& #3-1,
ntervIenen (como ya se ha comentado) muchas personas en el desarrollo y
manIpulacIon de una base de datos. Habiamos seleccIonado cuatro tIpos de usuarIos
(admInIstradores/as, desarrolladores, dIseadores/as y usuarIos/as). Ahora vamos a
desglosar aun ms esta clasIfIcacIon.
$";15:K-$%1,
LogIcamente son los profesIonales que defInen y preparan la base de datos. Pueden ser:
A"*$.#";)!Y&!= DrganIzadores y coordInadores del proyecto a desarrollar y
mxImos responsables del mIsmo. Esto sIgnIfIca que son los encargados de
decIdIr los recursos que se pueden utIlIzar, planIfIcar el tIempo y las tareas, la
atencIon al usuarIo y de dIrIgIr las entrevIstas y reunIones pertInentes.
D0&9"!#&!. Son los encargados de controlar el desarrollo de la base de datos
aprobada por la dIreccIon. Normalmente son adems los +"!$Z&+)*$! +$ 9&
,&!$ +$ +&#)! (especIalmente de los esquemas Interno y conceptual) y los
dIrectores de la programacIon de la mIsma.
D+%"0"!#*&+)*$!Y&! +$ 9&! ,&!$! +$ +&#)!= Encargados de crear el esquema
Interno de la base de datos, que Incluye la planIfIcacIon de copIa de segurIdad,
gestIon de usuarIos y permIsos y creacIon de los objetos de la base de datos.
A$!&**)99&+)*$!Y&! ) 8*)(*&%&+)*$!Y&!= Encargados de la realIzacIon de las
aplIcacIones de usuarIo de la base de datos.
GT/"8) +$ %&0#$0"%"$0#)= Encargados de dar soporte a los usuarIos en el
trabajo dIarIo (suelen Incorporar adems tareas admInIstratIvas como la
creacIon de copIas de segurIdad por ejemplo o el arreglo de problemas de red
por ejemplo).
=,=35$1,
GL8$*#)!Y&!= UtIlIzan el lenguaje de manIpulacIon de datos (ASF) para acceder
a la base de datos. Son usuarIos que utIlIzan la base de datos para gestIon
avanzada de decIsIones.
B&,"#/&9$!= UtIlIzan las aplIcacIones creadas por los desarrolladores para
consultar y actualIzar los datos. Son los que trabajan en la empresa a dIarIo con
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"$#
estas herramIentas y el objetIvo fundamental de todo el desarrollo de la base
de datos.
\.&!")0&9$!. Son usuarIos que utIlIzan un acceso minImo a la base de datos a
travs de una aplIcacIon que permIte consultar cIertos datos. Serian por
ejemplo los usuarIos que consultan el horarIo de trenes a travs de nternet.
()494>* &,-5=%-=53 :=8-$%3<3
El proceso que realIza un SC80 est en realIdad formado por varIas capas que actuan
como Interfaces entre el usuarIo y los datos. Fue el propIo organIsmo ANS (en su
modelo XJ/SPAFC que luego se comenta) la que Introdujo una mejora de su modelo de
bases de datos en 1988 a travs de un grupo de trabajo llamado ]HOU (User Facltes
Task Crou, grupo de trabajo para las facIlIdades de usuarIo). Este modelo toma como
objeto prIncIpal al usuarIo habItual de la base de datos y modela el funcIonamIento de
la base de datos en una sucesIon de capas cuya fInalIdad es ocultar y proteger la parte
Interna de las bases de datos.
0esde esta optIca para llegar a los datos hay que pasar una serIe de capas que desde
la parte ms externa poco a poco van entrando ms en la realIdad fisIca de la base de
datos. Esa estructura se muestra en la lustracIon 8.
!%&'(
$)(&*+% -.*/%&)0'
1234*'
!
)
3
3
)
'
5
%/)' 6*
6
%
&
'
(
7
3
3
*
(' % 6
%
&
'
(
8
%
3
)4)6
%
6*( 6* 9
(
9
%
/
)
'

49/!#*&."10 ^I S)+$9) +$ *$2$*$0."& +$ 9&! 2&."9"+&+$! +$
/!/&*")
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!"'#
;3%$8$#3#&, #& =,=35$1
Son las herramIentas que proporcIona el SC80 a los usuarIos para permItIr un acceso
ms sencIllo a los datos. Actuan de Interfaz entre el usuarIo y la base de datos, y son el
unIco elemento que maneja el usuarIo. Son, en defInItIva, las pgInas web y las
aplIcacIones con las que los usuarIos manejan la base de datos. PermIte abstraer la
realIdad de la base de datos a las usuarIas y usuarIos, mostrando la InformacIon de una
forma ms humana.
%3<3 #& 3%%&,1 3 #3-1,
La capa de acceso a datos es la que permIte comunIcar a las aplIcacIones de usuarIo con
el dIccIonarIo de datos. Es un software (un drIver o controlador en realIdad) que se
encarga traducIr las petIcIones del usuarIo para que lleguen de forma correcta a la base
de datos y sta pueda responder de forma adecuada.
#$%%$1"35$1 #& #3-1,
Se trata del elemento que posee todos los metadatos. CracIas a esta capa las solIcItudes
de los clIentes (que son conceptuales antes de llegar aqui) se traducen en InstruccIones
que hacen referencIa al esquema Interno de la base de datos.
"L%8&1
El nucleo de la base de datos es la encargada de traducIr todas las InstruccIones
requerIdas y prepararlas para su correcta InterpretacIon por parte del sIstema. FealIza
la traduccIon fisIca de las petIcIones.
,$,-&:3 1<&53-$71
Es una capa externa al software SC80 pero es la unIca capa que realmente accede a los
datos en si. En realIdad los SC80 no acceden dIrectamente al dIsco, sIno que pIden al
SIstema DperatIvo que lo haga.

49/!#*&."10 _I G!T/$%& +$9 2/0.")0&%"$0#) +$ /0 <UVA
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"(#
()494B* ;="%$1"3:$&"-1 #&8 GHIJ
La lustracIon 9 presenta el funcIonamIento tipIco de un SC80. En ella se reproduce la
comunIcacIon entre un proceso de usuarIo que desea acceder a los datos y el SC80:
!'# El proceso lanzado por el usuarIo llama al SC80 IndIcando la porcIon de la base
de datos que se desea tratar
!(# El SC80 traduce la llamada a trmInos del esquema logIco de la base de datos.
Accede al esquema logIco comprobando derechos de acceso y la traduccIon
fisIca (normalmente los metadatos se guardan una zona de memorIa global y no
en el dIsco)
!)# El SC80 obtIene el esquema fisIco
!*# El SC80 traduce la llamada a los mtodos de acceso del SIstema DperatIvo que
permIten acceder realmente a los datos requerIdos
!+# El SIstema DperatIvo accede a los datos tras traducIr las ordenes dadas por el
SC80
!,# Los datos pasan del dIsco a una memorIa IntermedIa o bujjer. En ese buffer se
almacenarn los datos segun se vayan recIbIendo
!%-# Los datos pasan del buffer al rea de trabajo del usuarIo (DO]) del proceso del
usuarIo. Los pasos R y W se repIten hasta que se envie toda la InformacIon al
proceso de usuarIo.
!%%# En el caso de que haya errores en cualquIer momento del proceso, el SC80
devuelve IndIcadores en los que manIfIesta sI ha habIdo errores o advertencIas
a tener en cuenta. Esto se IndIca al rea de comunIcacIones del proceso de
usuarIo. SI las IndIcacIones son satIsfactorIas, los datos de la ATU sern
utIlIzables por el proceso de usuarIo.
()4>* 35F=$-&%-=53 #& 81, GHIJ4 &,-K"#35&,
Es uno de los aspectos que todavia sIgue pendIente. 0esde la aparIcIon de los prImeros
gestores de base de datos se Intento llegar a un acuerdo para que hubIera una
estructura comun para todos ellos, a fIn de que el aprendIzaje y manejo de este
software fuera ms provechoso y efIcIente.
El acuerdo nunca se ha conseguIdo del todo, no hay estndares aceptados del todo.
Aunque si hay unas cuentas propuestas de estndares que si funcIonan como tales.
()4>4)* 15+3"$,:1, #& &,-3"#35$M3%$."
Los Intentos por conseguIr una estandarIzacIon han estado promovIdos por organIsmos
de todo tIpo. Algunos son estatales, otros prIvados y otros promovIdos por los propIos
usuarIos. Los tres que han tenIdo gran relevancIa en el campo de las bases de datos son
DX<4Y<@D>EY`K, E\AD<aF y \ASU (ste solo para las bases de datos orIentadas a
objetos). Los organIsmos grandes (que recogen grandes responsabIlIdades) dIvIden sus
tareas en comIts, y stos en grupos de trabajo que se encargan de temas concretos.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!")#
()4>49* NGOPQRS)PGS9)PTH>
4<\ (lnternatonal 0ryanzaton jor Standardzaton). Es un organIsmo
InternacIonal de defInIcIon de estndares de gran prestIgIo=
4GE (lnternatonal Electrotechncal Commsson). DrganIsmo de defInIcIon de
normas en ambIentes electronIcos. Es la parte, en defInItIva de SD, dedIcada a
la creacIon de estndares.
bOE 6 (Jont Techncal Commttee). ComIt parte de EC dedIcado a la
tecnologia de la InformacIon (InformtIca). En el campo de las bases de datos,
el subcomIt <E -6 (en el que partIcIpan otros organIsmos nacIonales, como el
espaol AENDF) posee un grupo de trabajo llamado QU K que se dedIca a las
bases de datos. Este grupo de trabajo es el que defIne la estandarIzacIon del
lenguaje SQL entre otras cuestIones.
Entre los trabajos que realIza el grupo WCJ est la normalIzacIon de <[F, adems de
otras normas de estandarIzacIon.
()4>4>* JIRHPS1#3,/8
Codasyl (C0njerence on 0Ata SYstem Lanyuayes7 es el nombre de una conferencIa
InIcIada en el ao 1959 y que dIo lugar a un organIsmo con la Idea de conseguIr un
lenguaje estndar para la mayoria de mquInas InformtIcas. PartIcIparon organIsmos
prIvados y publIcos del gobIerno de Estados UnIdos con la fInalIdad de defInIr
estndares. Su prImera tarea fue desarrollar el lenguaje E\V\F y otros elementos del
anlIsIs, dIseo y la programacIon de ordenadores.
La tarea real de estandarIzar esos lenguajes se la cedIeron al organIsmo ANS, pero
las Ideas e InIcIos de muchas tecnologias se Idearon en el consorcIo Codasyl.
En 1967 se crea un (*/8) +$ #&*$&! 8&*& ,&!$! +$ +&#)! (0ata ase Task Crou) y
este grupo defInIo el %)+$9) $0 *$+ +$ ,&!$! +$ +&#)! y su IntegracIon con CD8DL. A
este modelo en red se le denomIna %)+$9) E)+&!N9 o modelo AVOU y fue fInalmente
aceptado por la ANS.
()4>4B* UVGNPW>PGXUYS
DX<4 (Amercan Natonal Standards lnsttute) es un organIsmo cIentifIco de Estados
UnIdos que ha defInIdo dIversos estndares en el campo de las bases de datos. `K es la
parte de ANS encargada de los estndares en el mundo de la electronIca. FInalmente
<@D>EI System Plannny and Rearments Commttee! comIt de planIfIcacIon de
sIstemas y reparacIones es una subseccIon de XJ encargada de los estndares en
SIstemas nformtIcos en especIal del campo de las bases de datos. Su logro
fundamental ha sIdo defInIr un modelo de referencIa para las bases de datos (que se
estudIar posterIormente).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"*#

49/!#*&."10 6cI >$9&."10 $0#*$ 9)! )*(&0"!%)! +$ $!#&0+&*"d&."10
En la actualIdad ANS para Estados UnIdos e SD para todo el mundo son nombres
equIvalentes en cuanto a estandarIzacIon de bases de datos, puesto que se habla ya de
un unIco modelo de sIstema de bases de datos.
()4>4C* Z1#&81 UVGNPW>PGXUYS
El organIsmo ANS ha marcado la referencIa para la construccIon de SC80. El modelo
defInIdo por el grupo de trabajo SPAFC se basa en estudIos anterIores en los que se
defInian tres nIveles de abstraccIon necesarIos para gestIonar una base de datos. ANS
profundIza ms en esta Idea y defIne como debe ser el proceso de creacIon y utIlIzacIon
de estos nIveles.
En el modelo ANS se IndIca que hay tres modelos: $L#$*0), .)0.$8#/&9 e "0#$*0)=
Se entIende por modelo, el conjunto de normas que permIten crear esquemas (dIseos
de la base de datos).
Los esquemas externos reflejan la InformacIon preparada para el usuarIo fInal, el
esquema conceptual refleja los datos y relacIones de la base de datos y el esquema
Interno la preparacIon de los datos para ser almacenados.
El esquema conceptual contIene la InformacIon logIca de la base de datos. Su
estructuracIon y las relacIones que hay entre los datos.
El esquema Interno contIene InformacIon sobre como estn almacenados los datos en
dIsco. Es el esquema ms cercano a la organIzacIon real de los datos.
En defInItIva el modelo ANS es una propuesta teorIca sobre como debe de funcIonar
un sIstema gestor de bases de datos (sIn duda, la propuesta ms Importante). Su Idea
es la sIguIente:

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!"+#

49/!#*&."10 66I X";$9$! $0 $9 %)+$9) DX<4
En la lustracIon 11, el paso de un esquema a otro se realIza utIlIzando una Interfaz o
funcIon de traduccIon. En su modelo, la ANS no IndIca como se debe realIzar esta
funcIon, solo que debe exIstIr.
La arquItectura completa (
lustracIon 12) est dIvIdIda en dos seccIones, la zona de defInIcIon de datos y la de
manIpulacIon. Esa arquItectura muestra las funcIones realIzadas por humanos y las
realIzadas por programas.
En la fase de +$2"0"."10, una serIe de Interfaces permIten la creacIon de los
%$#&+&#)! que se convIerten en el eje de esta arquItectura. La creacIon de la base de
datos comIenza con la elaboracIon del esquema conceptual realIzndola el
admInIstrador de la empresa (actualmente es el dIseador, pero ANS no lo llamo asi).
Ese esquema se procesa utIlIzando un procesador del esquema conceptual
(normalmente una herramIenta ED<G, nterjaz 1 del dIbujo anterIor) que lo convIerte
en los metadatos (nterjaz 2).
La nterjaz 3 permIte mostrar los datos del esquema conceptual a los otros dos
admInIstradores: el admInIstrador de la base de datos y el de aplIcacIones (el
desarrollador). |edIante esta InformacIon construyen los esquemas Internos y externos
medIante las nterjaces 4 y 5 respectIvamente, los procesadores de estos esquemas
almacenan la InformacIon correspondIente a estos esquemas en los metadatos
(nterjaces 6 y 7).

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!",#

49/!#*&."10 6-I D*T/"#$.#/*& DX<4I $L89".&."10 .93!".& +$9 2/0.")0&%"$0#) +$ /0 <"!#$%&
U$!#)* +$ V&!$! +$ A&#)! "0.9/N$0+) 9)! *$./*!)! :/%&0)! "%89".&+)!
En la fase de %&0"8/9&."10 el usuarIo puede realIzar operacIones sobre la base de datos
usando la nterjaz 8 (normalmente una aplIcacIon) esta petIcIon es transformada por el
transformador externo/conceptual que obtIene el esquema correspondIente ayudndose
tambIn de los metadatos (nterjaz 9). El resultado lo convIerte otro transformador en
el esquema Interno (nterjaz 10) usando tambIn la InformacIon de los metadatos
(nterjaz 11). FInalmente del esquema Interno se pasa a los datos usando el ultImo
transformador (nterjaz 12) que tambIn accede a los metadatos (nterjaz 13) y de ahi
se accede a los datos (nterjaz 14). Para que los datos se devuelvan al usuarIo en
formato adecuado para l se tIene que hacer el proceso contrarIo (observar dIbujo).
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!$-#
()4>4D* <51%&,1 #& %5&3%$." / :3"$<=83%$." #& ="3 23,& #&
#3-1, 3%-=38
El modelo ANS de bases de datos sIgue estando vIgente y por ello el cIclo de vIda de
una base de datos contInua atendIendo a las dIrectrIces marcadas por el modelo. No
obstante si han cambIado el nombre de los recursos humanos.
;3,& #& %5&3%$."[
!'# El &0&9"!#& o +"!$Z&+)* (equIvalente a un admInIstrador de esquemas
conceptuales del modelo ANS) utIlIza una :$**&%"$0#& ED<G para crear el
esquema conceptual
!(# El &+%"0"!#*&+)* de la base de datos (AVD) recoge ese esquema y crea el
esquema Interno utIlIzando las herramIentas de defInIcIon de datos del SC80 y
herramIentas CASE
!)# Los +$!&**)99&+)*$! tambIn recogen el esquema conceptual y utIlIzan las
aplIcacIones necesarIas para generar los esquemas externos que necesItan los
usuarIos medIante herramIentas de creacIon de aplIcacIones apropIadas y
herramIentas CASE
;3,& #& :3"$<=83%$."[
!'# El usuarIo realIza una consulta utIlIzando el esquema externo que las facIlIdades
de usuarIo ponen a su dIsposIcIon
!(# Las aplIcacIones las traducen a su forma conceptual utIlIzando la InformacIon del
dIccIonarIo de datos.
!)# El esquema conceptual es traducIdo por la SC80 a su forma Interna
!*# EL SC80 se comunIca con el SIstema DperatIvo para pedIr que acceda al dIsco y
archIvos en los que estn los datos pedIdos (se sabe qu archIvos concretos son
gracIas al dIccIonarIo de datos) y recoja los datos requerIdos
!+# El SIstema DperatIvo accede al almacenamIento fisIco correspondIente y
devuelve los datos al SC80
!,# El SC80 transforma los datos Internos en datos conceptuales y los entrega a la
aplIcacIon
!%-# La aplIcacIon muestra los datos habIndolos traducIdo en su forma externa. Asi
los ve el usuarIo
()4>4E* ;15:3, #& &?&%=%$." #& =" GHIJ
Actualmente casI todos los SIstemas Cestores de 8ases de 0atos funcIonan de manera
semejante, en realIdad hay tres posIbIlIdades de funcIonamIento:
<UVA! %)0).&8&. Es la ms sencIlla, pero la que tIene menos escalabIlIdad
(posIbIlIdad de crecer). El SIstema Cestor se Instala en una mquIna y los
usuarIos acceden dIrectamente a esa mquIna y ese SIstema Cestor. En estos
sIstemas no se accede de forma remota a la base de datos.
<UVA! ,".&8&= Estructura clsIca, la base de datos y su SC80 estn en un
servIdor al cual acceden los clIentes. El clIente posee software que permIte al
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$%#
usuarIo envIar InstruccIones al SC80 en el servIdor y recIbIr los resultados de
estas InstruccIones. Para ello el software clIente y el servIdor deben utIlIzar
software de comunIcacIones en red. Hay dos posIbIlIdades:
- G!#*/.#/*& E9"$0#$e<$*;"+)*. La base de datos est en un solo servIdor al
que acceden los clIentes (Incluso sImultneamente).
- E9"$0#$ %/9#"e!$*;"+)*. En este caso los clIentes acceden a un conjunto de
servIdores que dIstrIbuyen la base de datos. El clIente no sabe sI los datos
estn en uno o ms servIdores, ya que el resultado es el mIsmo
IndependIentemente de donde se almacenan los datos. Se usa cuando el
numero de clIentes ha crecIdo mucho y un solo servIdor no podria atender
sus petIcIones.
<UVA +$ #*$! ) %3! .&8&!. Es una estructura de tIpo clIente/servIdor, pero en
la que hay al menos una capa IntermedIa entre las dos. Esa capa se suele
encargar de procesar las petIcIones y envIarlas al SC80 con el que se comunIca.
Un ejemplo habItual es que la tercer capa sea un !$*;"+)* C$, que evIta que el
clIente se conecte dIrectamente al SC80. Ese servIdor web se encarga de
traducIr lo que el clIente realIza a una forma entendIble por la base de datos.
Esta forma de trabajar permIte adems que para usar una base de datos, baste
un sImple navegador al clIente.
Puede haber ms capas con otros fInes. Estas capas sIempre estn entre el
clIente y el servIdor.

()4B* -$<1, #& GHIJ
()4B4)* $"-51#=%%$."
Como se ha vIsto en los apartados anterIores, resulta que cada SC80 puede utIlIzar un
modelo dIferente para los datos. Por lo que hay modelos conceptuales dIferentes segun
que SC80 utIlIcemos.

49/!#*&."10 6KI S)+$9)! +$ +&#)! /#"9"d&+)! $0 $9 +$!&**)99) +$ /0& VA
No obstante exIsten modelos logIcos comunes, ya que hay SC80 de dIferentes tIpos. En
la realIdad el modelo ANS se modIfIca para que exIstan dos modelos Internos: el modelo
logIco (referIdo a cualquIer SC80 de ese tIpo) y el modelo propIamente Interno
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!$"#
(aplIcable solo a un SC80 en partIcular). 0e hecho en la prctIca al defInIr las bases de
datos desde el mundo real hasta llegar a los datos fisIcos se pasa por los esquemas
sealados en la lustracIon 1J.
Por lo tanto la dIferencIa entre los dIstIntos SC80 est en que proporcIonan
dIferentes modelos logIcos.
#$;&5&"%$3, &"-5& &8 :1#&81 8.+$%1 / &8 %1"%&<-=38
El modelo conceptual es IndependIente del 08|S que se vaya a utIlIzar. El
logIco depende de un #"8) de SC80 en partIcular
El modelo logIco est ms cerca del modelo fisIco, el que utIlIza Internamente
el ordenador
El modelo conceptual es el ms cercano al usuarIo, el logIco es el encargado de
establecer el paso entre el modelo conceptual y el modelo fisIco del sIstema.
Algunos ejemplos de modelos conceptuales son:
S)+$9) G0#"+&+ >$9&."10
S)+$9) >SYO
S)+$9) ]SF
Ejemplos de modelos logIcos son:
S)+$9) *$9&.")0&9
S)+$9) E)+&!N9
S)+$9) b$*3*T/".)
A contInuacIon se comentarn los modelos logIcos ms Importantes.
()4B49* :1#&81 ?&5K5F=$%1
Era utIlIzado por los prImeros SC80, desde que 8| lo defInIo para su |S (lnjormaton
Manayement System, SIstema AdmInIstrador de nformacIon) en 1970. Se le llama
tambIn modelo en rbol debIdo a que utIlIza una estructura en rbol para organIzar los
datos.
La InformacIon se organIza con un jerarquia en la que la relacIon entre las entIdades
de este modelo sIempre es del tIpo 8&+*$ Y :"J). 0e esta forma hay una serIe de nodos
que contendrn atrIbutos y que se relacIonarn con nodos hIjos de forma que puede
haber ms de un hIjo para el mIsmo padre (pero un hIjo solo tIene un padre).
Los datos de este modelo se almacenan en estructuras logIcas llamadas !$(%$0#)!.
Los segmentos se relacIonan entre si utIlIzando &*.)!=
La forma vIsual de este modelo es de rbol InvertIdo, en la parte superIor estn los
padres y en la InferIor los hIjos.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$$#
!*.%/&%+*5&'
!'39+*5&'( :*/('5%4
;%/*%(

49/!#*&."10 6MI GJ$%89) +$ $!T/$%&
J$*3*T/".)
Este esquema est en absoluto desuso ya que no es vlIdo para modelar la mayoria de
problemas de bases de datos.
()4B4>* :1#&81 &" 5&# (S1#3,/8*
Es un modelo que ha tenIdo una gran aceptacIon (aunque apenas se utIlIza
actualmente). En especIal se hIzo popular la forma defInIda por Codasyl a prIncIpIos de
los 70 que se ha convertIdo en el modelo en red ms utIlIzado.
El modelo en red organIza la InformacIon en *$("!#*)! (tambIn llamados 0)+)!) y
$09&.$!. En los regIstros se almacenan los datos, mIentras que los enlaces permIten
relacIonar estos datos. Las bases de datos en red son parecIdas a las jerrquIcas solo
que en ellas puede haber ms de un padre.
En este modelo se pueden representar perfectamente cualquIer tIpo de relacIon
entre los datos (aunque el Codasyl restrIngia un poco las relacIones posIbles), pero hace
muy complIcado su manejo.

49/!#*&."10 6PI $J$%89) +$ +"&(*&%& +$ $!#*/.#/*& +$ +&#)! E)+&!N9
()4B4B* :1#&81 5&83%$1"38
En este modelo los datos se organIzan en tablas cuyos datos se relacIonan. Es el modelo
ms popular y se descrIbe con ms detalle en los temas sIguIentes.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!$'#
()4B4C* :1#&81 #& 23,&, #& #3-1, 15$&"-3#3, 3 12?&-1,
0esde la aparIcIon de la programacIon orIentada a objetos (@\\ u \\@) se empezo a
pensar en bases de datos adaptadas a estos lenguajes. La programacIon orIentada a
objetos permIte cohesIonar datos y procedImIentos, hacIendo que se dIseen
estructuras que poseen datos (&#*",/#)!) en las que se defInen los procedImIentos
()8$*&.")0$!) que pueden realIzar con los datos. En las bases orIentadas a objetos se
utIlIza esta mIsma Idea.
A travs de este concepto se Intenta que estas bases de datos consIgan arreglar las
lImItacIones de las relacIonales. Por ejemplo el problema de la herencIa (el hecho de
que no se puedan realIzar relacIones de herencIa entre las tablas), tIpos defInIdos por el
usuarIo, dIsparadores (trIggers) almacenables en la base de datos, soporte multImedIa...
Se supone que son las bases de datos de tercera generacIon (la prImera fue las bases
de datos en red y la segunda las relacIonales), lo que sIgnIfIca que el futuro parece
estar a favor de estas bases de datos. Pero sIguen sIn reemplazar a las relacIonales,
aunque son el tIpo de base de datos que ms est crecIendo en los ultImos aos.
Su modelo conceptual se suele dIsear en ]SF y el logIco actualmente en \ASU
(0bect 0ata Manayement Crou, grupo de admInIstracIon de objetos de datos,
organIsmo que Intenta crear estndares para este modelo).
()4B4D* 23,&, #& #3-1, 12?&-1A5&83%$1"38&,
Tratan de ser un hibrIdo entre el modelo relacIonal y el orIentado a objetos. El
problema de las bases de datos orIentadas a objetos es que requIeren reInvertIr capItal
y esfuerzos de nuevo para convertIr las bases de datos relacIonales en bases de datos
orIentadas a objetos. En las bases de datos objeto relacIonales se Intenta conseguIr una
compatIbIlIdad relacIonal dando la posIbIlIdad de Integrar mejoras de la orIentacIon a
objetos.
Estas bases de datos se basan en el estndar <[F __. En ese estndar se aade a las
bases relacIonales la posIbIlIdad de almacenar procedImIentos de usuarIo, trIggers, tIpos
defInIdos por el usuarIo, consultas recursIvas, bases de datos DLAP, tIpos LD8,...
Las ultImas versIones de la mayoria de las clsIcas grandes bases de datos
relacIonales (\*&.9$, <[F <$*;$*, 402)*%"L, ...) son objeto relacIonales.
()4B4E* 23,&, #& #3-1, V1G\]
8ajo este nombre se agrupan las bases de datos (con arquItecturas muy dIversas)
pensadas para grabar los datos de manera veloz para asi poder atender a mIles y mIles
de petIcIones. Es decIr, es el modelo de las bases de datos que se utIlIzan en los grandes
servIcIos de nternet (como #C"##$*, H&.$,))f, D%&d)0,).
La Idea es que los datos apenas necesItan valIdarse y relacIonarse y lo Importante es
la dIsponIbIlIdad de la propIa base de datos. El nombre NoSQL, hace referencIa a que
este modelo de bases de datos rompe con el lenguaje SQL (el lenguaje de las bases de
datos relacIonales, las bases de datos domInantes hasta la actualIdad) para poder
manIpular los datos con lenguajes de otro tIpo.

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$(#
()4C* #$,&01 %1"%&<-=38 #& 23,&, #& #3-1,4
&8 :1#&81 &"-$#3# P 5&83%$."
()4C4)* $"-51#=%%$."
Ya hemos vIsto anterIormente que exIsten varIos esquemas a realIzar para poder
representar en forma de base de datos InformtIca un problema procedente del
ordenador.
El prImero de esos esquemas es el llamado $!T/$%& .)0.$8#/&9, que representa la
InformacIon de forma absolutamente IndependIente al SIstema Cestor de 8ase de 0atos.
Los esquemas Internos de las dIferentes bases de datos no captan sufIcIentemente bIen
la semntIca del mundo real, de ahi que prImero haya que pasar por uno o dos
esquemas prevIos ms cercanos al mundo real.
El hecho de saltarse el esquema conceptual conlleva un problema de prdIda con el
problema real. El esquema conceptual debe reflejar todos los aspectos relevantes del
mundo a real a modelar.
X&-&5 X4 S6&" / &8 :1#&81 &"-$#3#P5&83%$."
En 1976 y 1977 dos articulos de @$#$* @= E:$0 presentan un modelo para realIzar
esquemas que posean una vIsIon unIfIcada de los datos. Este modelo es el modelo
entIdad/InterrelacIon (entty/relatonsh en Ingls) que actualmente se conoce ms
con el nombre de entIdad/relacIon (S)+$9) GY> o SGY>, en Ingls E/RM).
PosterIormente otros autores han aadIdo mejoras a este modelo lo que ha
producIdo una famIlIa de modelos. La ms aceptada actualmente es el modelo
$0#"+&+Y*$9&."10 $L#$0+"+) (G>G) que complementa algunas carencIas del modelo
orIgInal. No obstante las dIversas varIantes del modelo hacen que la representacIon de
este modelo no sea muy estndar, aunque hay Ideas muy comunes a todas las varIantes.
Hay que InsIstIr en que este modelo no tIene nada que ver con las bases de datos
relacIonales, los esquemas entIdad/relacIon se pueden utIlIzar con cualquIer SC80 ya
que son conceptuales. Confunde el uso de la palabra *$9&."10, pero el concepto de
relacIon en este esquema no tIene nada que ver con la Idea de relacIon expuesta por
E)++ en su modelo relacIonal (es decIr en la segunda unIdad cambIaremos el concepto
de relacIon).
()4C49* %1:<1"&"-&, #&8 :1#&81
&"-$#3#
Se trata de cualquIer objeto u elemento (real o abstracto) acerca del cual se pueda
almacenar InformacIon en la base de datos. Es decIr cualquIer elemento InformatIvo
que tenga ImportancIa para una base de datos.
Ejemplos de entIdades son Pedro, la factura numero J2456, el coche matricula
J4528CW, etc. Una entIdad no es un propIedad concreta sIno un objeto que puede
poseer mltiples propiedades (atributos). Es decir Snchez es el contenido del
atrIbuto Prmer Aelldo de la entIdad que representa a la persona Pedro Snchez
Crespo con 0N 12766J74,...
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!$)#
Una entIdad es un objeto concreto, no un sImple dato: el coche que tenemos en el
garaje es una entidad, Mercedes sin embargo es la marca de ese coche, es decir es un
atrIbuto de esa entIdad.
%1"?="-1, #& &"-$#3#&,
Las entIdades que poseen las mIsmas propIedades forman conjuntos de entIdades.
Ejemplos de conjuntos de entIdades son los conjuntos: personas, facturas, coches,...
Ana
Pedro
Jos
Mara
Consuelo
Jaime
Lourdes
:<=$-17$
E)0J/0#) +$
$0#"+&+$!
G0#"+&+$!

49/!#*&."10 6RI GJ$%89)! +$ $0#"+&+ N
.)0J/0#) +$ $0#"+&+
En la actualIdad se suele llamar $0#"+&+ a lo que anterIormente se ha defInIdo como
conjunto de entIdades. 0e este modo hablariamos de la entIdad PERS0NAS. |Ientras
que cada persona en concreto seria una )./**$0."& o un $J$%89&* de la entIdad
ersona.
Esa termInologia es la que actualmente vamos a utIlIzar en este manual.
5&<5&,&"-3%$." +5K;$%3 #& 83, &"-$#3#&,
En el modelo entIdad relacIon los conjuntos de entIdades se representan con un
rectngulo dentro del cual se escrIbe el nombre de la entIdad:
:<=$-17$

49/!#*&."10 6WI >$8*$!$0#&."10 +$
9& $0#"+&+ 8$*!)0&
-$<1, #& &"-$#3#&,
>$(/9&*$!= Son las entIdades normales que tIenen exIstencIa por si mIsmas sIn
depender de otras. Su representacIon grfIca es la IndIcada arrIba
Ag,"9$!= Su exIstencIa depende de otras. Es decIr e. Por ejemplo la entIdad
#&*$& 9&,)*&9 solo podr tener exIstencIa sI exIste la entIdad #*&,&J)= Las
entIdades dbIles se presentan de esta forma:
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$*#
;7=<7$ >7"-=7><$

49/!#*&."10 6^I G0#"+&+ +g,"9
()4C4>* 5&83%$1"&,
F=^ &, ="3 5&83%$."
Fepresentan &!)."&.")0$! entre entIdades. Es el elemento del modelo que permIte
relacIonar en si los datos del mIsmo. Por ejemplo, en el caso de que tengamos una
entIdad personas y otra entIdad trabajos. Ambas se realIzan ya que las personas
trabajan y los trabajos son realIzados por personas:
Ana
Pedro
Jos
Mara
Consuelo
Jaime
Lourdes
:<=$-17$
Fontanero
Electricista
Peluquero
Administrativo
;=7"7?-$

49/!#*&."10 6_I $J$%89) +$ *$9&."10
En una relacIon (Chen llamaba conjunto de relacIones a lo que ahora se llama relacIon a
secas) cada ejemplar (relacIon en la termInologia de Chen) asocIa un elemento de una
entIdad con otro de la otra entIdad= G0 /0& *$9&."10 0) 8/$+$0 &8&*$.$* +)! ;$.$!
*$9&.")0&+)! 9)! %"!%)! $J$%89&*$!= Es decIr en el ejemplo anterIor, en la relacIon no
puede aparecer dos veces el mIsmo trabajador asocIado al mIsmo trabajo.
5&<5&,&"-3%$." +5K;$%3
La representacIon grfIca de las entIdades se realIza con un rombo al que se le unen
lineas que se dIrIgen a las entIdades, las relacIones tIenen nombre (se suele usar un
verbo). En el ejemplo anterIor podria usarse como nombre de relacIon, trabajar:
:<=$-17$ ;=7"7?-$ ;=7"7?7=

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!$+#
&?&:<81, #& 5&83%$1"&,
S_YGOG U_]UG NZXUYRNY
Y&83%$." 2$"35$3
S_YGOG U_]UG NZXUYRNY
JNUG
Y&83%$." -&5"35$3
]OSU]NJUJ`G SUXNRU]`G
G`Y
SUXNRU]
X`YR`V`S`Y
Y&83%$." #128&
XN`aUG
SOZXOV`Y
Y&83%$." 5&;8&@$73

49/!#*&."10 -cI O"8)! +$ *$9&.")0$!
>$9&.")0$! V"0&*"&!= Son las relacIones tipIcas. Se trata de relacIones que
asocIan dos entIdades.
>$9&.")0$! O$*0&*"&!= FelacIonan tres entIdades. A veces se pueden sImplIfIcar
en relacIones bInarIas, pero no sIempre es posIble.
>$9&.")0$! n-&*"&!= FelacIonan n entIdades
>$9&.")0$! +),9$!= Se llaman asi a dos relacIones dIstIntas que sIrven para
relacIonar a las mIsmas relacIones. Son las ms dIficIles de manejar ya que al
manIpular las entIdades hay que elegIr muy bIen la relacIonan a utIlIzar para
relacIonar los datos.
>$9&."10 *$29$L";&= Es una relacIon que sIrve para relacIonar ejemplares de la
mIsma entIdad (personas con personas, pIezas con pIezas, etc.)
%35#$"38$#3#
ndIca el numero de relacIones en las que una entIdad puede aparecer. Se anota en
trmInos de:
.&*+"0&9"+&+ %?0"%&= ndIca el numero minImo de asocIacIones en las que
aparecer cada ejemplar de la entIdad (el valor que se anota es de .$*) ) /0),
aunque tenga una cardInalIdad minIma de ms de uno, se IndIca solo un uno)
.&*+"0&9"+&+ %3L"%&= ndIca el numero mxImo de relacIones en las que puede
aparecer cada ejemplar de la entIdad. Puede ser uno, otro valor concreto
mayor que uno (tres por ejemplo) o muchos (se representa con n).
Normalmente la cardInalIdad mxIma es 6 1 0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!$,#
En los esquemas entIdad / relacIon la cardInalIdad se puede IndIcar de muchas formas.
QuIz la ms completa (y la que se utIlIza en este documento es sta) consIste en
anotar en los extremos la cardInalIdad mxIma y minIma de cada entIdad en la relacIon.
Ejemplo de uso de cardInalIdad:
Q_HUJOY`G
`\_NXOG
Q_HUY
(1,n)
(0,1)

49/!#*&."10 -6I E&*+"0&9"+&+$!=
En el ejemplo un jugador tIene una cardInalIdad minIma de 0 (puede no estar en nIngun
equIpo) y una mxIma de 1 (como mucho est en un equIpo, no puede estar en dos a la
vez). Cada equIpo tIene una cardInalIdad minIma de uno (en realIdad seria una
cardInalIdad minIma ms alta, pero se anota un uno) y una mxIma de n (en cada
equIpo hay muchos jugadores)
518&,
A veces en las lineas de la relacIon se IndIcan *)9$!= Los roles representan el papel que
juega una entIdad en una determInada relacIon.
Ejemplo:
RYUIUQUJOY`G RYUIUQUY
(0,1)
(1,n)
jefe
empleado

49/!#*&."10 --I GJ$%89) +$ *)9= ]0 #*&,&J&+)*
8/$+$ !$* ;"!#) .)%) J$2$ ) .)%) $%89$&+) !$(h0
& T/g 9&+) +$ 9& *$9&."10 $!#g
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!'-#
()4C4B* 3-5$2=-1,
0escrIben propIedades de las entIdades y las relacIones. En este modelo se representan
con elIpses, dentro de las cuales se coloca el nombre del atrIbuto. Esa elIpse se une con
una linea a las entIdades. Ejemplo:

49/!#*&."10 -KI D#*",/#)!
-$<1, #& 3-5$2=-1,
%1:<=&,-1
2$.:&
+?&
%$!
&Z)

:L8-$<8&,
Pueden tomar varIos valores (varIos telfonos para el mIsmo clIente):
S]N`VR`G
#$9g2)0)
56I07


1<%$1"38&,
Lo son sI pueden tener valor nulo:
S]N`VR`G
#$9g2)0)
5cI67

$#&"-$;$%3#15 1 %837&
Se trata de uno o ms atrIbutos de una entIdad cuyos valores son unIcos en cada
ejemplar de la entIdad. Se marcan en el esquema subrayando el nombre del
IdentIfIcador.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!'%#
Para que un atrIbuto sea consIderado un buen IdentIfIcador tIene que cumplIr con los
sIguIentes requIsItos:
!'# 0eben dIstInguIr a cada ejemplar de la entIdad o relacIon. Es decIr no puede
haber dos ejemplares con el mIsmo valor en el IdentIfIcador.
!(# Todos los ejemplares de una entIdad deben tener el mIsmo IdentIfIcador.
!)# Un IdentIfIcador puede estar formado por ms de un atrIbuto.
!*# Puede haber varIos IdentIfIcadores canddatos, en ese caso hay que elegIr el que
tenga ms ImportancIa en nuestro sIstema (el resto pasan a ser alternatIvos).
Todas las entIdades deben de tener un IdentIfIcador, en el caso de que una entIdad no
tenga IdentIfIcador en sus atrIbutos (puede ocurrIr, pero hay que ser cauteloso, a veces
se trata de entIdades que estn mal modeladas) entonces hay que aadIr un atrIbuto
que haga de IdentIfIcador. El nombre de este atrIbuto artIfIcIal es la palabra "+ seguIda
del nombre de la entIdad. Por ejemplo "+i8$*!)0&!.
$#&"-$;$%3#15 38-&5"3-$71
Se trata de uno o ms campos cuyos valores son unIcos para cada ejemplar de una
entIdad, pero que no son IdentIfIcadores ya que exIsten IdentIfIcadores mejores en la
entIdad. En este caso los candIdatos es aconsejable marcarlos con un subrayado
dIscontInuo (ejemplo de subrayado dIscontInuo)
()4C4C* :1#&81 &"-$#3# 5&83%$." &@-&"#$#1
En el modelo entIdad relacIon extendIdo aparecen nuevos tIpos de relacIones. Son las
*$9&.")0$! 4<D (es un) y las $0#"+&+$! +g,"9$!
5&83%$1"&, NGU 1 5&83%$1"&, #& 6&5&"%$3
Son relacIones que IndIcan tIpos de entIdades, es decIr tendremos entIdades que son un
("! &, en Ingls) tIpo de entIdad.
Se utIlIzan para unIfIcar entIdades agrupndolas en una entIdad ms general
(($0$*&9"d&."10) o bIen para dIvIdIr una entIdad general en entIdades ms especifIcas
($!8$."2".&."10): aunque hoy en dia a todas ellas se las suele llamar generalIzacIon e
Incluso *$9&.")0$! +$ :$*$0."&=
Se habla de !/8$*$0#"+&+ refIrIndonos a la entIdad general sobre las que derIvan
las otras (que se llaman !/,$0#"+&+$!). En la superentIdad se IndIcan los atrIbutos
comunes a todas las subentIdades, se sobreentIende que las subentIdades tambIn
tIenen esos atrIbutos, pero no se IndIca en el dIagrama.
Normalmente cuando tenemos una especIalIzacIon las subentIdades comparten clave
con la !/8$*$0#"+&+ (adems de los atrIbutos comunes); esto es muy matIzable y de
hecho hoy en dia nIngun dIseador Intenta dIstInguIr entre sI tenemos una
especIalIzacIon o una generalIzacIon, porque al fInal ambas ImplIcan los mIsmos
resultados. Si Interesan otras cuestIones en las relacIones SA.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!'"#
En la prctIca se manejan casI Igual ambas; la forma clsIca de representar una SA es:

49/!#*&."10 -MI >$9&."10 4<D= jU$0$*&9"d&."10 )
$!8$."&9"d&."10k G0 9& 8*3.#".& 0) "%8)*#&
En general se suelen IndIcar las cardInalIdades en las relacIones SA, pero se suele
sobreentender (cuando no se IndIcan explicItamente) que hay un (0,1) encIma de cada
subentIdad (que sIgnIfIca que cada ejemplar de la subentIdad solo puede relacIonarse
como mucho con uno de la subentIdad e Incluso con nInguno; un empleado de ersonal
podria ser o no ser un rojesor).
Pero se puede perfectamente IndIcar la cardInalIdad (se usa ya la notacIon de SA
con trIngulo hacIa abajo que es la ms popular en Espaa actualmente):

49/!#*&."10 -PI GJ$%89) +$ *$9&."10 4<D
0e hecho cualquIer cardInalIdad seria vlIda (aunque lo normal es que solo aparezcan
ceros y unos).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!'$#

49/!#*&."10 -RI G0 $!#& *$9&."10 +$ :$*$0."&I 9& .9&;$ +$ 9&
!/8$*$0#"+&+ $! .9&;$ +$ 9&! !/,$0#"+&+$!=
En la relacIon SA anterIor, los profesores, bedeles y tcnIcos heredan el atrIbuto d
ersonal y el nombre, el resto son atrIbutos propIos solo de cada entIdad (trenos
pertenece solo a los profesores, en este ejemplo)

49/!#*&."10 -WI F& .9&;$ +$ 9& !/8$*$0#"+&+ 0) $! .9&;$ +$ 9&!
!/,$0#"+&+$!=
En la IlustracIon anterIor se utIlIza una clave dIstInta para cada subentIdad (es decIr,
dscos, lbros y merchandsny tIenen clave propIa), no la heredan.
Es posIble tener esta sItuacIon Incluso (aunque no es muy habItual):

49/!#*&."10 -^I A"!.)!I F",*)! N S$*.:&0+"!"0( 0) !$ *$9&.")0&0
),9"(&#)*"&%$0#$ .)0 9& !/8$*$0#"+&+ D*#?./9)!
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!''#
Es un caso en el que no hay relacIon oblIgatorIa con la superentIdad; es decIr, un dsco
podria no ser un artculo (porque a lo mejor quIero meter dIscos en mI base de datos
que no vendo). No es muy habItual utIlIzar de esta forma relacIones SA, pero desde
luego es posIble.
En muchas ocasIones no se IndIcan las cardInalIdades y se sobrentIende que la
superentIdad tIene un 1,1 y las subentIdades 0,1.

49/!#*&."10 -_I D 9& +$*$.:& $9 %"!%) (*32".) G0#"+&+ >$9&."10 !"0 "0+".&* 9&! .&*+"0&9"+&+$!= <$
!),*$0#"$0+$ T/$ !)0 9&! +$ 9& "dT/"$*+&

&@%8=,$7$#3#
En las relacIones SA (y tambIn en otros tIpos de relacIones) se puede IndIcar el hecho
de que cada ejemplar solo puede partIcIpar en una de entre varIas ramas de una
relacIon. Este hecho se marca con un &*.) entre las dIstIntas relacIones. En las
relacIones SA se usa mucho, por ejemplo:

49/!#*&."10 KcI >$9&."10 4<D .)0 ),9"(&#)*"$+&+
En el ejemplo, el personal solo puede ser o bedel, o profesor o tcnIco; una y solo una
de las tres cosas (es por cIerto la forma ms habItual de relacIon SA).

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!'(#
-$<1, #& 5&83%$1"&, NGU
Fealmente lo que hay que matIzar bIen en las relacIones SA es la forma de relacIonarse
la superentIdad con la subentIdad. Eso se matIza en base a dos conceptos:
\,9"(&#)*"$+&+. ndIca sI los ejemplares oblIgatorIamente se relacIonan con
ejemplares de las subentIdades. Es decIr sI hay personal que no es profesor nI
bedel nI tcnIco o sI fIjo es alguna de esas tres profesIones. Hay dos
posIbIlIdades:
- >$9&.")0$! +$ J$*&*T/?& 8&*."&9= ndIcan que hay ejemplares de la
superentIdad que no se relacIonan con nInguna subentIdad (hay personal
que no es nI profesor, no bedel nI tcnIco). Se IndIcan con cardInalIdad
minIma de cero en la superentIdad.
- >$9&.")0$! +$ J$*&*T/?& #)#&9= ndIcan que todos los ejemplares de la
superentIdad se relacIonan con alguna subentIdad (no hay personal que no
sea nI profesor, nI bedel nI tcnIco). Se IndIcan con cardInalIdad minIma de
uno en la superentIdad.
Xh%$*) +$ *$9&.")0$!. En este caso se mIde con cuntas subentIdades se
relacIona la subentIdad; es decIr, sI hay personal que pueda ser profesor y
bedel a la vez o sI solo puede ser una cosa. PosIbIlIdades:
- >$9&.")0$! +$ J$*&*T/?& !)9&8&+&= ndIcan que un ejemplar de la
superentIdad puede relacIonarse con ms de una subentIdad (el personal
puede ser profesor y bedel). Dcurren cuando no hay dIbujado un arco de
exclusIvIdad.
- >$9&.")0$! +$ J$*&*T/?& $L.9/!";&= ndIcan que un ejemplar de la
superentIdad solo puede relacIonarse con una subentIdad (el personal no
puede ser profesor y bedel). Dcurren cuando hay dIbujado un arco de
exclusIvIdad.
La forma grfIca ms aceptada actualmente para representar este tIpo de relacIones,
seria la sIguIente:
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ 67 gestIon y dIseo de bases de datos
!')#

49/!#*&."10 K6I O"8)! +$ *$9&.")0$! 4<D
Todos los posIbles ejemplos de relacIones SA atendIendo a la cardInalIdad son los
expuestos en la lustracIon J1
&"-$#3#&, #^2$8&,
Ya se ha comentado antes que una entIdad dbIl es aquella cuya exIstencIa depende de
otra. Ahora vamos a clarIfIcar ms estas entIdades. EfectIvamente ocurren cuando hay
una entIdad ms fuerte de la que dependen. LogIcamente tIenen relacIon con esa
entIdad. En la forma clsIca se representaria de esta forma:

49/!#*&."10 K-I >$9&."10 .&0+"+&#& & $0#"+&+ +g,"9
En el dIagrama la relacIon entre las tareas y los trabajos es 1 a n (cada trabajo se
compone de n tareas). Una tarea oblIgatorIamente est asIgnada a un trabajo, es ms
no tIene sentIdo hablar de tareas sIn hablar del trabajo del que forma parte.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!'*#
Hay Incluso (aunque no sIempre) una +$8$0+$0."& +$ "+$0#"2".&."10 ya que las
tareas se IdentIfIcan por un numero de tarea y el numero de trabajo al que se asIgnan.
Esto es un sintoma defInItIvo de que se trata de una entIdad dbIl.
Todas las entIdades dbIles tIenen este tIpo de relacIon 1 a n con respecto a la
entIdad fuerte de la que depende su exIstencIa, por eso se representan de esta otra
forma:

49/!#*&."10 KKI G0#"+&+ +g,"9 *$9&.")0&+& .)0 !/ $0#"+&+ 2/$*#$
No hace falta dIbujar el rombo de la relacIon nI la cardInalIdad, se sobreentIende el tIpo
y cardInalIdad (1 a n) que posee. No sIempre el IdentIfIcador de la entIdad dbIl Incluye
el IdentIfIcador de la entIdad fuerte; cuando ocurre se habla de una +$8$0+$0."& +$
"+$0#"2".&."10, pero no todas las entIdades dbIles las poseen.
!',#

(9*
23,&, #& #3-1,
5&83%$1"38&,
(94)* &8 :1#&81 5&83%$1"38
(94)4)* $"-51#=%%$."
G+(&* H*&0f E)++ defInIo las bases del modelo relacIonal a fInales de los 60. En 1970
publIca el documento A Relational Model of data for Large Shared Data Banks
(Un modelo relaconal de datos ara yrandes bancos de datos comartdos).
Actualmente se consIdera que ese es uno de los documentos ms Influyentes de toda la
hIstorIa de la InformtIca. Lo es porque en l se defInIeron las bases del llamado S)+$9)
>$9&.")0&9 +$ V&!$! +$ A&#)!= AnterIormente el unIco modelo teorIco estandarIzado era
el E)+&!N9 que se utIlIzo masIvamente en los aos 70 como paradIgma del modelo en
red de bases de datos.
Codd se apoya en los trabajos de los matemtIcos E&0#)* y E:"9+! (cuya teoria de
conjuntos es la verdadera base del modelo relacIonal). Segun Codd los datos se agrupan
en *$9&.")0$! (actualmente llamadas #&,9&!) que es un concepto que se refIere a la
estructura que aglutIna datos referIdos a una mIsma entIdad de forma IndependIente
respecto a su almacenamIento fisIco.
Lo que Codd Intentaba fundamentalmente es evItar que las usuarIas y usuarIos de la
base de datos tuvIeran que verse oblIgadas a aprender los entresIjos Internos del
sIstema. Pretendia que los usuarIos/as trabajaran de forma sencIlla e IndependIente del
funcIonamIento fisIco de la base de datos en si. Fue un enfoque revolucIonarIo.
Aunque trabajaba para 4VS, esta empresa no recIbIo de buen grado sus
teorias (de hecho contInuo trabajando en su modelo en red 4S<). 0e hecho
fueron otras empresas (en especIal \*&.9$) las que Implementaron sus teorias.
Pocos aos despus el modelo se empezo a utIlIzar cada vez ms, hasta
fInalmente ser el modelo de bases de datos ms popular. Hoy en dia casI todas
las bases de datos sIguen este modelo.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!(-#

(94)49* 12?&-$71,
Codd perseguia estos objetIvos con su modelo:
40+$8$0+$0."& 2?!".&. La forma de almacenar los datos, no debe InfluIr en su
manIpulacIon logIca. SI la forma de almacenar los datos cambIa, los usuarIos no
tIenen sIquIera porque percIbIrlo y seguIrn trabajando de la mIsma forma con
la base de datos. Esto permIte que los usuarIos y usuarIas se concentren en qu
quIeren consultar en la base de datos y no en como est realIzada la mIsma.
40+$8$0+$0."& 91(".&. Las aplIcacIones que utIlIzan la base de datos no deben
ser modIfIcadas porque se modIfIquen elementos de la base de datos. Es decIr,
aadIr, borrar y suprImIr datos, no Influye en las vIstas de los usuarIos. 0e una
manera ms precIsa, gracIas a esta IndependencIa el esquema externo de la
base de datos es realmente IndependIente del modelo logIco.
H9$L","9"+&+. La base de datos ofrece fcIlmente dIstIntas vIstas en funcIon de
los usuarIos y aplIcacIones.
]0"2)*%"+&+. Las estructuras logIcas sIempre tIenen una unIca forma
conceptual (las tablas).
<$0."99$d. FacIlIdad de manejo (algo cuestIonable, pero cIertamente verdadero
sI comparamos con los sIstemas gestores de bases de datos anterIores a este
modelo).
(94)4>* 6$,-15$3 #&8 :1#&81 5&83%$1"38
Ao Hecho
6_Wc Codd publIca las bases del modelo relacIonal
6_W6eW- PrImeros desarrollos teorIcos
6_WKeW^ PrImeros prototIpos de base de datos relacIonal. Son el
<N!#$% > de 8|. En ese sIstema se desarrolla <$T/$9 que
con el tIempo cambIar su nombre a SQL.
6_WM La UnIversIdad de 8erkeley desarrolla 40(*$!, SC80
relacIonal basado en clculo relacIonal. UtIlIzaba el
lenguaje [/$9 desarrollado en las unIversIdades y muy
popular en la poca en mbItos acadmIcos.
6_W^ Aparece el lenguaje [VG (Query y Examle) lenguaje
de acceso relacIonal a los archIvos l<DS de 8|
6_W_ Aparece \*&.9$, el prImer SC80 comercIal relacIonal
(ganando en unas semanas al <N!#$%YK^ de 8|).
mplementa SQL y se convertIr en el sIstema gestor de
bases de datos relacIonales lider del mercado.
Codd revIsa su modelo relacIonal y lanza el modelo >SYO
como un Intento de subsanar sus defIcIencIas.
6_^6 Aparece 402)*%"L como SC80 relacIonal para UnIx
6_^K Aparece AV-, el sIstema gestor de bases de datos
relacIonales de 8|
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!(%#
Ao Hecho
6_^M Aparece la base de datos <N,&!$ que llego a ser la
segunda ms popular (tras Dracle)
6_^R ANS normalIza el SQL (<[FYDX<4). SQL es ya de hecho el
lenguaje prIncIpal de gestIon de bases de datos
relacIonales.
6_^W SD tambIn normalIza SQL. Es el <[F 4<\(9075)
6_^^ La versIon 6 de Dracle Incorpora el lenguaje
procedImental @FY<[F
6_^_ SD revIsa el estndar y publIca el estndar <[F
D++$0+/%=
S".*)!)2# y <N,&!$ desarrollan <[F <$*;$* para el sIstema
operatIvo \<Y- de |Icrosoft e 4VS. 0urante aos Sybase y
SQL Server fueron el mIsmo producto.
6__c 7ersIon dos del modelo relacIonal (>SYl-) realIzada por
Codd.
Propuesta de S".:&$9 <#)0$,*&f$* para aadIr al modelo
relacIonal capacIdades de orIentacIon a objetos.
6__- SD publIca el estndar <[F _- (todavia el ms utIlIzado)
6__P |anIfIesto de A&*C$0 y A&#$ en el que anIman a
reInterpretar el modelo relacIonal desde una perspectIva
de objetos. Aparece el modelo objeto/relacIonal.
Aparece SN<[F una base de datos relacIonal de codIgo
abIerto con lIcencIa CNU que se hace muy popular entre
los desarrolladores de pgInas web.
6__R ANS normalIza el lenguaje procedImental basado en SQL y
lo llaman <[FY@<S. PermIte tcnIcas propIas de los
lenguajes de programacIon estructurada.
Aparece el SC80 abIerto @)!#(*$<[F como remodelacIon
de la antIgua ngres, utIlIzando de forma natIva el
lenguaje SQL (en lugar de Quel).
6___ SD publIca un nuevo estndar que Incluye caracteristIcas
ms avanzadas. Se llama <[F __ (tambIn se le conoce
como SQL 200)
-ccK SD publIca el estndar <[F -ccK= En l se aade SQL/PS|
al estndar.
-ccR Estndar SD. <[F -ccR
-cc^ Estndar SD. <[F -cc^
-c66 Estndar SD. <[F -c66

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!("#

(949* &,-5=%-=53 #& 83, 23,&, #& #3-1,
5&83%$1"38&,
(9494)* 5&83%$." 1 -3283
Segun el modelo relacIonal (desde que Codd lo enuncIo) el elemento fundamental es lo
que se conoce como *$9&."10, aunque ms habItualmente se le llama #&,9& (o tambIn
array o matrIz). Codd defInIo las relacIones utIlIzando un lenguaje matemtIco, pero se
pueden asocIar a la Idea de tabla (de fIlas y columnas) ya que es ms fcIl de entender.
No hay que confundIr la Idea de relacIon segun el modelo de E)++, con lo que sIgnIfIca
una relacIon en el modelo EntIdad/FelacIon de E:$0= No tIenen nada que ver
Las relacIones constan de:
D#*",/#)!. FeferIdo a cada propIedad de los datos que se almacenan en la
relacIon (nombre, dnI,...).
O/89&!= FeferIdo a cada elemento de la relacIon. Por ejemplo sI una relacIon
almacena personas, una tupla representaria a una persona en concreto.
Puesto que una relacIon se representa como una tabla; podemos entender que las
columnas de la tabla son los atrIbutos; y las fIlas, las tuplas.

atrIbuto 1 atrIbuto 2 atrIbuto J .... atrIbuto n
valor 1,1 valor 1,2 valor 1,J .... valor 1,n #/89& 6
valor 2,1 valor 2,2 valor 2,J .... valor 2,n #/89& -
===== ===== ...... ==== ..... ....
valor m,1 valor m,2 valor m,J .... valor m,n #/89& %
La tabla superIor representa la estructura de una relacIon segun el modelo de Codd.
(94949* -=<83
Cada una de las fIlas de la relacIon. Se corresponde con la Idea clsIca de *$("!#*).
Fepresenta por tanto cada elemento IndIvIdual de esa relacIon. TIene que cumplIr que:
Cada tupla se debe corresponder con un elemento del mundo real.
No puede haber dos tuplas Iguales (con todos los valores Iguales).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!($#

(9494>* #1:$"$1
Un domInIo contIene todos los posIbles valores que puede tomar un determInado
atrIbuto. 0os atrIbutos dIstIntos pueden tener el mIsmo domInIo.
Un domInIo en realIdad es un conjunto fInIto de valores del mIsmo tIpo. A los
domInIos se les asIgna un nombre y asi podemos referIrnos a ese nombre en ms de un
atrIbuto, facIlItando la defInIcIon de los mIsmos.
La forma de IndIcar el contenIdo de un domInIo se puede hacer utIlIzando dos
posIbles tcnIcas:
40#$0!"10= Se defIne el nomIno IndIcando la defInIcIon exacta de sus posIbles
valores. Por IntensIon se puede defInIr el domInIo de edades de los
trabajadores como: nmeros enteros entre el 16 y el 65 (un trabajador solo
podria tener una edad entre 16 y 65 aos).
GL#$0!"10. Se IndIcan algunos valores y se sobreentIende el resto gracIas a que
se autodefInen con los anterIores. Por ejemplo el domInIo localIdad se podria
defInIr por extensIon asi: Palenca, Valladold, Vllamurel de Cerrato,...
Adems pueden ser:
U$0$*&9$!. Los valores estn comprendIdos entre un mxImo y un minImo
>$!#*"0("+)!. Solo pueden tomar un conjunto de valores
(9494B* +53#1
ndIca el tamao de una relacIon en base al numero de columnas (atrIbutos) de la
mIsma. LogIcamente cuanto mayor es el grado de una relacIon, mayor es su complejIdad
al manejarla.
(9494C* %35#$"38$#3#
Numero de tuplas de una relacIon, o numero de fIlas de una tabla.
(9494D* ,$"."$:1,
Los trmInos vIstos anterIormente tIenen dIstIntos sInonImos segun la nomenclatura
utIlIzada. A ese respecto se utIlIzan tres nomenclaturas:
1rm|no: I
(nomenc|oturo re|oc|ono|)
1rm|no: 2
(nomenc|oturo tob|o)
1rm|no: 1
(nomenc|oturo f|chero:)
*$9&."10 m #&,9& m 2".:$*)
#/89& m 2"9& m *$("!#*)
&#*",/#) m .)9/%0& m .&%8)
(*&+) m 0n +$ .)9/%0&! m 0n +$ .&%8)!
.&*+"0&9"+&+ m 0n +$ 2"9&! m 0n +$ *$("!#*)!
Se han subrayado en la tabla los trmInos que se usan ms.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!('#

(9494E* #&;$"$%$." ;15:38 #& 5&83%$."
Una relacIon est formada por estos elementos:
X)%,*$= dentIfIca la relacIon.
E&,$.$*& +$ *$9&."10= Conjunto de todos los pares atrIbutodomIno de la
relacIon:
( ) { }
D A i i
n
i
:
1 =

donde n es el (*&+).
E/$*8) +$ 9& *$9&."10= Fepresenta el conjunto de m tuplas [t1, t2,... tn] que
forman la relacIon. Cada tupla es un conjunto de n pares atrIbutovalor
( ) { }
V A ij i: , donde V es el valor del domInIo 0 asocIado al atrIbuto A.
G!T/$%& +$ 9& *$9&."10= Se forma con el nombre F y la cabecera. Es decIr:
( ) { }
D A
R
i i
n
i
:
1 =

G!#&+) +$ 9& *$9&."10= Lo forman el esquema y el cuerpo.
Ejemplo:

@4)*5&*(
!1A 1'+B/* <6%6
12JJJ944C Ana 52
12J74678C Eva 27
282J82J2H |artin JJ
G!T/$%&! E9"$0#$50N:AX4I Nombre:X)%,*$, Edad:G+&+7
E/$*8)C o50N: 12333944C, Nombre:Ana, Edad:52), (DNI: 12374678G,
Nombre:Eva, Edad;52), (DNI: 282J82J2H, Nombre:Martn,Edad:33)}
(9494b* <51<$&#3#&, #& 83, -3283, (1 5&83%$1"&,*
Cada tabla tIene un nombre dIstInto
Cada atrIbuto de la tabla toma un solo valor en cada tupla
Cada atrIbuto tIene un nombre dIstInto en cada tabla (aunque puede coIncIdIr
en tablas dIstIntas)
Cada tupla es unIca (no hay tuplas duplIcadas)
El orden de los atrIbutos no Importa
El orden de las tuplas no Importa
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!((#

(9494c* -$<1, #& -3283,
@$*!"!#$0#$!= Solo pueden ser borradas por los usuarIos:
- V&!$!. ndependIentes, se crean IndIcando su estructura y sus ejemplares.
ContIenen tanto datos como metadatos.
- l"!#&!. Son tablas que solo almacenan una defInIcIon de consulta, resultado
de la cual se produce una tabla cuyos datos proceden de las bases o de
otras vIstas e Instantneas. SI los datos de las tablas base cambIan, los de
la vIsta que utIlIza esos datos tambIn cambIa.
- 40!#&0#30$&!. Son vIstas (creadas de la mIsma forma) que si que almacenan
los datos que muestra, adems de la consulta que dIo lugar a esa vIsta.
Solo modIfIcan su resultado (actualIzan los datos) sIendo refrescadas por el
sIstema cada cIerto tIempo (con lo que tIenen el rIesgo de que muestren
algunos datos obsoletos.
O$%8)*&9$!. Son tablas que se elImInan automtIcamente por el sIstema.
Pueden ser de cualquIera de los tIpos anterIores. Las utIlIza el SC80 como
almacn IntermedIo de datos (resultados de consultas, por ejemplo)
(9494)d* %837&,
%837& %3"#$#3-3
Conjunto de atrIbutos que IdentIfIcan univocamente cada tupla de la relacIon. Es decIr
columnas cuyos valores no se repIten en nInguna otra tupla de esa tabla. Toda tabla en
el modelo relacIonal debe tener al menos una clave candIdata (puede Incluso haber
ms)
%837& <5$:35$3
Clave candIdata que se escoge como "+$0#"2".&+)* de las tuplas. Se elIge como prImarIa
la candIdata que IdentIfIque mejor a cada tupla en el contexto de la base de datos.
Por ejemplo un campo con el 0Nl seria clave candIdata de una tabla de clIentes, sI
esa tabla tIene un campo de cdyo de clente, ste seria mejor candIdato (y por lo
tanto clave prIncIpal) porque es mejor IdentIfIcador para ese contexto.
%837& 38-&5"3-$73
CualquIer clave candIdata que no sea prImarIa.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!()#

%837& &@-&5"3e 3?&"3 1 ,&%="#35$3
Son los datos de atrIbutos de una tabla cuyos valores estn relacIonados con atrIbutos
de otra tabla. Por ejemplo en la tabla equIpos tenemos estos datos:
<D9).' 1E <D9).'
Feal |adrId 1
F.C. 8arcelona 2
AthletIc 8Ilbao J
En la tabla anterIor la clave prIncIpal es el atrIbuto 0n $T/"8)= En otra tabla tenemos:
1E ?9F%6'/ ?9F%6'/ 1E <D9).'
1 Karanka J
2 FonaldInho 2
J Faul 1
4 8eckham 1
El atrIbuto N Equo sIrve para relacIonar el Jugador con el equIpo al que pertenece.
Ese campo en la tabla de jugadores es una clave secundarIa.
(9494))* "=81,
En los lenguajes de programacIon se utIlIza el valor nulo para reflejar que un
IdentIfIcador (una varIable, un objeto,..) no tIene nIngun contenIdo. Por ejemplo
cuando un puntero en lenguaje C seala a 0/99 se dIce que no est sealando a nadIe. Al
programar en esos lenguajes se trata de un valor que no permIte utIlIzarse en
operacIones arItmtIcas o logIcas.
Las bases de datos relacIonales permIten ms posIbIlIdades para el valor nulo (0/99),
aunque su sIgnIfIcado no cambIa: valor vacio. No obstante en las bases de datos se
utIlIza para dIversos fInes.
En claves secundarIas IndIcan que el regIstro actual no est relacIonado con nInguno.
En otros atrIbutos IndIca que la tupla en cuestIon carece de dIcho atrIbuto: por ejemplo
en una tabla de ersonas un valor nulo en el atrIbuto teljono IndIcaria que dIcha
persona no tIene telfono.
Es Importante IndIcar que el texto vacio , no sIgnIfIca lo mIsmo en un texto que el
nulo; como tampoco el valor cero sIgnIfIca nulo.
Puesto que ese valor se utIlIza contInuamente, resulta ImprescIndIble saber como
actua cuando se emplean operacIones logIcas sobre ese valor. Eso sIgnIfIca defInIr un
tercer valor en la logIca booleana, adems de los clsIcos ;$*+&+$*) y 2&9!). Un valor
nulo no es nI verdadero nI falso (se suele Interpretar como un quzs, o usando la
arItmtIca clsIca en valores logIcos, el 1 es verdadero, el 0 falso y el 0,5 nulo).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!(*#

El uso de operadores logIcos con el nulo da lugar a que:
;$*+&+$*) a 5DXA7 0/9) da como resultado, nulo
(sIguIendo la arItmtIca planteada antes: 10,5=0,5)
2&9!) a 5DXA7 0/9) da como resultado, falso (00,5=0)
;$*+&+$*) \ 5\>7 0/9) da como resultado, verdadero (1+0,5>1)
2&9!) \ 0/9) da como resultado nulo (0+0,5=0,5)
9& 0$(&."10 +$ 0/9)I da como resultado nulo
Se utIlIza un operador en todas las bases relacIonales llamado $! 0/9) (s null) que
devuelve verdadero sI el valor con el que se compara es nulo.
(94>* 5&,-5$%%$1"&,
Se trata condIcIones de oblIgado cumplImIento por las tuplas de la base de datos. Las
hay de varIos tIpos.
(94>4)* $"6&5&"-&,
Son aquellas que no son determInadas por los usuarIos, sIno que son defInIdas por el
hecho de que la base de datos sea relacIonal. Las ms Importantes son:
X) 8/$+$ :&,$* +)! #/89&! "(/&9$!
G9 )*+$0 +$ 9&! #/89&! 0) $! !"(0"2".&#";)
G9 )*+$0 +$ 9)! &#*",/#)! 0) $! !"(0"2".&#";)
E&+& &#*",/#) !19) 8/$+$ #)%&* /0 ;&9)* $0 9& #/89& N +)%"0") $0 $9 T/$ $!#3
"0!.*"#)
(94>49* ,&:K"-$%3,
El modelo relacIonal permIte a los usuarIo Incorporar restrIccIones personales a los
datos. Se comentan las dIferentes reglas semntIcas a contInuacIon:
%837& <5$"%$<38 (<5$:35/ f&/*
TambIn llamada clave prImarIa. |arca uno o ms atrIbutos como IdentIfIcadores de la
tabla. 0e esa forma en esos atrIbutos las fIlas de la tabla no podrn repetIr valores nI
tampoco dejarlos vacios.
="$%$#3# (="$F=&*
mpIde que los valores de los atrIbutos marcados de esa forma, puedan repetIrse. Esta
restrIccIon debe IndIcarse en todas las claves alternatIvas.
Al marcar una clave prImarIa se aade automtIcamente sobre los atrIbutos que
forman la clave un crIterIo de unIcIdad.
128$+3-15$&#3# ("1- "=88*
Prohibe que el atrIbuto marcado de esta forma quede vacio (es decIr ImpIde que pueda
contener el valor nulo, 0/99).
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!(+#
$"-&+5$#3# 5&;&5&"%$38 (;15&$+" f&/*
SIrve para IndIcar una clave externa (tambIn llamada secundarIa y fornea) sobre uno o
ms atrIbutos. Los atrIbutos marcados de esta forma solo podrn contener valores que
estn relacIonados con la clave prIncIpal de la tabla que relacIonan (llamada tabla
prIncIpal). 0Ichos atrIbutos si podrn contener valores nulos.
Es decIr sI hay una tabla de alquIleres en la que cada fIla es un alquler, exIstIr un
atrIbuto cod_clente que IndIcar el cdyo del clente y que estar relacIonado con
una tabla de clentes, en la que dIcho atrIbuto es la clave prIncIpal. 0e hecho no se
podr IncluIr un codIgo que no est en la tabla clIentes; eso es lo que prohibe la
IntegrIdad referencIal.





49/!#*&."10 KMI GJ$%89) +$ .9&;$ !$./0+&*"&
Eso causa problemas en las operacIones de borrado y modIfIcacIon de regIstros; ya que
sI se ejecutan esas operacIones sobre la tabla prIncIpal (sI se modIfIca o borra un
clIente) quedarn fIlas en la tabla secundarIa con la clave externa hacIendo referencIa a
un valor que ya no exIste en la tabla prIncIpal.
Para solventar esta sItuacIon se puede hacer uso de estas opcIones:
@*):","* 9& )8$*&."10 (no acton).
O*&0!%"#"* 9& )8$*&."10 $0 .&!.&+& (cascade). Es decIr sI se modIfIca o borra
un clIente; tambIn se modIfIcarn o barrarn los alquIleres relacIonados con
l.
E)9).&* 0/9)! (set null) Las referencIas al clIente en la tabla de alquIleres se
colocan como nulos (es decIr, alquIleres sIn clIente).
]!&* $9 ;&9)* 8)* +$2$.#) (dejault). Se colocan un valor por defecto en las
claves externas relacIonadas. Este valor se IndIca al crear la tabla (opcIon
+$2&/9#).
5&+83 #& 738$#3%$." (%6&%f*
CondIcIon logIca que debe de cumplIr un dato concreto para darlo por vlIdo. Por
ejemplo restrIngIr el campo sueldo para que sIempre sea mayor de 1000, seria una regla
de valIdacIon. TambIn por ejemplo que la fecha de InIcIo sea mayor que la fecha fInal.
AlquIleres
Cod_alquIler Fecha cod_clIente
1 12/9/2008 121
2 12/9/2008 121
J 15/9/2008 97
4 16/9/2008 11J
5 16/9/2008 129
ClIentes
Cod_clIente Nombre ApellIdos
97 Arturo Crespo
11J Sara Alvarez
121 Josu LopetegI
12J Alba PereIra
129 Conzalo Prez
Clave secundarIa
Clave prIncIpal
Clave prIncIpal
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!(,#
#$,<353#15&, 1 -5$++&5,
Se trata de pequeos programas grabados en la base de datos que se ejecutan
automtIcamente cuando se cumple una determInada condIcIon. SIrven para realIzar
una serIe de accIones cuando ocurre un determInado evento (cuando se aade una
tupla, cuando se borra un dato, cuando un usuario abre una conexin)
Los trIggers permIten realIzar restrIccIones muy potentes; pero son las ms dIficIles
de crear.
(94B* 83, )9 5&+83, #& S1##
Preocupado por los productos que decian ser sIstemas gestores de bases de datos
relacIonales (>AVS<) sIn serlo, Codd publIca las 12 reglas que debe cumplIr todo 08|S
para ser consIderado relacIonal. Estas reglas en la prctIca las cumplen pocos sIstemas
relacIonales. Las reglas son:
!%# 402)*%&."10. Toda la InformacIon de la base de datos (%$#&+&#)!) debe estar
representada explicItamente en el esquema logIco. Es decIr, #)+)! los datos
estn en las tablas.
!"# D..$!) (&*&0#"d&+). Todo +&#) es accesIble sabIendo el valor de su clave y el
nombre de la columna o atrIbuto que contIene el dato.
!$# O*&#&%"$0#) !"!#$%3#".) +$ 9)! ;&9)*$! 0/9)!. El 08|S debe permItIr el
tratamIento adecuado de estos valores. 0e ese modo el valor nulo se utIlIza para
representar la ausencIa de InformacIon de un determInado regIstro en un
atrIbuto concreto.
!'# E&#39)() $0 9?0$& ,&!&+) $0 $9 %)+$9) *$9&.")0&9= Los metadatos deben de ser
accesIbles usando un esquema relacIonal. Es decIr la forma de acceder a los
metadatos es la mIsma que la de acceder a los datos.
!(# </,9$0(/&J$ +$ +&#)! .)%89$#). Al menos debe de exIstIr un lenguaje que
permIta el manejo completo de la base de datos. Este lenguaje, por lo tanto,
debe permItIr realIzar cualquIer operacIon sobre la mIsma.
!)# D.#/&9"d&."10 +$ ;"!#&!= El SC80 debe encargarse de que las vIstas muestren la
ultIma InformacIon. No son vlIdas vIstas que muestren datos que no estn al
dia.
!*# 40!$*.")0$!I %)+"2".&.")0$! N $9"%"0&.")0$! +$ +&#) 0";$9= CualquIer operacIon
de modIfIcacIon debe actuar sobre conjuntos de fIlas o regIstros, nunca deben
actuar regIstro a regIstro.
!+# 40+$8$0+$0."& 2?!".&= Los datos deben de ser accesIbles desde la logIca de la
base de datos, aun cuando se modIfIque el almacenamIento. La forma de
acceder a los datos no varia porque el esquema fisIco de la base de datos,
cambIe.
!,# 40+$8$0+$0."& 91(".&= Los programas no deben verse afectados por cambIos en
las tablas. Que las tablas cambIen no ImplIca que cambIen los programas.
!%-# 40+$8$0+$0."& +$ "0#$(*"+&+= Las reglas de IntegrIdad deben almacenarse en la
base de datos (en el +"..")0&*") +$ +&#)!7I no en los programas de aplIcacIon.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!)-#
!%%# 40+$8$0+$0."& +$ 9& +"!#*",/."10= El sublenguaje de datos debe permItIr que sus
InstruccIones funcIonen Igualmente en una base de datos dIstrIbuIda que en una
que no lo es.
!%"# X) !/,;$*!"10. SI el SC80 posee un lenguaje procedImental que permIta crear
bucles de recorrIdo fIla a fIla, ste no puede utIlIzarse para IncumplIr o evItar las
reglas relacIonales anterIores. EspecIalmente la regla 7 no puede ser IncumplIda
por nIngun lenguaje del SC80.
(94C* <3,1 #& &"-$#3#P5&83%$." #& S6&"
38 :1#&81 5&83%$1"38
(94C4)* -53",;15:3%$." #& 83, &"-$#3#&, ;=&5-&,
En prIncIpIo las entIdades fuertes del modelo EntIdad FelacIon son transformados al
modelo relacIonal sIguIendo estas InstruccIones:
G0#"+&+$!= Las entIdades pasan a ser tablas
D#*",/#)!. Los atrIbutos pasan a ser columnas o atrIbutos de la tabla.
4+$0#"2".&+)*$! 8*"0."8&9$!. Pasan a ser claves prImarIas
4+$0#"2".&+)*$! .&0+"+&#)!. Pasan a ser claves candIdatas.
Esto hace que la transformacIon se produzca segun este ejemplo:

49/!#*&."10 KPIO*&0!2)*%&."10 +$ /0& $0#"+&+ 2/$*#$ &9 $!T/$%& *$9&.")0&9
(94C49* -53",;15:3%$." #& 5&83%$1"&,
La Idea InIcIal es transformar cada relacIon del modelo conceptual en una tabla en el
modelo relacIonal. Pero hay casos en los que esta regla tIene matIces y no se cumple.
5&83%$1"&, 735$1, 3 735$1,
En las relacIones varIos a varIos (n a n en la cardInalIdad mayor, la cardInalIdad menor
no cuenta para esta sItuacIon), la relacIon se transforma en una tabla cuyos atrIbutos
son: los atrIbutos de la relacIon y las claves de las entIdades relacIonadas (que pasarn
a ser claves externas). La clave de la tabla la forman todas las claves externas.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!)%#

49/!#*&."10 KRI O*&0!2)*%&."10 +$ /0& *$9&."10 n & n
En el dIbujo anterIor los simbolos x referIdos a la cardInalIdad minIma, IndIcan que sta
no Influye en el paso al modelo relacIonal.
5&83%$1"&, #& 15#&" "
Las relacIones ternarIas, cuaternarIas y n-aras que unen ms de dos relacIones se
transforman en una tabla que contIene los atrIbutos de la relacIon ms los
IdentIfIcadores de las entIdades relacIonadas. La clave la forman todas las claves
externas:

49/!#*&."10 KWI O*&0!2)*%&."10 $0 $9 %)+$9) *$9&.")0&9 +$ /0& $0#"+&+ 0e&*"&
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!)"#
5&83%$1"&, ="1 3 735$1,
Las relacIones bInarIos de tIpo uno a varIos no requIeren ser transformadas en una tabla
en el modelo relacIonal. En su lugar la tabla del lado varos (#&,9& relacIonada) Incluye
como clave externa
1
el IdentIfIcador de la entIdad del lado uno (#&,9& 8*"0."8&9).

49/!#*&."10 K^I O*&0!2)*%&."10 +$ /0& *$9&."10 /0) & ;&*")!
Asi en el dIbujo, el ldentjcador2 en la tabla Entdad1 pasa a ser una clave
secundarIa. En el caso de que el numero minImo de la relacIon sea de cero (puede
haber ejemplares de la entIdad uno sIn relacIonar), se deber permItIr valores nulos en
la clave secundarIa (en el ejemplo seria el dentjcador2 en la Entdad1). En otro caso
no se podrn permItIr (ya que sIempre habr un valor relacIonado).
5&83%$1"&, ="1 3 ="1
En el caso de las relacIones entre dos entIdades con todas las cardInalIdades a 1; hay
dos posIbIlIdades:
Colocar la clave de una de las entIdades como clave externa de la otra tabla
(da Igual cul), tenIendo en cuenta que dIcha clave ser .9&;$ &9#$*0&#";&
adems de ser clave secundarIa.
Cenerar una unIca tabla con todos los atrIbutos de ambas entIdades colocando
como .9&;$ 8*"0."8&9 cualquIera de las claves de las dos entIdades. La otra
clave ser marcada como .9&;$ &9#$*0&#";&. El nombre de la tabla seria el de la
entIdad ms Importante desde el punto de vIsta conceptual.


1
E9&;$ $L#$*0&I .9&;$ &J$0&I .9&;$ 2)*30$&I .9&;$ !$./0+&*"& y joreyn key son sInonImos
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!)$#

49/!#*&."10 K_I F&! +)! !)9/.")0$! ;39"+&! & 9& .&*+"0&9"+&+ 6 &
5&83%$1"&, %&51 3 ="1
Se trata de relacIones entre dos entIdades con cardInalIdad mxIma de 1 en ambas
dIreccIones, pero en una de ellas la cardInalIdad minIma es 0. En este caso la solucIon
dIfIere respecto a la anterIor solucIon. No convIene generar una unIca tabla ya que
habria numerosos valores nulos en la tabla (debIdo a que hay ejemplares que no se
relacIonan en las dos tablas).
La solucIon seria generar dos tablas, una para cada entIdad. En la tabla con
cardInalIdad 0, se coloca como clave secundarIa, la clave prIncIpal de la otra (dIcha
clave seria clave alternatIva de esa tabla):

49/!#*&."10 McI <)9/."10 & 9& *$9&."10 c & 6
5&83%$1"&, %&51 3 %&51
En el caso de que en ambos extremos nos encontremos con relacIones 0 a 1, entonces la
solucIon es la mIsma, pero la clave que se copIa en la tabla para ser clave secundarIa,
debe de ser tomada de la entIdad que se relacIone ms con la otra (la que est ms
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!)'#
cerca de tener la cardInalIdad 1 a 1 en el otro extremo). 0Icha clave secundarIa, en
este caso, no ser clave alternatIva (pero si tendria restrIccIon de unIcIdad, marcada en
el dIbujo con un asterIsco).

49/!#*&."10 M6I @&!) & *$9&.")0&9 +$ *$9&.")0$! .$*) & .$*)I !/8)0"$0+) T/$ !)0 9)! $J$%89&*$! +$ 9&
$0#"+&+ -I 9)! T/$ %3! &8&*$.$0 $0 9& *$9&."10= G9 4+$0#"2".&+)* - 8&!& .)0 *$!#*".."10 +$ /0"."+&+=
5&83%$1"&, 5&%=5,$73,
Las relacIones recursIvas se tratan de la mIsma forma que las otras, solo que hay que
ImagInar que la tabla se dIvIde en dos, una por cada rol. TenIendo en cuenta eso, la
solucIon es IdntIca a lo ya resuelto en los casos anterIores.

49/!#*&."10 M-I O*&0!2)*%&."10 +$ *$9&.")0$! *$./*!";&! $0 $9 %)+$9) *$9&.")0&9
Es decIr la forma de ImagInarse las relacIones recursIvas para resolverlas es:

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!)(#
49/!#*&."10 MKI D,!#*&.."10 8&*& 2&."9"#&* 9& .)0;$*!"10 +$ *$9&.")0$! *$./*!";&!I 0)! "%&("0&%)!
+)! $0#"+&+$! $0 9/(&* +$ /0&=

(94C4>* &"-$#3#&, #^2$8&,
Toda entIdad dbIl Incorpora una relacIon ImplicIta con una entIdad fuerte. Esta
relacIon no necesIta Incorporarse como tabla en el modelo relacIonal (al tratarse de una
relacIon n a 1), bastar con aadIr como atrIbuto y clave fornea en la entIdad dbIl, el
IdentIfIcador de la entIdad fuerte.
En ocasIones el IdentIfIcador de la entIdad dbIl tIene como parte de su
IdentIfIcador al IdentIfIcador de la entIdad fuerte (por ejemplo sI para IdentIfIcar lineas
de factura utIlIzamos el nmero de lnea y el nmero de jactura, clave de la entIdad
jactura). En esos casos no hace falta aadIr de nuevo como clave externa el
IdentIfIcador de la entIdad fuerte (Imagen de la derecha)


49/!#*&."10 MMI #*&0!2)*%&."10 +$ $0#"+&+$! +g,"9$! $0 $9 %)+$9) *$9&.")0&9
(94C4B* 5&83%$1"&, NGU
En el caso de las relacIones SA, se sIguen estas normas:
!%# Tanto las superentIdades como las subentIdades generarn tablas en el modelo
relacIonal (en el caso de que la SA sea de tIpo total, se podria Incluso no hacer
la superentIdad y pasar todos sus atrIbutos a las subentIdades, pero no es
recomendable porque puede complIcar enormemente el esquema Interno).
!"# Los atrIbutos se colocan en la tabla a la que se refIere a la entIdad
correspondIente.
!$# SI las subentIdades no tIenen clave propIa, se colocar como clave, la clave de su
superentIdad. Adems esta clave heredada ser clave secundarIa, adems de
clave prIncIpal.
!'# En el caso de que las subentIdades tengan clave prIncIpal propIa. Se colocar en
las subentIdades el IdentIfIcador de la superentIdad como clave secundarIa,
adems ser clave alternatIva.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!))#

49/!#*&."10 MPI @*).$!) +$ #*&0!2)*%&."10 +$ *$9&.")0$! 4<D= D 9& "dT/"$*+& ./&0+) $9 "+$0#"2".&+)*
$! :$*$+&+) 8)* 9&! !/,$0#"+&+$!p & 9& +$*$.:& 9&! !/,$0#"+&+$! #"$0$0 "+$0#"2".&+)* 8*)8")= X)
;&*?& $9 *$!/9#&+) 8)* $9 #"8) +$ 4<D 58&*."&9 ) #)#&97I &/0T/$ $0 $9 .&!) +$ 9&! $L.9/!";&!I !$ !/$9$
"0+".&* $9 &*.) $0 $9 *$!/9#&+)=
!(# SI la SA es exclusIva o no, no cambIa el esquema relacIonal, pero si habr que
tenerlo en cuenta para las restrIccIones futuras en el esquema Interno (casI
sIempre se realIzan medIante trIggers), ya que en las exclusIvas no puede haber
repetIcIon de la clave de la superentIdad en nInguna subentIdad.
!)# No varia el resultado por ser total o parcIal la relacIon SA, el modelo relacIonal
no puede marcar esa posIbIlIdad. Pero es Interesante tenerlo en cuenta (se suele
aadIr un comentarIo al dIseo relacIonal para posIbles restrIccIones a tener en
cuenta)
(94C4C* "1-3, ;$"38&,
El modelo conceptual entIdad/relacIon es el verdadero mapa de la base de datos. Hay
aspectos que no se reflejan al Instante, por ejemplo el hecho de sI la cardInalIdad
minIma es 0 o uno, o la oblIgatorIedad en una relacIon,.... EspecIal cuIdado hay que
tener con las relacIones SA. Son aspectos a tener en cuenta en el sIguIente modelo (en
el Interno) al crear por ejemplo indIces y restrIccIones.
Por ello ese modelo es la referencIa oblIgada de los profesIonales de la base de
datos (en especIal de los admInIstradores) y su contenIdo no debe dejar de tenerse en
cuenta aunque ya tengamos el esquema relacIonal.
(94D* 5&<5&,&"-3%$." #& &,F=&:3, #& 23,&, #&
#3-1, 5&83%$1"38&,
Ya ha se ha comentado como son los esquemas de datos relacIonales. La manera formal
es:
@4GqD5O"8)I S)+$9)I X)%,*$I D8$99"+)6I D8$99"+)-7
GS@>G<D5E4HI E)+iG%8*$!&I X)%,*$I A"*$.."107
<]S4X4<O>\<5O"8)IS)+$9)I E)+iG%8*$!&I @*$.")7
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!)*#
G`4<OGXE4D<5O"8)I S)+$9)I XiD9%&.$0I E&0#"+&+7
En ese tIpo de esquemas es dIficIl ver las relacIones en los datos, algo que si se ve muy
bIen en los esquemas entIdad relacIon. Por ello se suelen complementar los esquemas
clsIcos con lineas y dIagramas que representan esa InformacIon.
(94D4)* +53;1, 5&83%$1"38&,
Es un esquema relacIonal en el que hay lineas que enlazan las claves prIncIpales con las
claves secundarIas para representar mejor las relacIones. A veces se representa en
forma de nodos de grafos y otras se complementa el clsIco.
Ejemplo:


(94D49* &,F=&:3, 5&83%$1"38&, #&5$73#1, #&8 :1#&81
&"-$#3#P5&83%$."
Hay quIen los llama $!T/$%&! $0#"+&+Y*$9&."10 *$9&.")0&9$!, pero en general se
consIderan varIantes del modelo entIdad/relacIon. SIn embargo la mayoria no son
capaces de representar lo mIsmo que el modelo entIdad/relacIon de E:$0, la razon
estrIba en que parten de que el modelo logIco es el relacIonal y por lo tanto estn muy
orIentados a ese modelo.
:1#&81 #& <3-3, #& +3881
QuIz el modelo ms famoso sea el llamado modelo de 8&#& +$ (&99) (crows joot en
Ingls) utIlIzado en la metodologia 402)*%&#")0 G0("0$$*"0( (lnyenera de la
lnjormacn) que tIene bastante popularIdad; de hecho es el tIpo de notacIon habItual
en la mayoria de herramIentas CASE. En l las cardInales se representan con simbolos en
lugar de con numeros. El modelo de pata de gallo correspondIente al ejemplo anterIor
seria:
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!)+#

49/!#*&."10 MRI A"&(*&%& $!#"9) ata de yallo

0e hecho es una mezcla entre los esquemas relacIonales y los entIdad/relacIon. Hoy en
dia se utIlIza mucho, en especIal por las herramIentas CASE de creacIon de dIseos de
bases de datos.
En el dIagrama anterIor (lustracIon 46) se puede examInar un modelo sencIllo estIlo
pata de gallo. En estos dIagramas la cardInalIdad mxIma n se dIbuja con las famosas
patas de gallo ( ), la cardInalIdad minIma de tIpo cero con un circulo y la cardInalIdad
de tIpo uno con una barra vertIcal. El hecho de que sumnstros y exstencas tengan
las esquInas redondeadas es para remarcar que representan relacIones entre entIdades.
En cualquIer caso tampoco hay un estndar unnImemente aceptado para este tIpo
de notacIon.
&,-$81 U%%&,,
Se ha hecho muy popular la forma de presentar esquemas relacIonales del programa
|Icrosoft Access.
Ejemplo:

Es otra forma muy clara de representar relacIones y cardInalIdades (aunque tIene
problemas para representar relacIones de dos o ms atrIbutos).
%1:<8&-3"#1 &,F=&:3,
SIn duda los esquemas ms completos son los que reflejan no solo las cardInalIdades
sIno tambIn todas las restrIccIones (e Incluso los tIpos de datos, aunque esto ya es una
competencIa del esquema Interno). 7ase el esquema de la lustracIon 47. En ese
esquema los simbolos funcIonan de esta forma:
!"#$%&% ()*#+&% !,-.,/,012%
Subrayado AX4 Clave prIncIpal
Subrayado
dIscontInuo
Clave2 Clave alternatIva
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!),#
Nombre No admIte valores nulos (restrIccIon X\O
X]FF)
* Nombre * No admIte duplIcados (restrIccIon
]X4[]G)
Adems los campos que estn el fInal de una flecha son claves secundarIas.

49/!#*&."10 MWI G!T/$%& *$9&.")0&9 .)%89$#) +$ 9&
,&!$ +$ +&#)! +$ /0 l"+$) E9/,
En el esquema anterIor las flechas representan cardInalIdades n y los circulos
cardInalIdades de tIpo cero. Las de tIpo uno no tIenen nIngun simbolo asIgnado. A este
tIpo de dIagramas (los de flechas y ceros) se les llama dIagramas en 0)#&."10 V&.:%&0.
En muchas :$**&%"$0#&! ED<G, los dIagramas relacIonales suelen representar las
restrIccIones con letras. 0e hecho esta notacIon es la ms habItual actualmente puesto
que son las ms completa (aunque a veces vIsualmente son un poco ms dIficIles de
Interpretar que la forma representada en la lustracIon 47.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!*-#
Ejemplo de notacIon en pata de gallo con las restrIccIones usando abrevIaturas:


49/!#*&."10 M^I G!T/$%& *$9&.")0&9 /!&0+) 0)#&."10 $0 8&#& +$ (&99) .)0 9&! *$!#*"..")0$!
/!&0+) &,*$;"&#/*&!
En este caso los simbolos @r sIgnIfIcan Prmary Key (clave prIncIpal), Hr es Foreyn
Key (clave secundarIa) ]r (o sImplemente U) es Unque (unIcIdad) y Er es restrIccIon
de valIdacIon (check). Los numeros sIrven para aclarar los atrIbutos que forman parte
de la restrIccIon. Asi sabemos que en la tabla de restamos, dn forma una clave
fornea y n_coa otra dIstInta; y que jecha_restamo, dn y n_coa forman juntos
una restrIccIon de unIcIdad.
(94E* "15:38$M3%$."
(94E4)* <5128&:3, #&8 &,F=&:3 5&83%$1"38
Una vez obtenIdo el esquema relacIonal resultante del esquema entIdad/relacIon que
representa la base de datos, normalmente tendremos una buena base de datos. Pero
otras veces, debIdo a fallos en el dIseo o a problemas Indetectables, tendremos un
esquema que puede producIr una base de datos que Incorpore estos problemas:
>$+/0+&0."&= Se llama asi a los datos que se repIten contInua e
InnecesarIamente por las tablas de las bases de datos. Cuando es excesIva es
evIdente que el dIseo hay que revIsarlo, es el prImer sintoma de problemas y
se detecta fcIlmente.
D%,"(s$+&+$!= 0atos que no clarIfIcan sufIcIentemente el elemento al que
representan. Los datos de cada fIla podrian referIrse a ms de un ejemplar de
esa tabla o Incluso puede ser ImposIble saber a qu ejemplar exactamente se
estn refIrIendo. Es un problema muy grave y dIficIl de detectar.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!*%#
@g*+"+& +$ *$!#*"..")0$! +$ "0#$(*"+&+= Normalmente debIdo a +$8$0+$0."&!
2/0.")0&9$!= |s adelante se explIca este problema. Se arreglan fcIlmente
sIguIendo una serIe de pasos concretos.
D0)%&9?&! $0 )8$*&.")0$! +$ %)+"2".&."10 +$ +&#)!= El hecho de que al
Insertar un solo elemento haya que repetIr tuplas en una tabla para varIar unos
pocos datos. D que elImInar un elemento suponga elImInar varIas tuplas
necesarIamente (por ejemplo que elImInar un clIente suponga borrar seIs o
sIete fIlas de la tabla de clIentes, seria un error muy grave y por lo tanto un
dIseo terrIble).
El prIncIpIo fundamental resIde en que las tablas deben referIrse a objetos o sItuacIones
muy concretas, relacIonados exactamente con elementos reconocIbles por el sIstema de
InformacIon de forma Inequivoca. Cada fIla de una tabla representa Inequivocamente un
elemento reconocIble en el sIstema. Lo que ocurre es que conceptualmente es dIficIl
agrupar esos elementos correctamente.
En cualquIer caso la mayor parte de problemas se agravan sI no se sIgue un modelo
conceptual y se decIde crear dIrectamente el esquema relacIonal. En ese caso, el dIseo
tIene una garantia casI asegurada de funcIonar mal.
Cuando aparecen los problemas enumerados, entonces se les puede resolver usando
reglas de normalIzacIon. Estas reglas suelen forzar la dIvIsIon de una tabla en dos o ms
tablas para arreglar ese problema.
(94E49* ;15:3, "15:38&,
Las formas normales se corresponde a una teoria de normalIzacIon InIcIada por el propIo
E)++ y contInuada por otros autores (entre los que destacan V)N.$ y H&("0). Codd
defInIo en 1970 la prImera forma normal, desde ese momento aparecIeron la segunda,
tercera, la 8oyceCodd, la cuarta y la quInta forma normal.
Una tabla puede encontrarse en prImera forma normal y no en segunda forma
normal, pero no al contrarIo. Es decIr los numeros altos de formas normales son ms
restrIctIvos (la quInta forma normal cumple todas las anterIores).
La teoria de formas normales es una teoria absolutamente matemtIca, pero en el
presente manual se descrIben de forma ms IntuItIva.
Hay que tener en cuenta que muchos dIseadores opInan que basta con llegar a la
forma 8oyceCodd, ya que la cuarta, y sobre todo la quInta, forma normal es polmIca.
Hay quIen opIna que hay bases de datos peores en quInta forma normal que en tercera.
En cualquIer caso deberia ser oblIgatorIo para cualquIer dIseador llegar hasta la forma
normal de 8oyceCodd.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!*"#
(94E4>* <5$:&53 ;15:3 "15:38 ()gV*
Es una forma normal Inherente al esquema relacIonal. Es decIr toda tabla realmente
relacIonal la cumple.
Se dIce que una tabla se encuentra en prImera forma normal sI ImpIde que un
atrIbuto de una tupla pueda tomar ms de un valor. La tabla:
O>DVDbDA\>
AX4 X)%,*$ A$8&*#&%$0#)
12121212A Andrs |antenImIento
12J45J45C Andrea 0IreccIon
CestIon
7Isualmente es un tabla, pero no una tabla relacIonal (lo que en termInologia de bases
de datos relacIonales se llama *$9&."10). No cumple la prImera forma normal.
Seria prImera forma normal sI los datos fueran:
TFA8AJA0DF
AX4 X)%,*$ A$8&*#&%$0#)
12121212A Andrs |antenImIento
12J45J45C Andrea 0IreccIon
12J45J45C Andrea CestIon
Esa tabla si esta en prImera forma normal.
(94E4B* #&<&"#&"%$3, ;="%$1"38&,
#&<&"#&"%$3 ;="%$1"38
Se dIce que un conjunto de atrIbutos (a) depende funcIonalmente de otro conjunto de
atrIbutos (`) sI para cada valor de ` hay un unIco valor posIble para a. SImbolIcamente
se denota por `a.
Por ejemplo el nombre de una persona depende funcIonalmente del 0Nl; es decIr
para un 0N concreto solo hay un nombre posIble. En la tabla del ejemplo anterIor, el
departamento no tIene dependencIa funcIonal, ya que para un mIsmo 0N puede haber
ms de un departamento posIble. Pero el nombre si que depende del 0N.
Al conjunto ` del que depende funcIonalmente el conjunto a se le llama
+$#$*%"0&0#$. Al conjunto a se le llama "%89".&+)=
#&<&"#&"%$3 ;="%$1"38 %1:<8&-3
Un conjunto de atrIbutos (a) tIene una dependencIa funcIonal completa sobre otro
conjunto de atrIbutos (`) sI a tIene dependencIa funcIonal de ` y adems no se puede
obtener de ` un conjunto de atrIbutos ms pequeo que consIga una dependencIa
funcIonal de a (es decIr, no hay en ` un determInante formado por atrIbutos ms
pequeos).
Por ejemplo en una tabla de clIentes, el conjunto de atrIbutos formado por el
nombre y el dn producen una dependencIa funcIonal sobre el atrIbuto aelldos. Pero
no es plena ya que el dn IndIvIdualmente, tambIn produce una dependencIa funcIonal
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!*$#
sobre aelldos= El dnI si produce una dependencIa funcIonal completa sobre el campo
apellIdos.
Una dependencIa funcIonal completa se denota como `a
#&<&"#&"%$3 ;="%$1"38 &8&:&"-38
Se produce cuando ` e a forman una dependencIa funcIonal completa y adems a es un
unIco atrIbuto.
#&<&"#&"%$3 ;="%$1"38 -53",$-$73
Es ms compleja de explIcar, pero tIene tambIn utIlIdad. Se produce cuando tenemos
tres conjuntos de atrIbutos `I a y q= a depende funcIonalmente de ` (`a), q depende
funcIonalmente de a (aq). Adems ` no depende funcIonalmente de a (aeY`).
Entonces ocurre que ` produce una dependencIa funcIonal transItIva sobre q.
Esto se denota como: (` q)
Por ejemplo sI ` es el atrIbuto Nmero de Clase de un InstItuto, e a es el atrIbuto
Cdyo Tutor. Entonces `a (el tutor depende funcIonalmente del numero de clase).
SI q representa el Cdyo del deartamento, entonces aq (el codIgo del
departamento depende funcIonalmente del codIgo tutor, cada tutor solo puede estar en
un departamento). Como ocurre que aeY` (el codIgo de la clase no depende
funcIonalmente del codIgo tutor, un codIgo tutor se puede corresponder con varIos
codIgos de clase). Entonces ` q (el codIgo del departamento depende
transItIvamente del codIgo de la clase).
(94E4C* ,&+="#3 ;15:3 "15:38 (9gV*
Dcurre sI una tabla est en prImera forma normal y adems cada atrIbuto que no sea
clave, depende de forma funcIonal completa respecto de cualquIera de las claves. Toda
la clave prIncIpal debe hacer dependIentes al resto de atrIbutos, sI hay atrIbutos que
depende solo de parte de la clave, entonces esa parte de la clave y esos atrIbutos
formarn otra tabla. Ejemplo:
DF]SX\<
AX4 E)+ E/*!) X)%,*$ D8$99"+)6 X)#&
12121219A J4 Pedro 7alIente 9
12121219A 25 Pedro 7alIente 8
J457775C J4 Ana Fernndez 6
5674J78J 25 Sara Crespo 7
5674J78J J4 Sara Crespo 6
SuponIendo que el 0N y el codIgo de curso formen una clave prIncIpal para esta tabla,
solo la nota tIene dependencIa funcIonal completa. El nombre y los apellIdos dependen
de forma completa del 0N. La tabla no es 2FN, para arreglarlo:
DF]SX\<
AX4 X)%,*$ D8$99"+)6
12121219A Pedro 7alIente
J457775C Ana Fernndez
5674J78J Sara Crespo

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!*'#

D<4<OGXE4D
AX4 E)+ E/*!) X)#&
12121219A J4 9
12121219A 25 8
J457775C J4 6
5674J78J 25 7
5674J78J J4 6
(94E4D* -&5%&53 ;15:3 "15:38 (>gV*
Dcurre cuando una tabla est en 2FN y adems nIngun atrIbuto que no sea clave
depende transItIvamente de las claves de la tabla. Es decIr no ocurre cuando algun
atrIbuto depende funcIonalmente de atrIbutos que no son clave.
Ejemplo:
DF]SX\<
AX4 X)%,*$ D8$99"+)6 E)+ @*);"0."& @*);"0."&
12121J49A Salvador 7elasco J4 PalencIa
12121219A Pedro 7alIente J4 PalencIa
J457775C Ana Fernndez 47 7alladolId
5674J78J Sara Crespo 47 7alladolId
J456858S |arIna Serrat 08 8arcelona
La ProvIncIa depende funcIonalmente del codIgo de provIncIa, lo que hace que no est
en JFN. El arreglo seria:
DF]SX\<
AX4 X)%,*$ D8$99"+)6 E)+ @*);"0."&
12121J49A Salvador 7elasco J4
12121219A Pedro 7alIente J4
J457775C Ana Fernndez 47
5674J78J Sara Crespo 47
J456858S |arIna Serrat 08

@>\l4XE4D
E)+ @*);"0."& @*);"0."&
J4 PalencIa
47 7alladolId
08 8arcelona

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!*(#
(94E4E* ;15:3 "15:38 #& I1/%&AS1## (gVIS 1 ISgV*
Dcurre sI una tabla est en tercera forma normal y adems todo determInante es una
clave candIdata. Ejemplo:
\>UDX4qDE4tX
O*&,&J&+)* A$8&*#&%$0#) >$!8)0!&,9$
Alex ProduccIon FelIpa
Arturo ProduccIon |artin
Carlos 7entas JulIo
Carlos ProduccIon FelIpa
CabrIela ProduccIon HIgInIo
LuIsa 7entas Eva
LuIsa ProduccIon |artin
|anuela 7entas JulIo
Pedro 7entas Eva
La cuestIon es que un trabajador o trabajadora puede trabajar en varIos
departamentos. En dIcho departamento hay varIos responsables, pero cada trabajador
solo tIene asIgnado uno. El detalle Importante que no se ha tenIdo en cuenta, es que el
o la responsable solo puede ser responsable en un departamento.
Este detalle ultImo produce una dependencIa funcIonal ya que:
Resonsable0eartamento
Por lo tanto hemos encontrado un determInante que no es clave candIdata. No est
por tanto en FN8C. En este caso la redundancIa ocurre por mala seleccIon de clave. La
redundancIa del departamento es completamente evItable. La solucIon seria:
@G><\XDF
O*&,&J&+)* >$!8)0!&,9$
Alex FelIpa
Arturo |artin
Carlos JulIo
Carlos FelIpa
CabrIela HIgInIo
LuIsa Eva
LuIsa |artin
|anuela JulIo
Pedro Eva

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!*)#

>G<@\X<DVFG<
>$!8)0!&,9$! A$8&*#&%$0#)
FelIpa ProduccIon
|artin ProduccIon
JulIo 7entas
HIgInIo ProduccIon
Eva 7entas
En las formas de 8oyceCodd hay que tener cuIdado al descomponer ya que se podria
perder InformacIon por una mala descomposIcIon
(94E4b* %=35-3 ;15:3 "15:38 (BgV*4 #&<&"#&"%$3,
:=8-$738=3#3,
#&<&"#&"%$3 :=8-$738=3#3
Para el resto de formas normales (las dIseadas por H&("0, mucho ms complejas), es
Importante defInIr este tIpo de dependencIa, que es dIstInta de las funcIonales. SI las
funcIonales eran la base de la segunda y tercera forma normal (y de la de 8oyceCodd),
stas son la base de la cuarta forma normal.
Una dependencIa multIvaluada de X sobre Y (es decIr XY), sIendo X e Y atrIbutos
de la mIsma tabla, ocurre cuando Y tIene un conjunto de valores bIen defInIdos sobre
cualquIer valor de X. Es decIr, dado X sabremos los posIbles valores que puede tomar Y.
Se refIere a posIbles valores (en plural) y se trata de que los valores de ese atrIbuto
sIempre son los mIsmos segun el valor de un atrIbuto y no del otro.
Ejemplo:
Xn E/*!) @*)2$!)* S&#$*"&9
17 Eva 1
17 Eva 2
17 JulIa 1
17 JulIa 2
25 Eva 1
25 Eva 2
25 Eva J
La tabla cursos, profesores y materIales del curso. La tabla est en FN8C ya que no hay
dependencIas transItIvas y todos los atrIbutos son clave sIn dependencIa funcIonal hacIa
ellos. SIn embargo hay redundancIa. Los materIales se van a repetIr para cualquIer
profesor dando cualquIer curso, ya que los profesores van a utIlIzar todos los materIales
del curso (de no ser asi no habria nInguna redundancIa).
Los materIales del curso dependen de forma multIvaluada del curso y no del profesor
en una dependencIa multIvaluada (no hay dependencIa funcIonal ya que los posIbles
valores son varIos). Para el par N de curso y Projesor podemos saber los materIales;
pero lo sabemos por el curso y no por el profesor.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!**#
%=35-3 ;15:3 "15:38
Dcurre esta forma normal cuando una tabla est en forma normal de 8oyce Codd y toda
dependencIa multIvaluada no trIvIal es una dependencIa funcIonal. Son trIvIales
aquellas dependencIas multIvaluadas en las que el conjunto formado por el
determInante y el ImplIcado no forman la clave prImarIa de la tabla y adems el
ImplIcado no forma parte del determInante: es decIr sI X->>Y y adems Y . X y X,Y no
es la clave de la tabla, tenemos una dependencIa multIvaluada no trIvIal (como ocurre
en el ejemplo anterIor).
Para la tabla anterIor la solucIon serian dos tablas:
Xn E/*!) S&#$*"&9
17 1
17 2
25 1
25 2
25 J

Xn E/*!) @*)2$!)*
17 Eva
17 JulIa
25 Eva

Un teorema de FagIn IndIca cuando hay tres pares de conjuntos de atrIbutos `I a y q sI
ocurre `euua y `euuq (a y q tIenen dependencIa multIvaluada sobre `), entonces las
tablas `I a y `I q reproducen sIn perder InformacIon lo que poseia la tabla orIgInal. Este
teorema marca la forma de dIvIdIr las tablas hacIa una 4FN
(94E4c* F=$"-3 ;15:3 "15:38 (CgV*
#&<&"#&"%$3, #& QONV 1 #& 5&="$."
Una 8*)N$.."10 de una tabla es la tabla resultante de tomar un subconjunto de los
atrIbutos de una tabla (se trata de la operacIon proyeccIon, H, del 39($,*& *$9&.")0&9).
Es decIr una tabla formada por unas cuantas columnas de la tabla orIgInal.
La operacIon b\4X procedente tambIn del lgebra relacIonal, consIste en formar
una tabla con la unIon de dos tablas. La tabla resultante estar formada por la
combInacIon de todas las columnas y fIlas de ambas, excepto las columnas y fIlas
repetIdas.
Se dIce que se tIene una tabla con +$8$0+$0."& +$ /0"10 5) +$ #"8) b\4X7 sI se
puede obtener esa tabla como resultado de combInar medIante la operacIon JDN varIas
proyeccIones de la mIsma.
F=$"-3 ;15:3 "15:38 1 ;15:3 "15:38 #& <51/&%%$."A="$."
Dcurre cuando una tabla est en 4FN y cada dependencIa de unIon (JDN) en ella es
ImplIcada por las claves candIdatas.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!*+#
Es la ms compleja y polmIca de todas. PolmIca pues no est claro en muchas
ocasIones est muy claro que el paso a 5FN mejore la base de datos. Fue defInIda
tambIn por FagIn.
Es raro encontrarse este tIpo de problemas cuando la normalIzacIon llega a 4FN. Se
deben a restrIccIones semntIcas especIales aplIcadas sobre la tabla. Ejemplo:
@*);$$+)* S&#$*"&9 @*)N$.#)
1 1 2
1 2 1
2 1 1
1 1 1
ndIcan codIgos de materIal sumInIstrado por un proveedor y utIlIzado en un
determInado proyecto. Asi vIsta la tabla, no permIte nInguna proyeccIon en la que no
perdamos datos.
Pero sI ocurre una restrIccIon especIal como por ejemplo: Cuando un roveedor nos
ha sumnstrado alyuna vez un determnado materal, s ese materal aarece en
otro royecto, haremos que el roveedor anteror nos sumnstre tambn ese
materal ara el royecto.
Eso ocurre en los datos como el proveedor numero 1 nos sumInIstro el materIal
numero 1 para el proyecto 2 y en el proyecto 1 utIlIzamos el materIal 1, aparecer la
tupla proveedor 1, materIal 1 y proyecto 1. SI un nuevo proyecto necesItara el materIal
1, entonces habr que pedIrlo a los proveedores 1 y 2 (ya que en otros proyectos les
henos utIlIzado)
La dependencIa de reunIon que produce esta restrIccIon es muy dIficIl de ver ya que
es lejana. Para esa restrIccIon esta proyeccIon de tablas seria vlIda:
@*);$$+)* S&#$*"&9
1 1
1 2
2 1

S&#$*"&9 @*)N$.#)
1 2
2 1
1 1

@*);$$+)* @*)N$.#)
1 2
1 1
2 1

Esa descomposIcIon no pIerde valores en este caso, sabIendo que sI el proveedor nos
sumInIstra un materIal podremos relacIonarle con todos los proyectos que utIlIzan ese
materIal.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!*,#
FesumIendo, una tabla no est en quInta forma normal sI hay una descomposIcIon de
esa tabla que muestre la mIsma InformacIon que la orIgInal y esa descomposIcIon no
tenga como clave la clave orIgInal de la tabla.
(94E4)d* ;15:3 "15:38 #& #1:$"$1 %837& (gVJS*
Se la conoce ms con sus sIglas en Ingls ArXH. Se trata de una forma normal enuncIada
tambIn por H&("0 en 1981 al darse cuenta de los problemas de redundancIa que
ocurrian con algunos domInIos.
En este caso no se baso en dependencIas entre los datos, sIno que se baso en
*$!#*"..")0$! +$ +)%"0") y *$!#*"..")0$! +$ .9&;$.
>$!#*"..")0$! +$ +)%"0"). Se trata de la restrIccIon que hace que un
determInado atrIbuto obtenga solo cIertos valores, los que estn de acuerdo a
la defInIcIon de un determInado domInIo.
>$!#*".."10 +$ .9&;$. Es la restrIccIon que permIte que un atrIbuto o un
conjunto de atrIbutos forme una clave candIdata.
FagIn dIce que una tabla est en FN0C sI toda restrIccIon sobre la tabla es consecuencIa
logIca de aplIcar las restrIccIones de domInIo y clave sobre la mIsma. FagIn demostro
que sI esto ocurria la tabla Incluso estaba en 5FN.
Ejemplo:
Alumno NIvel logrado Nota
AntonIo |uy alto y efIcIente 9
|arIsa |uy alto aunque sIn trabajo constante 9
|arIo Alto con trabajo habItual 7
LuIsa |edIo aunque con trabajo 5
Dbservando los datos de la tabla se observa que cuando la nota es superIor a 9, en el
nIvel aparece la palabra alto, cuando es un 7 o un 8 medIo, y un 5 o 6 seria medIo. Es
decIr tenemos restrIccIones que no son nI de domInIo nI de clave en esa tabla. Lo logIco
seria:
Alumno NIvel de trabajo Nota
AntonIo EfIcIente 9
|arIsa Trabajo
constante
9
|arIo Trabajo habItual 7
LuIsa Trabajo medIo 5

NIvel acadmIco Nota minIma Nota mxIma
|uy alto 9 10
Alto 7 8,99
|edIo 5 6,99
8ajo 0 4,99
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ -7 modelo relacIonal
!+-#
No se pIerde InformacIon al dIsear las tablas de esta forma y de hecho es ms efIcIente
para la base de datos.
!+%#

(>*
G\] (N*4
JJ] / JZ]
(>4)* "1-3, <5&7$3,
(>4)4)* 7&5,$." #& G\]
Aunque estos apuntes sIrven como guia de uso de <[F estndar, la base de datos que se
utIlIza como referencIa fundamental es la base de datos Dracle. Normalmente se
IndIcan sIempre las InstruccIones para Dracle y para el SQL estndar. En las partes
donde no se IndIque explicItamente dIferencIa, sIgnIfIcar que Dracle coIncIde con el
estndar.
SIn embargo hay que avIsar que todos los ejemplos han sIdo probados para Dracle,
mIentras que no se puede decIr lo mIsmo para SQL estndar. En el caso de SQL
estndar, el software @)!#(*$<[F se ha tenIdo muy en cuenta ya que parece el ms
respetuoso actualmente con el estndar.
No obstante debo dIsculparme porque es posIble que muchos apartados se refIeran
solo a Dracle y sobre todo los detalles de funcIonamIento y resultados no han tenIdo en
cuenta el estndar, sIno solo el funcIonamIento de Dracle.
La razon de utIlIzar Dracle como base de trabajo se debe a su respeto por SQL
estndar (aunque desde luego no tan estrIcto como PostgreSQL), es decIr que no es
excesIvamente dIferente; pero fundamentalmente por ser el SC80 de referencIa ms
Importante desde hace ya muchos aos. 0e hecho lo que Dracle aporta de novedoso en
cada versIon, acaba formando parte del estndar futuro.
(>4)49* ;15:3-1 #& 83, $",-5=%%$1"&, &" 81, 3<="-&,
En este manual en muchos apartados se IndIca sIntaxIs de comandos. Esta sIntaxIs sIrve
para aprender a utIlIzar el comando, e IndIca la forma de escrIbIr dIcho comando en el
programa utIlIzado para escrIbIr SQL.
En el presente manual la sIntaxIs de los comandos se escrIbe en prrafos sombreados
de naranja claro con el reborde de color marron anaranjado.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!+"#

Ejemplo:
#$%$&' ( ] {|)*#'*+&'| !"#$%&' ] ()*+(,-.& |'#-',|, ...]
,-./ /'0#';
Dtras veces se descrIben codIgos de ejemplo de un comando. Los ejemplos se escrIben
tambIn con fondo naranja claro, pero sIn el reborde. Ejemplo:
#$%$&' nombre ,-./ cIIenLe0
Los ejemplos sIrven para escenIfIcar una InstruccIon concreta, la sIntaxIs se utIlIza para
IndIcar las forma de utIlIzar un comando.
Para IndIcar la sIntaxIs de un comando se usan simbolos especIales. Los simbolos que
utIlIza este lIbro (de acuerdo con la sIntaxIs que se utIlIza normalmente en cualquIer
documentacIon de este tIpo) son:
@DFDV>D Cuando en la sIntaxIs se utIlIza una palabra en negrIta, sIgnIfIca que
es una palabra que hay que escrIbIr lIteralmente (aunque sIn Importar sI en
mayusculas o mInusculas).
texto. El texto que aparece en color normal sIrve para IndIcar que no hay que
escrIbIrle lIteralmente, sIno que se refIere a un tIpo de elemento que se puede
utIlIzar en el comando. Ejemplo:
#$%$&' coIumnu ,-./ LubIu0
El texto columna hay que cambIarlo por un nombre concreto de columna (nombre,
apellIdos,...), al Igual que tabla se refIere a un nombre de tabla concreto.
#$L#) $0 0$(*"#&. SIrve para IndIcar texto o simbolos que hay que escrIbIr de
forma lIteral, pero que no son palabras reservadas del lenguaje.
v w 5.)*.:$#$!7= Los corchetes sIrven para encerrar texto que no es oblIgatorIo
en el comando, es decIr para IndIcar una parte opcIonal.
x 5,&**& ;$*#".&97= Este simbolo (), la barra vertIcal, IndIca opcIon. Las
palabras separadas con este sIgno IndIcan que se debe elegIr una de entre todas
las palabras.
=== 58/0#)! !/!8$0!";)!7 ndIca que se puede repetIr el texto anterIor en el
comando contInuamente (sIgnIfIcaria, N &!? !/.$!";&%$0#$)
oy 599&;$!7 Las llaves sIrven para IndIcar opcIones mutuamente exclusIvas pero
oblIgatorIas. Es decIr, opcIones de las que solo se puede elegIr una opcIon, pero
de las que es oblIgado elegIr una. Ejemplo:
#$%$&' 1 ( 2 coIumnu 2 expresIn 3
,-./ LubIu"
El ejemplo anterIor IndIcaria que se debe elegIr oblIgatorIamente el asterIsco o un
nombre de columna o una expresIon. SI las llaves del ejemplo fueran corchetes,
entonces IndIcarian que Incluso podria no aparecer nInguna opcIon.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!+$#
(>49* $"-51#=%%$."
(>494)* 12?&-$71,
SQL es el lenguaje fundamental de los SC80 relacIonales. Se trata de uno de los
lenguajes ms utIlIzados de la hIstorIa de la InformtIca. Es sIn duda el lenguaje
fundamental para manejar una base de datos relacIonal.
SQL es un 9$0(/&J$ +$.9&*&#";) en lo que lo Importante es defInIr T/g se desea
hacer, por encIma de .1%) hacerlo (que es la forma de trabajar de los lenguajes de
programacIon de aplIcacIones como C o Java). Con este lenguaje se pretendia que las
InstruccIones se pudIeran escrIbIr como sI fueran ordenes humanas; es decIr, utIlIzar un
lenguaje lo ms natural posIble. 0e ahi que se le consIdere un lenguaje de cuarta
generacIon.
Se trata de un lenguaje que Intenta agrupar todas las funcIones que se le pueden
pedIr a una base de datos, por lo que es el lenguaje utIlIzado tanto por admInIstradores
como por programadores o Incluso usuarIos avanzados.
(>4949* 6$,-15$3 #&8 8&"+=3?& G\]
El nacImIento del lenguaje SQL data de 1970 cuando G= H= E)++ publIca su lIbro: Un
modelo de datos relaconal ara yrandes bancos de datos comartdos. Ese lIbro
dIctaria las dIrecrIces de las bases de datos relacIonales. Apenas dos aos despus 4VS
(para quIen trabajaba Codd) utIlIza las dIrectrIces de Codd para crear el Standard
Enylsh Query Lanyuaye (F$0(/&J$ G!#30+&* 40(9g! 8&*& E)0!/9#&!) al que se le llamo
<G[]GF= |s adelante se le asIgnaron las sIglas <[F (Standard Query Lanyuaye,
lenguaje estndar de consulta) aunque en Ingls se sIguen pronuncIando secuel. En
espaol se pronuncIa esecuele.
En 1979 Dracle presenta la prImera ImplementacIon comercIal del lenguaje. Poco
despus se convertia en un estndar en el mundo de las bases de datos avalado por los
organIsmos 4<\ y DX<4. En el ao 1986 se toma como lenguaje estndar por ANS de los
SC80 relacIonales. Un ao despus lo adopta SD, lo que convIerte a SQL en estndar
mundIal como lenguaje de bases de datos relacIonales.
En 1989 aparece el estndar SD (y ANS) llamado <[F^_ o <[F6. En 1992 aparece la
nueva versIon estndar de SQL (a dia de hoy sIgue sIendo la ms conocIda) llamada
<[F_-. En 1999 se aprueba un nuevo SQL estndar que Incorpora mejoras que Incluyen
triggers, procedimientos, funciones, y otras caracteristIcas de las bases de datos
objetorelacIonales; dIcho estndar se conoce como <[F__=
El ultImo estndar es el del ao 2011 (<[F-c667
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!+'#

(>494>* ;="%$1"3:$&"-1
%1:<1"&"-&, #& =" &"-15"1 #& &?&%=%$." G\]
Segun la normatIva ANS/SD cuando se ejecuta SQL, exIsten los sIguIentes elementos a
tener en cuenta en todo el entorno Involucrado en la ejecucIon de InstruccIones SQL:
Un &($0#$ <[F. EntendIdo como cualquIer elemento que cause la ejecucIon de
InstruccIones SQL que sern recIbIdas por un clIente SQL
Una "%89$%$0#&."10 <[F. Se trata de un procesador software capaz de
ejecutar las InstruccIones pedIdas por el agente SQL. Una ImplementacIon est
compuesta por:
- Un .9"$0#$ <[F. Software conectado al agente que funcIona como Interfaz
entre el agente SQL y el servIdor SQL. SIrve para establecer conexIones
entre si mIsmo y el servIdor SQL.
- Un !$*;"+)* <[F (puede haber varIos). El software encargado de manejar
los datos a los que la InstruccIon SQL lanzada por el agente hace
referencIa. Es el software que realmente realIza la InstruccIon, los datos
los devuelve al clIente.
<1,$28&, 3+&"-&, G\]4 <1,$28&, :1#1, #& &?&%=%$." G\]
&?&%=%$." #$5&%-34 G\] $"-&53%-$71
Las InstruccIones SQL se Introducen a travs de un clIente que est dIrectamente
conectado al servIdor SQL; por lo que las InstruccIones se traducen sIn IntermedIarIos y
los resultados se muestran en el clIente.
Normalmente es un modo de trabajo Incomodo, pero permIte tener acceso a todas
las capacIdades del lenguaje SQL de la base de datos a la que estamos conectados.
&?&%=%$." $"%5=,-3#3 1 &:2&2$#3
Las InstruccIones SQL se colocan como parte del codIgo de otro lenguaje que se
consIdera anfItrIon (C, Java, Pascal, 7Isual 8asIc,...). Al compIlar el codIgo se utIlIza un
precompIlador de la propIa base de datos para traducIr el SQL y conectar la aplIcacIon
resultado con la base de datos a travs de un software adaptador (+*";$*) como bAVE u
\AVE por ejemplo.
&?&%=%$." 3 -537^, #& %8$&"-&, +5K;$%1,
Se trata de software que permIte conectar a la base de datos a travs de un clIente. El
software permIte manejar de forma grfIca la base de datos y las accIones realIzadas
son traducIdas a SQL y envIadas al servIdor. Los resultados recIbIdos vuelven a ser
traducIdos de forma grfIca para un manejo ms comodo
&?&%=%$." #$"K:$%3
Se trata de SQL Incrustado en modulos especIales que pueden ser Invocados una y otra
vez desde dIstIntas aplIcacIones.

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!+(#
(>494B* <51%&,1 #& 83, $",-5=%%$1"&, G\]
El proceso de una InstruccIon SQL es el sIguIente:
!%# Se analIza la InstruccIon. Para comprobar la sIntaxIs de la mIsma
!"# SI es correcta se valora sI los metadatos de la mIsma son correctos. Se
comprueba esto en el dIccIonarIo de datos.
!$# SI es correcta, se optImIza, a fIn de consumIr los minImos recursos posIbles.
!'# Se ejecuta la sentencIa y se muestra el resultado al emIsor de la mIsma.
(>4>* &8&:&"-1, #&8 8&"+=3?& G\]
(>4>4)* %.#$+1 G\]
El codIgo SQL consta de los sIguIentes elementos:
E)%&0+)!= Las dIstIntas InstruccIones que se pueden realIzar desde SQL
- <GFGEO. Se trata del comando que permIte realIzar consultas sobre los
datos de la base de datos. DbtIene datos de la base de datos. A sta parte
del lenguaje se la conoce como A[F (0ata Query Lanyuaye, Lenguaje de
consulta de datos); pero es parte del 0|L del lenguaje.
- ASF, 0ata Manulaton Lanyuaye (Lenguaje de manIpulacIon de datos).
|odIfIca fIlas (regIstros) de la base de datos. Lo forman las InstruccIones
4X<G>OI ]@ADOGI SG>UG N AGFGOG=
- AAFI 0ata 0ejnton Lanyuaye (F$0(/&J$ +$ +$2"0"."10 +$ +&#)!).
PermIten modIfIcar la estructura de las tablas de la base de datos. Lo
forman las InstruccIones E>GDOG, DFOG>, A>\@, >GXDSG y O>]XEDOG.
- AEFI 0ata Control Lanyuaye 5F$0(/&J$ +$ .)0#*)9 +$ +&#)!7= AdmInIstran
los derechos y restrIccIones de los usuarIos. Lo forman las InstruccIones
U>DXO y >Gl\rG=
- 40!#*/..")0$! +$ .)0#*)9 +$ #*&0!&..")0$! 5AOF7= AdmInIstran las
modIfIcacIones creadas por las InstruccIones 0|L. Lo forman las
InstruccIones >\FFVDEr y E\SS4O. Se las consIdera parte del ASF.
E93/!/9&!= Son palabras especIales que permIten modIfIcar el funcIonamIento
de un comando 5QBG>GI \>AG> VaI===7
\8$*&+)*$!= PermIten crear expresIones complejas. Pueden ser arItmtIcos
(+,,*,/,...) logIcos (, , !=,, DXA, \>,...)
H/0.")0$!. Para conseguIr valores complejos (<]S(), ADOG(),...)
F"#$*&9$!= 7alores concretos para las consultas: numeros, textos, caracteres,...
Ejemplos: 2, 12.J4, 'Avda Cardenal CIsneros'
S$#&+&#)!. DbtenIdos de la propIa base de datos
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!+)#
(>4>49* "15:3, #& &,%5$-=53
En SQL no se dIstIngue entre mayusculas y mInusculas.
Las InstruccIones fInalIzan con el sIgno de punto y coma
CualquIer comando SQL (<GFGEO, 4X<G>O,...) puede ser partIdos por espacIos o
saltos de linea antes de fInalIzar la InstruccIon
Se pueden tabular lineas para facIlItar la lectura sI fuera necesarIo
Los comentarIos en el codIgo SQL comIenzan por Yz y termInan por zY (excepto
en algunos SC80)
(>4B* JJ]
(>4B4)* $"-51#=%%$."
El 00L es la parte del lenguaje SQL que realIza la funcIon de defInIcIon de datos del
SC80. Fundamentalmente se encarga de la creacIon, modIfIcacIon y elImInacIon de los
objetos de la base de datos (es decIr de los %$#&+&#)!). Por supuesto es el encargado
de la creacIon de las tablas.
Cada usuarIo de una base de datos posee un $!T/$%&. El esquema suele tener el
mIsmo nombre que el usuarIo y sIrve para almacenar los objetos de esquema, es decIr
los objetos que posee el usuarIo.
Esos objetos pueden ser: tablas, vIstas, indIces y otras objetos relacIonados con la
defInIcIon de la base de datos. Los objetos son manIpulados y creados por los usuarIos.
En prIncIpIo solo los admInIstradores y los usuarIos propIetarIos pueden acceder a cada
objeto, salvo que se modIfIquen los prIvIlegIos del objeto para permItIr el acceso a otros
usuarIos.
Hay que tener en cuenta que 0"0(/0& "0!#*/.."10 AAF 8/$+$ !$* &0/9&+& 8)* /0&
"0!#*/.."10 >\FFVDEr (la InstruccIon FDLL8ACK est relacIonada con el uso de
transaccIones que se comentarn ms adelante) por lo que hay que tener mucha
precaucIon a la hora de utIlIzarlas. Es decIr, las InstruccIones 00L generan accIones que
no se pueden deshacer (salvo que dIspongamos de alguna copIa de segurIdad).
(>4B49* %5&3%$." #& 23,&, #& #3-1,
Esta es una tarea admInIstratIva que se comentar ms profundamente en otros temas.
Por ahora solo se comenta de forma sImple. Crear la base de datos ImplIca IndIcar los
archIvos y ubIcacIones que se utIlIzarn para la mIsma, adems de otras IndIcacIones
tcnIcas y admInIstratIvas que no se comentarn en este tema.
LogIcamente solo es posIble crear una base de datos sI se tIenen prIvIlegIos 08A
(0ataase Admnstrator) (<a<AVD en el caso de Dracle).
El comando SQL de creacIon de una base de datos es E>GDOG ADODVD<G. Este
comando crea una base de datos con el nombre que se IndIque. Ejemplo:
&-$4'$ )4'454#$ pruebu;
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!+*#
Pero normalmente se IndIcan ms parmetros. Ejemplo (parmetros de Dracle):
&-$4'$ )4'454#$ pruebu
%.6,*%$ pruebu.Iog
/47%.6,*%$# z
/47*+#'4+&$# 1o
4-&8*9$%.6
&84-4&'$- #$' WN1z1q
+4'*.+4% &84-4&'$- #$' UT8
)4'4,*%$ pruebu1.dbI 4:'.$7'$+) .+ /47#*;$ ooMB;
(>4B4>* 12?&-1, #& 83 23,& #& #3-1,
Segun los estndares actuales, una base de datos es un conjunto de objetos pensados
para gestIonar datos. Estos objetos estn contenIdos en $!T/$%&!, los esquemas suelen
estar asocIados al perfIl de un usuarIo en partIcular.
En el estndar SQL exIste el concepto de .&#39)() que sIrve para almacenar
esquemas. Asi el nombre completo de un objeto vendria dado por:
cuLuIogo<esquemu<objeLo
SI no se IndIca el catlogo se toma el catlogo por defecto. SI no se IndIca el esquema
se entIende que el objeto est en el esquema actual. En Dracle, cuando se crea un
usuarIo, se crea un esquema cuyo nombre es el del usuarIo.
(>4B4B* %5&3%$." #& -3283,
"1:25& #& 83, -3283,
0eben cumplIr las sIguIentes reglas (reglas de Dracle, en otros SC80 podrian cambIar):
0eben comenzar con una letra
No deben tener ms de J0 caracteres
Solo se permIten utIlIzar letras del alfabeto (Ingls), numeros o el sIgno de
subrayado (tambIn el sIgno { y |, pero esos se utIlIzan de manera especIal por
lo que no son recomendados)
No puede haber dos tablas con el mIsmo nombre para el mIsmo esquema
(pueden coIncIdIr los nombres sI estn en dIstIntos esquemas)
No puede coIncIdIr con el nombre de una palabra reservada SQL (por ejemplo
no se puede llamar <GFGEO a una tabla)
En el caso de que el nombre tenga espacIos en blanco o caracteres nacIonales
(permItIdo solo en algunas bases de datos), entonces se suele entrecomIllar con
comIllas dobles. En el estndar SQL 99 (respetado por Dracle) se pueden
utIlIzar comIllas dobles al poner el nombre de la tabla a fIn de hacerla sensIble
a las mayusculas (se dIferencIar entre FACTURAS y Facturas)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!++#
15#&" SY`UR` RUI]`
Es la orden SQL que permIte crear una tabla. Por defecto ser almacenada en el espacIo
y esquema del usuarIo que crea la tabla. SIntaxIs:
&-$4'$ '45%$ =esquemu<> nombreDeTubIu
?nombreDeuCoIumnu1 LIpoDeDuLos =)$,4:%' vuIor> =resLrIccIones>
=! <<<>@0
Ejemplo:
&-$4'$ '45%$ proveedores ?nombre 94-&84-?z@@0
Crea una tabla con un solo campo de tIpo lD>EBD>=
Solo se podr crear la tabla sI el usuarIo posee los permIsos necesarIos para ello. SI
la tabla pertenece a otro esquema (suponIendo que el usuarIo tenga permIso para
grabar tablas en ese otro esquema), se antepone al nombre de la tabla , el nombre del
esquema:
&-$4'$ '45%$ oLroUsuurIo.proveedores ?nombre 94-&84-?z@@0
Se puede IndIcar un valor por defecto para el atrIbuto medIante la clusula AGHD]FO:
&-$4'$ '45%$ Proveedores ?
nombre 94-&84-?z@!
IocuIIdud 94-&84-?AB@ )$,4:%' PuIencIu@0
0e este modo sI aadImos un proveedor y no IndIcamos localIdad, se tomar PalencIa
como localIdad de dIcho Proveedor.
(>4B4C* -$<1, #& #3-1,
A la hora de crear tablas, hay que IndIcar el tIpo de datos de cada campo. NecesItamos
pues conocer los dIstIntos tIpos de datos. Estos son:
A$!.*"8."10 O"8)! G!#30+&* <[F \*&.9$ <[F
O$L#)
Texto de
anchura fIja
EBD>DEOG>5n7
EBD>5n7
EBD>5n7
Texto de
anchura
varIable
EBD>DEOG> lD>a4XU5n7
lD>EBD> 5n7
lD>EBD>-5n7
Texto de
anchura fIja
para
caracteres
nacIonales
XDO4\XDF EBD>DEOG>5n7
XDO4\XDF EBD>5n7
XEBD>5n7
XEBD>5n7
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!+,#
A$!.*"8."10 O"8)! G!#30+&* <[F \*&.9$ <[F
Texto de
anchura
varIable para
caracteres
nacIonales
XDO4\XDF EBD>DEOG>
lD>a4XU5n7
XDO4\XDF EBD> lD>a4XU5n7
XEBD> lD>a4XU5n7
XlD>EBD>-5n7
Xh%$*)!
Enteros
pequeos
(2 bytes)
<SDFF4XO
Enteros
normales
(4 bytes)
4XOGUG>
4XO

Enteros largos
(8 bytes)
V4U4XO
(en realIdad no es estndar, pero
es muy utIlIzado en muchas bases
de datos)

Enteros
precIsIon
decImal
X]SVG>5n7
0ecImal de
coma varIable
HF\DO
A\]VFG
A\]VFG @>GE4<<4\X
>GDF
X]SVG>
0ecImal de
coma fIja
X]SG>4E5m,d7
AGE4SDF5m,d7
X]SVG>5m,d7
H$.:&!
Fechas ADOG ADOG
Fecha y hora O4SG<ODS@ O4SG<ODS@
ntervalos 4XOG>lDF 4XOG>lDF
V))9$&0)! N ,"0&*")!
LogIcos V\\FGDX
V\\F

8InarIos V4O
V4O lD>a4XU5n7
lD>V4O5n7

A&#)! +$ (*&0 #&%&Z)
Texto gran
longItud
EBD>DEOG> FD>UG \VbGEO
EF\V
F\XU (en desuso)
EF\V
8InarIo de
gran longItud
V4XD>a FD>UG \VbGEO
VF\V
>DQ (en desuso)
F\XU >DQ (en desuso)
VF\V
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!,-#
0urante el resto del manual se har referencIa solo a los tIpos Dracle.
-&@-1,
Para los textos dIsponemos de los sIguIentes tIpos (Dracle):
lD>EBD> = Para textos de longItud varIable. Su tamao depende de la base de
datos (en Dracle es de 4000). En Dracle se llama lD>EBD>-, pero es posIble
seguIr utIlIzando 7AFCHAF.
EBD>= Para textos de longItud fIja (en Dracle hasta 2000 caracteres).
XEBD>= Para el almacenamIento de caracteres nacIonales de texto fIjo
XlD>EBD>= Para el almacenamIento de caracteres nacIonales de longItud
varIable. En Dracle se llama XlD>EBD>-.
En todos estos tIpos se IndIcan los tamaos entre parntesIs tras el nombre del tIpo.
ConvIene poner sufIcIente espacIo para almacenar los valores. En el caso de los
7AFCHAF2, no se malgasta espacIo por poner ms espacIo del deseado ya que sI el texto
es ms pequeo que el tamao IndIcado, el resto del espacIo se ocupa.
"L:&51,
En este capitulo se explIcan los tIpos numrIcos para el sIstema Dracle; para SQL
estndar consultar la tabla de tIpos de datos.
En Dracle, el tIpo X]SVG> es un formato verstIl que permIte representar todo tIpo
de numeros. Su rango recoge numeros de entre 10
1J0
y 9,99999999999 * 10
128
. Fuera de
estos rangos Dracle devuelve un error.
Los numeros decImales (numeros de coma fIja) se IndIcan con X]SVG>5Is7, donde p
es la precIsIon mxIma y s es la escala (numero de decImales a la derecha de la coma).
Por ejemplo, NU|8EF (8,J) IndIca que se representan numeros de ocho cIfras de
precIsIon y tres decImales. Los decImales en Dracle se presenta con el 8/0#) N 0) .)0
9& .)%&=
Para numeros enteros se IndIca X]SVG>57 donde p es el numero de digItos. Eso es
equIvalente a NU|8EF(p,0).
Para numeros de coma flotante (equIvalentes a los 29)&# o +)/,9$ de muchos
lenguajes de programacIon) sImplemente se IndIca el texto X]SVG> sIn precIsIon nI
escala.
<5&%$,$." / &,%383
La cuestIon de la precIsIon y la escala es compleja. Para entenderla mejor, se muestran
estos ejemplos:
H)*%&#) Xh%$*) $!.*"#) 8)* $9 /!/&*") <$ &9%&.$0& .)mo
X]SVG> J45255.J45 J45255.J45
X]SVG>5_7 J45255.J45 J45255
X]SVG>5_I-7 J45255.J45 J45255.J5
X]SVG>5W7 J45255.J45 0a error de precIsIon
X]SVG>5_Ie-7 J45255.J45 J45J00
X]SVG>5WI-7 J45255.J45 0a error de precIsIon
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!,%#
En defInItIva, la precIsIon debe IncluIr todos los digItos del numero (puede llegar hasta
J8 digItos). La escala solo IndIca los decImales que se respetarn del numero, pero sI es
negatIva IndIca ceros a la IzquIerda del decImal.
;&%63, / 6153,
JUR`
El tIpo ADOG permIte almacenar fechas. Las fechas se pueden escrIbIr en formato dia,
mes y ao entre comIllas. El separador puede ser una barra de dIvIdIr, un guIon y casI
cualquIer simbolo.
Para almacenar la fecha actual la mayoria de bases de datos proporcIonan funcIones
(como <a<ADOG en Dracle) que devuelven ese valor. Las fechas no se pueden manejar
dIrectamente, normalmente se usan funcIones de conversIon. En el caso de Dracle se
suele usar O\iADOG (que se detallar en el tema sIguIente). Ejemplo:
'.C)4'$?3/5/2007)
RNZ`GRUZX
Es una extensIon del anterIor, almacena valores de dia, mes y ao, junto con hora,
mInuto y segundos (Incluso con decImales). Con lo que representa un Instante concreto
en el tiempo. Un ejemplo de TIMESTAMP sera 2/2/2004 18:34:23,34521. En este caso
sI el formato de fecha y hora del sIstema est pensado para el IdIoma espaol, el
separador decImal ser la coma (y no el punto).
$"-&57381,
SIrven para almacenar Intervalos de tIempo (no fechas, sIno una suma de elementos de
tIempo). En el caso de Dracle son:
NVR`YhU] i`UY RO ZOVRj
Este tIpo de datos almacena aos y meses. Tras la palabra YEAR se puede IndIcar la
precIsIon de los aos (cIfras del ao), por defecto es de dos..
Para los Intervalos de ao a mes los valores se pueden IndIcar de estas formas:
23 456 '7", 8 ,(-, %(,(, 32
*+'$-94% '1z-6' D$4- '. /.+'8
23 456 '7", 32
*+'$-94% '1z' D$4- '. /.+'8
23 9 %(,(, 32
*+'$-94% '6' /.+'8 '. /.+'8

NVR`YhU] JUi RO G`SOVJ
Fepresenta Intervalos de tIempo que expresan dias, horas, mInutos y segundos. Se
puede IndIcar la precIsIon tras el texto 0AY y el numero de decImales de los segundos
tras el texto SECDN0.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!,"#
Ejemplos:
23 : ;<', 4= >"+', 45 %-&$/", 8 ? !"& 6@5 ,(A$&;", 32
*+'$-94% 'q 1o:1z:;,z' )4D '. #$&.+)?@
23 : ;<', 4= >"+', 45 %-&$/", 32
*+'$-94% 'q 1o:1z' )4D '. /*+:'$
23 : ;<', 4= >"+', 32
*+'$-94% 'q 1o' )4D '. 8.:-
23 : ;<',32
*+'$-94% 'q' )4D
234= >"+',32
*+'$-94% '1o' 8.:-
235@ >"+',32
*+'$-94% 'z' 8.:-
2345 %-&$/",32
*+'$-94% '1z' /*+:'$
236= ,(A$&;", 32
*+'$-94% 'o' #$&.+)
23B >"+', 8 @= %-&$/", 32
*+'$-94% '8:50 8.:- '. /*+:'$0
23? %-&$/", 9 ,(A$&;",32
*+'$-94% ';:o6' /*+:'$ '. #$&.+)0
23B >"+', ? %-&$/", 9 ,(A$&;",32
*+'$-94% '8:o;:o6' 8.:- '. #$&.+)0
#3-1, #& +53" -3:301
Son tIpos pensados para almacenar datos de tamao muy grande. No pueden poseer
indIces nI ser parte de claves.
S]OI
UtIlIzado para almacenar datos de texto de gran tamao (hasta 4 C8 de texto)
I]OI
UtIlIzado para guardar datos bInarIos de hasta 4 C8 de tamao
(>4B4D* #1:$"$1,
En Dracle se echa de menos una InstruccIon que forma parte del estndar SQL y que
permIte crear domInIos. SIn embargo en SQL estndar si hay esa posIbIlIdad y de hecho
es muy Interesante. Se trata de E>GDOG A\SD4X:
&-$4'$ )./4*+ nume |4#| duLu_Lype
| )$,4:%' expressIon |
| resLrIccIones | ... | |
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!,$#
Ejemplo:
&-$4'$ )./4*+ TdIreccIon 4# 94-&84-?);
CracIas a esa InstruccIon podemos crear la sIguIente tabla:
&-$4'$ '45%$ personuI?
cod_pers #/4%%*+',
nombre 94-&84-(o),
dIreccIon 'EFGHIIFJK
@
Como se observa en la sIntaxIs, se puede IndIcar un valor por defecto al domInIo e
Incluso establecer algunas restrIccIones (ms adelante se explIca como poner
restrIccIones).
En el caso de Dracle se puede utIlIzar la InstruccIon E>GDOG Oa@G, aunque no es
sInonImo de sta. 0e hecho E>GDOG Oa@G es una InstruccIon objetorelacIonal y
permIte crear tIpos avanzados de datos (que no es lo mIsmo que un domInIo).
(>4B4E* %1",=8-35 83, -3283, #&8 =,=35$1
%1",=8-35 &8 #$%%$1"35$1 #& #3-1,
Todas las bases de datos dIsponen de posIbIlIdades para consultar el dIccIonarIo de
datos. SIguIendo las reglas de Codd, la forma de consultar los metadatos es la mIsma
que en el resto de tablas. Es decIr exIsten tablas (en realIdad ;"!#&!) que en lugar de
contener datos, contIenen los metadatos. En el caso de SQL estndar, el dIccIonarIo de
datos es accesIble medIante el esquema de InformacIon (4XH\>SDO4\Xi<EBGSD), un
esquema especIal que contIene el conjunto de vIstas con el que se pueden consultar ps
metadatos de la base de datos. En concreto la vIsta 4XH\>SDO4\Xi<EBGSD=ODVFG<
obtIene una vIsta de las tablas creadas. Es decIr:
#$%$&' ( ,-./ *+,.-/4'*.+C#&8$/4<'45%$#
Esa InstruccIon muestra una tabla con dIversas columnas, entre ellas la columna
ODVFGiEDODF\U IndIca el catlogo en el que est la tabla, ODVFGi<EBGSD el
esquema en el que est la tabla y ODVFGiXDSG el nombre de la tabla.
|uchos SC80 respetan el estndar, pero en el caso de \*&.9$ no. Dracle utIlIza
dIversas vIstas para mostrar las tablas de la base de datos. En concreto ]<G>iODVFG< y
que contIene una lIsta de las tablas del usuarIo actual (o del esquema actual). Asi para
sacar la lIsta de tablas del usuarIo actual, se haria:
#$%$&' ( ,-./ :#$-C'45%$#0
Esta vIsta obtIene numerosas columnas, en concreto la columna ODVFG<iXDSG muestra
el nombre de cada tabla.
Dtra vIsta es DFFiODVFG< mostrar una lIsta de todas las tablas de la base de datos
(no solo del usuarIo actual), aunque oculta las que el usuarIo no tIene derecho a ver.
FInalmente AVDiODVFG< es una tabla que contIene absolutamente todas las tablas del
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!,'#
sIstema; esto es accesIble solo por el usuarIo admInIstrador (0A). En el caso de
ALL_TA8LES y de 08A_TA8LES, la columna \QXG> IndIca el nombre del propIetarIo de
la tabla.
15#&" J`GSYNI`
El comando 0ESCF8E, permIte obtener la estructura de una tabla. Ejemplo:
)$#&-*5$ exIsLencIus;
Y aparecern los campos de la tabla proveedores. Esta InstruccIon no es parte del SQL
estndar, pero casI es consIderada asi ya que casI todos los SC80 la utIlIzan. Un ejemplo
del resultado de la orden anterIor (en Dracle) seria:
X)%,*$ jX/9)k O"8)
XiDFSDEGX NOT NULL NUMBER(2)
O4@\ NOT NULL VARCHAR2(2)
S\AGF\ NOT NULL NUMBER(2)
EDXO4ADA NUMBER(7)
12-&"&5 83 8$,-3 #& 83, %18=:"3, #& 83, -3283,
Dtra posIbIlIdad para poder consultar los datos referentes a las columnas de una tabla,
es utIlIzar el dIccIonarIo de datos.
Dracle posee una vIsta llamada ]<G>iODViE\F]SX< que permIte consultar todas
las columnas de las tablas del esquema actual. Las vIstas DFFiODViE\F]SX< y
AVDiODViE\F]SX< muestran los datos del resto de tablas (la prImera solo de las
tablas accesIbles por el usuarIo).
En el caso de SQL estndar las columnas son accesIbles medIante la vIsta
4XH\>SDO4\Xi<EBGSD=E\F]SX<
(>4B4b* 215535 -3283,
La orden A>\@ ODVFG seguIda del nombre de una tabla, permIte elImInar la tabla en
cuestIon.
Al borrar una tabla:
0esaparecen todos los datos
CualquIer vIsta y sInonImo referente a la tabla seguIr exIstIendo, pero ya no
funcIonar (convIene elImInarlos)
Las transaccIones pendIentes son aceptadas (E\SS4O), en aquellas bases de
datos que tengan la posIbIlIdad de utIlIzar transaccIones.
LogIcamente, solo se pueden elImInar las tablas sobre las que tenemos permIso
de borrado.
Normalmente, $9 ,)**&+) +$ /0& #&,9& $! "**$;$*!",9$, y no hay nInguna petIcIon de
confIrmacIon, por lo que convIene ser muy cuIdadoso con esta operacIon.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!,(#
(>4B4c* :1#$;$%35 -3283,
%3:2$35 #& "1:25& 3 ="3 -3283
0e forma estndar (SQL estndar) se hace:
4%'$- '45%$ nombreVIejo -$+4/$ '. nombreNuevo0
En Dracle, adems de con la orden anterIor, se realIza medIante la orden >GXDSG (que
permIte el cambIo de nombre de cualquIer objeto). SIntaxIs:
-$+4/$ nombreVIejo '. nombreNuevo0
Pero por coherencIa es mejor hacerlo de la prImera forma (la del estndar).
215535 %1"-&"$#1 #& -3283,
Dracle dIspone de una orden no estndar para elImInar defInItIvamente los datos de una
tabla; es la orden O>]XEDOG ODVFG seguIda del nombre de la tabla a borrar. Hace que
se elImIne el contenIdo de la tabla, pero no la estructura de la tabla en si. ncluso borra
del archIvo de datos el espacIo ocupado por la tabla.
303#$5 %18=:"3,
4%'$- '45%$ nombreTubIu 4))?nombreCoIumnu TIpoDuLos =PropIedudes>
=,coIumnuSIguIenLe LIpoDuLos =LGJLFHEMEHN><<<@
PermIte aadIr nuevas columnas a la tabla. Se deben IndIcar su tIpo de datos y sus
propIedades sI es necesarIo (al estIlo de E>GDOG ODVFG).
Las nuevas columnas se aaden al fInal, no se puede IndIcar otra posIcIon (hay que
recordar que el orden de las columnas no Importa). Ejemplo:
4%'$- '45%$ IucLurus 4)) ?IecIu )4'$@0
|uchas bases de datos (pero no Dracle) requIeren escrIbIr la palabra E\F]SX tras la
palabra DAA. Normalmente suele ser opcIonal
215535 %18=:"3,
4%'$- '45%$ nombreTubIu )-.O?coIumnu =!coIumnuSIguIenLe,...|@0
ElImIna la columna IndIcada de manera IrreversIble e Incluyendo los datos que contenia.
No se puede elImInar la unIca columna de una tabla que solo tIene esa columna (habr
que usar 0FDP TA8LE).
4%'$- '45%$ IucLurus )-.O ?IecIu@0
Al Igual que en el caso anterIor, en SQL estndar se puede escrIbIr el texto E\F]SX
tras la palabra A>\@.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!,)#
:1#$;$%35 %18=:"3
PermIte cambIar el tIpo de datos y propIedades de una determInada columna. SIntaxIs:
4%'$- '45%$ nombreTubIu /.)*,D?coIumnu LIpo =propIedudes>
=coIumnuSIguIenLe LIpo =propIedudes> <<<>
Los cambIos que se permIten son (en Dracle):
ncrementar precIsIon o anchura de los tIpos de datos
Solo se puede reducIr la anchura sI la anchura mxIma de un campo sI esa
columna posee nulos en todos los regIstros, o todos los valores son tan
pequeos como la nueva anchura o no hay regIstros
Se puede pasar de EBD> a lD>EBD>- y vIceversa (sI no se modIfIca la anchura)
Se puede pasar de ADOG a O4SG<ODS@ y vIceversa
CualquIer otro cambIo solo es posIble sI la tabla est vacia
Ejemplo:
4%'$- '45%$ IucLurus /.)*,D?IecIu '*/$#'4/O@0
En el caso de SQL estndar en lugar de S\A4Ha se emplea DFOG> (que adems
opcIonalmente puede Ir seguIda de E\F]SX). Por ejemplo:
4%'$- '45%$ IucLurus 4%'$- &.%:/+ IecIu '*/$#'4/O0
5&"1:2535 %18=:"3
Esto permIte cambIar el nombre de una columna. SIntaxIs
4%'$- '45%$ nombreTubIu
-$+4/$ &.%:/+ nombreAnLIguo '. nombreNuevo
Ejemplo:
4%'$- '45%$ IucLurus -$+4/$ &.%:/+ IecIu '. IecIuYIoru0
73815 <15 #&;&%-1
A cada columna se le puede asIgnar un valor por defecto durante su creacIon medIante
la propIedad AGHD]FO. Se puede poner esta propIedad durante la creacIon o
modIfIcacIon de la tabla, aadIendo la palabra AGHD]FO tras el tIpo de datos del campo
y colocando detrs el valor que se desea por defecto.
Ejemplo:
&-$4'$ '45%$ urLIcuIo ?cod +:/5$-?;@, nombre 94-&84-P?z@,
precIo +:/5$-?11,z@ )$,4:%' .@0
La palabra 0EFAULT se puede aadIr durante la creacIon o la modIfIcacIon de la tabla
(comando DFOG> ODVFG)
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!,*#
(>4B4)d* 5&,-5$%%$1"&,
Una restrIccIon es una condIcIon de oblIgado cumplImIento para una o ms columnas de
la tabla. A cada restrIccIon se le pone un nombre, en el caso de no poner un nombre
(algo poco recomendable) entonces el propIo Dracle le coloca el nombre que es un
mnemotcnIco con el nombre de tabla, columna y tIpo de restrIccIon.
Su sIntaxIs general es:
1&-$4'$ '45%$ nombreTubIu 2
4%'$- '45%$ nombreTubIu 14)) 2 /.)*,D33
?cumpo LIpoDeDuLos =propIedudes>
==&.+#'-4*+' nombreResLrIccIn >> LIpoResLrIccIn ?coIumnus@
=,sIguIenLeCumpo>
=!&.+#'-4*+' nombreResLrIccIn LIpoResLrIccIn ?coIumnus@ <<<@
Las restrIccIones tIenen un nombre, se puede hacer que sea la base de datos la que les
ponga nombre, pero entonces seria criptIco. Por eso es mejor ponerle un nombre
nosotros para que sea ms fcIl de recordar.
Los nombres de restrIccIon no se pueden repetIr para el mIsmo esquema, debemos
de buscar nombres unIcos. Es buena Idea IncluIr de algun modo el nombre de la tabla,
los campos Involucrados y el tIpo de restrIccIon en el nombre de la mIsma. Por ejemplo
eza_d_k podria IndIcar que el campo d de la tabla eza tIene una clave prIncIpal
(@F|AFY rEY).

0esde la empresa Dracle se aconseja la sIguIente regla a la hora de poner nombre a las
restrIccIones:
Tres letras para el nombre de la tabla
Carcter de subrayado
Tres letras con la columna afectada por la restrIccIon
Carcter de subrayado
0os letras con la abrevIatura del tIpo de restrIccIon. La abrevIatura puede ser:
- XX. NDT NULL.
- @r. PF|AFY KEY
- ]r. UNQUE
- Hr. FDFECN KEY
- Er= CHECK (valIdacIon)
Por ejemplo para hacer que la clave prIncIpal de la tabla Alumnos sea el cdyo del
alumno, el nombre de la restrIccIon podria ser:
uIu_cod_pk
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!,+#
<516$2$5 "=81,
La restrIccIon X\O X]FF permIte prohIbIr los nulos en una determInada tabla. Eso
oblIga a que la columna tenga que tener oblIgatorIamente un valor para que sea
almacenado el regIstro.
Se puede colocar durante la creacIon (o modIfIcacIon) del campo aadIendo la
palabra NDT NULL tras el tIpo:
&-$4'$ '45%$ cIIenLe?dnI 94-&84-P?q@ +.' +:%%@0
En ese caso el nombre le coloca la propIa base de datos (en el caso de Dracle el nombre
seria algo como SY002341 por ejemplo). No es recomendable no poner nombre a las
restrIccIones para controlarlas mejor.
Para poner el nombre se usa:
&-$4'$ '45%$ cIIenLe?dnI 94-&84-P?q@
&.+#'-4*+' cII_dnI_nn +.' +:%%@0
La restrIccIon X\O X]FF es la unIca que solo se puede poner seguIda al nombre de la
columna a la que se aplIca (la razon es que X\O X]FF solo se puede aplIcar a un campo
a la vez)
73815&, L"$%1,
Las restrIccIones de tIpo UNQUE oblIgan a que el contenIdo de una o ms columnas no
puedan repetIr valores. Nuevamente hay dos formas de colocar esta restrIccIon:
&-$4'$ '45%$ cIIenLe?dnI 94-&84-P?q@ :+*Q:$@0
En ese caso el nombre de la restrIccIon la coloca el sIstema. Dtra forma es:
&-$4'$ '45%$ cIIenLe?dnI 94-&84-P?q@
&.+#'-4*+' dnI_u :+*Q:$@0
Esta forma permIte poner un nombre a la restrIccIon. SI la repetIcIon de valores se
refIere a varIos campos, la forma seria:
&-$4'$ '45%$ uIquIIer?dnI 94-&84-P?q@,
cod_peIIcuIu +:/5$-?@,
&.+#'-4*+' uIquIIer_uk :+*Q:$?dnI,cod_peIIcuIu@ 0
La coma tras la defInIcIon del campo cod_elcula hace que la restrIccIon sea
IndependIente de ese campo. Eso oblIga a que, tras UNQUE se IndIque la lIsta de
campos. ncluso para un solo campo se puede colocar la restrIccIon al fInal de la lIsta en
lugar de defInIrlo a contInuacIon del nombre y tIpo de la columna.
Las claves candIdatas deben llevar restrIccIones ]X4[]G y X\O X]FF
%837& <5$:35$3
La clave prImarIa de una tabla la forman las columnas que IndIcan a cada regIstro de la
mIsma. La clave prImarIa hace que los campos que la forman sean NDT NULL (sIn
posIbIlIdad de quedar vacios) y que los valores de los campos sean de tIpo UNQUE (sIn
posIbIlIdad de repetIcIon).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!,,#
SI la clave est formada por un solo campo basta con:
&-$4'$ '45%$ cIIenLe?
dnI 94-&84-?q@ O-*/4-D R$D,
nombre 94-&84-?o@@ 0
D, ponIendo un nombre a la restrIccIon:
&-$4'$ '45%$ cIIenLe?
dnI 94-&84-?q@ &.+#'-4*+' cIIenLe_pk O-*/4-D R$D,
nombre 94-&84-?o@@ 0
SI la clave est formada por ms de un campo:

&-$4'$ '45%$ uIquIIer?dnI 94-&84-?q@,
cod_peIIcuIu +:/5$-?@,
&.+#'-4*+' uIquIIer_pk
O-*/4-D R$D?dnI,cod_peIIcuIu@@ 0
%837& ,&%="#35$3 1 ;15K"&3
Una clave secundarIa o fornea, es uno o ms campos de una tabla que estn
relacIonados con la clave prIncIpal (o Incluso con una clave candIdata) de otra tabla.
La forma de IndIcar una clave fornea (aplIcando una restrIccIon de IntegrIdad
referencIal) es:
CREATE TABE uIquIIer(
dnI VARCHARz(q) &.+#'-4*+' EKFCST -$,$-$+&$# IUFHKVHN?EKF@!
cod_peIIcuIu NUMBER() &.+#'-4*+' LHUFIWUMCST
-$,$-$+&$# LHUFIWUMN?IJE@!
CONSTRANT uIquIIer_pk PRMARY KEY(dnI,cod_peIIcuIu)
);
SIgnIfIca esta InstruccIon (en cuanto a claves forneas) que el campo dn se relacIona
con la columna dn de la tabla clentes.
SI el campo al que se hace referencIa es la clave prIncIpal, se puede obvIar el nombre
del campo:
CREATE TABE uIquIIer(
dnI VARCHARz(q) &.+#'-4*+' EKFCST -$,$-$+&$# IUFHKVHN!
cod_peIIcuIu NUMBER() &.+#'-4*+' LHUFIWUMCST
-$,$-$+&$# LHUFIWUMN!
CONSTRANT uIquIIer_pk PRMARY KEY(dnI,cod_peIIcuIu) );
En este caso se entIende que los campos hacen referencIa a las claves prIncIpales de las
tablas referencIadas (sI la relacIon la forma ms un campo, el orden de los campos debe
de ser el mIsmo).
Esto forma una relacIon entre dIchas tablas, que adems oblIga al cumplImIento de
la "0#$(*"+&+ *$2$*$0."&9= Esta IntegrIdad oblIga a que cualquIer dn IncluIdo en la
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%--#
tabla alquler tenga que estar oblIgatorIamente en la tabla de clIentes. 0e no ser asi el
regIstro no ser Insertado en la tabla (ocurrIr un error).
Dtra forma de crear claves forneas (utIl para claves formadas por ms de un
campo) es:
CREATE TABE exIsLencIus(
LIpo CHARz(q),
modeIo NUMBER(),
n_uImucen NUMBER(1)
cunLIdud NUMBER(;),
&.+#'-4*+' HXFCVCYCST ,.-$*6+ R$D?VFLJ!YJEHUJ@
-$,$-$+&$# LFHZMN!
&.+#'-4*+' HXFCKMUCST ,.-$*6+ R$D?KCMUYMIHK@
-$,$-$+&$# MUYMIHKHN!
CONSTRANT exI_pk PRMARY KEY(LIpo,modeIo,n_uImucen)
);
SI la defInIcIon de clave secundarIa se pone al fInal hace falta colocar el texto FDFECN
KEY para IndIcar en qu campos se coloca la restrIccIon de clave fornea. En el ejemplo
anterIor es absolutamente necesarIo que la clave prIncIpal de la tabla pIezas a la que
hace referencIa la clave la formen las columnas to y modelo y en que estn en ese
orden.
La IntegrIdad referencIal es una herramIenta ImprescIndIble de las bases de datos
relacIonales. Pero provoca varIos problemas. Por ejemplo, sI borramos un regIstro en la
tabla prIncIpal que est relacIonado con uno o varIos de la secundarIa ocurrIr un error,
ya que de permItirsenos borrar el regIstro ocurrIr fallo de IntegrIdad (habr claves
secundarIos refIrIndose a una clave prIncIpal que ya no exIste).
Por ello se nos pueden ofrecer solucIones a aadIr tras la clusula >GHG>GXEG<. Son:
\X AGFGOG <GO X]FF= Coloca nulos todas las claves secundarIas relacIonadas
con la borrada.
\X AGFGOG ED<EDAG= 8orra todos los regIstros cuya clave secundarIa es Igual
que la clave del regIstro borrado.
\X AGFGOG <GO AGHD]FO= Coloca en el regIstro relacIonado el valor por
defecto en la columna relacIonada
\X AGFGOG X\OB4XU= No hace nada.
En el caso explIcado se aplIcarian las clusulas cuando se elImInen fIlas de la clave
prIncIpal relacIonada con la clave secundarIa. En esas cuatro clusulas se podria
sustItuIr la palabra 0ELETE por la palabra ]@ADOG, hacIendo que el funcIonamIento se
refIera a cuando se modIfIca un regIstro de la tabla prIncIpal; en muchas bases de datos
se admIte el uso tanto de DN 0ELETE como de DN UP0ATE.
En la base de datos Dracle solo se permIte utIlIzar \X AGFGOG <GO X]FF u \X AGFGOG
ED<EDAG. No se admIte el uso de \X ]@ADOG en nIngun caso.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%-%#
La sIntaxIs completa para aadIr claves forneas es:
&-$4'$ '45%$ LubIu?IIsLu_de_cumpos!
&.+#'-4*+' nombreResLrIccIon ,.-$*6+ R$D ?IIsLuCumpos@
-$,$-$+&$# LubIu?cIuvePrIncIpuIReIucIonudu@
=.+ )$%$'$ .+ :O)4'$
=#$' +:%% 2 &4#&4)$ 2 )$,4:%'>
@0
SI es de un solo campo exIste esta alternatIva:
&-$4'$ '45%$ LubIu?IIsLu_de_cumpos LIpos propIedudes,
nombreCumpoCIuveSecundurIu
&.+#'-4*+' nombreResLrIccIon
-$,$-$+&$# LubIu?cIuvePrIncIpuIReIucIonudu@
=.+ )$%$'$ .+ :O)4'$
=#$' +:%% 2 &4#&4)$ 2 )$,4:%'>
@0
Ejemplo:
&-$4'$ '45%$ uIquIIer?dnI 94-&84-?q@,
cod_peIIcuIu +:/5$-?@,
&.+#'-4*+' uIquIIer_pk O-*/4-D R$D?dnI,cod_peIIcuIu@,
&.+#'-4*+' dnI_Ik OREGN KEY (dnI@
-$,$-$+&$# cIIenLes?dnI@
.+ )$%$'$ #$' +:%%,
&.+#'-4*+' peIIcuIu_Ik ,.-$*6+ R$D ?cod_peIIcuIu@
-$,$-$+&$# peIIcuIus?cod@
.+ )$%$'$ &4#&4)$
@0
5&,-5$%%$1"&, #& 738$#3%$."
Son restrIccIones que dIctan una condIcIon que deben cumplIr los contenIdos de una
columna. Una mIsma columna puede tener multIples EBGEr< en su defInIcIon (se
pondrian varIos E\X<O>D4XO seguIdos, sIn comas).
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%-"#
Ejemplo:
&-$4'$ '45%$ Ingresos?cod +:/5$-?@ O-*/4-D R$D,
concepLo 94-&84-P?qo@ +.' +:%%,
ImporLe +:/5$-?11,z@ &.+#'-4*+' ImporLe_mIn
&8$&R ?ImporLe>o@
&.+#'-4*+' ImporLe_mux
&8$&R ?ImporLe<8ooo@ @0
En este caso la CHECK prohibe aadIr datos cuyo Importe no est entre 0 y 8000
Para poder hacer referencIa a otras columnas hay que construIr la restrIccIon de
forma IndependIente a la columna (es decIr al fInal de la tabla):
&-$4'$ '45%$ Ingresos?cod +:/5$-?@ O-*/4-D R$D!
concepLo 94-&84-P?qo@ +.' +:%%,
ImporLe_mux +:/5$-?11,z@,
ImporLe NUMBER(11,z@,
&.+#'-4*+' ImporLe_muxImo
&8$&R ?ImporLe<ImporLe_mux@
@0
303#$5 5&,-5$%%$1"&,
Es posIble querer aadIr restrIccIones tras haber creado la tabla. En ese caso se utIlIza
la sIguIente sIntaxIs:
4%'$- '45%$ LubIu
4)) =&.+#'-4*+' nombre> LIpoDeResLrIccIn?coIumnus@0
toRestrccn es el texto EBGEr, @>4SD>a rGa o H\>G4UX rGa. Las restrIccIones
X\O X]FF deben IndIcarse medIante DFOG> ODVFG .. S\A4Ha colocando X\O X]FF en
el campo que se modIfIca.
215535 5&,-5$%%$1"&,
SIntaxIs:
4%'$- '45%$ LubIu
)-.O {O-*/4-D KEY ] :+*Q:$(cumpos) ]
&.+#'-4*+' nombreResLrIccIn |&4#&4)$|]
La opcIon @>4SD>a rGa elImIna una clave prIncIpal (tambIn quItar el indIce ]X4[]G
sobre las campos que formaban la clave. ]X4[]G elImIna indIces unIcos. La opcIon
E\X<O>D4XO elImIna la restrIccIon IndIcada.
La opcIon ED<EDAG hace que se elImInen en cascada las restrIccIones de IntegrIdad
que dependen de la restrIccIon elImInada.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%-$#
Por ejemplo en:
&-$4'$ '45%$ curso?
cod_curso &84-?;@ O-*/4-D R$D,
IecIu_InIcIo )4'$,
IecIu_IIn )4'$,
LILuIo 94-&84-P?6o@,
cod_sIguIenLecurso &84-?;@,
&.+#'-4*+' IecIu_ck &8$&R?IecIu_IIn>IecIu_InIcIo@,
&.+#'-4*+' cod_sLe_Ik ,.-$*6+ R$D?cod_sIguIenLecurso@
-$,$-$+&$# curso .+ )$%$'$ #$' +:%%@0
Tras esa defInIcIon de tabla, esta InstruccIon:
4%'$- '45%$ curso )-.O O-*/4-D R$D0
Produce este error (en Dracle):
ORA-ozz;: u esLu cIuve nIcuJprImurIu Iucen reIerencIu uIgunus cIuves ujenus
Para ello habria que utIlIzar esta InstruccIon:
ATER TABE curso DROP PRMARY KEY &4#&4)$;
Esa InstruccIon elImIna la restrIccIon de clave secundarIa antes de elImInar la prIncIpal.
TambIn produce error esta InstruccIon:
4%'$- '45%$ curso )-.O?IecIu_InIcIo@0

ERROR en Iineu 1:
ORA-1zqq1: se Iuce reIerencIu u Iu coIumnu en unu resLrIccIn de muILIcoIumnu
El error se debe a que no es posIble borrar una columna que forma parte de la
defInIcIon de una InstruccIon. La solucIon es utIlIzar CASCA0E CDNSTFANT elImIna las
restrIccIones en las que la columna a borrar estaba ImplIcada:
ATER TABE curso DROP(IecIu_InIcIo) &4#&4)$ &.+#'-4*+'#0
Esta InstruccIon elImIna la restrIccIon de tIpo CHECK en la que aparecia la jecha_nco
y asi se puede elImInar la columna. En SQL estndar solo se pone CASCA0E y no
CASCA0E CDNSTFANTS.

#&,3%-$735 5&,-5$%%$1"&,
A veces convIene temporalmente desactIvar una restrIccIon para saltarse las reglas que
Impone. La sIntaxIs es (en Dracle):
4%'$- '45%$ LubIu )*#45%$ &.+#'-4*+' nombre =&4#&4)$>
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%-'#
La opcIon CASCA0E hace que se desactIven tambIn las restrIccIones dependIentes de la
que se desactIvo.
3%-$735 5&,-5$%%$1"&,
Anula la desactIvacIon. Formato (Dracle):
4%'$- '45%$ LubIu $+45%$ &.+#'-4*+' nombre =&4#&4)$>
Solo se permIte volver a actIvar sI los valores de la tabla cumplen la restrIccIon que se
actIva. SI hubo desactIvado en cascada, habr que actIvar cada restrIccIon
IndIvIdualmente.
%3:2$35 #& "1:25& 3 83, 5&,-5$%%$1"&,
Para hacerlo se utIlIza este comando (Dracle):
4%'$- '45%$ LubIe -$+4/$ &.+#'-4*+'
nombreVIejo '. nombreNuevo;
:1,-535 5&,-5$%%$1"&,
G\] &,-K"#35
En SQL estndar hay dos vIstas del dIccIonarIo de datos que permIten vIsualIzar la
InformacIon sobre las restrIccIones aplIcadas en la base de datos. Son:
- 4XH\>SDO4\Xi<EBGSD=ODVFGiE\X<O>D4XO<
- 4XH\>SDO4\Xi<EBGSD=E\X<O>D4XOiE\F]SXi]<DUG
- 4XH\>SDO4\Xi<EBGSD=E\X<O>D4XOiODVFGi]<DUG=
La prImera permIte analIzar las restrIccIones colocada. 0evuelve una tabla con la
sIguIente estructura:
E)9/%0& O"8) +$ +&#)! A$!.*"8."10
ODVFGiEDODF\U texto |uestra el nombre del catlogo al que
pertenece la tabla a la que se puso la
restrIccIon
ODVFGi<EBGSD texto |uestra el nombre del esquema al que
pertenece la tabla a la que se puso la
restrIccIon
ODVFGiXDSG texto |uestra el nombre de la tabla a la que se
puso la restrIccIon
E\X<O>D4XOiEDODF\U texto Catlogo en el que est almacenada la
restrIccIon
E\X<O>D4XOiEDODF\U texto Esquema al que pertenece la restrIccIon
E\X<O>D4XOiXDSG texto Nombre de la restrIccIon
E\X<O>D4XOiOa@G carcter ndIca el tIpo de restrIccIon, puede ser:
EBGEr (E), H\>G4UX rGa (H),
@>4SD>a rGa (@) o ]X4[]G (])
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%-(#
Por su parte 4XH\>SDO4\Xi<EBGSD=E\X<O>D4XOiE\F]SXi]<DUG obtIene
InformacIon sobre las columnas a las que afecta la restrIccIon. La tabla que obtIene es:
E)9/%0& O"8) +$ +&#)! A$!.*"8."10
ODVFGiEDODF\U texto |uestra el nombre del catlogo al que
pertenece la tabla a la que se puso la
restrIccIon
ODVFGi<EBGSD texto |uestra el nombre del esquema al que
pertenece la tabla a la que se puso la
restrIccIon
ODVFGiXDSG texto |uestra el nombre de la tabla a la que se
puso la restrIccIon
E\X<O>D4XOiEDODF\U texto Catlogo en el que est almacenada la
restrIccIon
E\X<O>D4XOiEDODF\U texto Esquema al que pertenece la restrIccIon
E\X<O>D4XOiXDSG texto Nombre de la restrIccIon
E\F]SXiXDSG texto Nombre de cada columna a la que afecta la
restrIccIon.
En el caso de 4XH\>SDO4\Xi<EBGSD=E\X<O>D4XOiODVFGi]<DUG sImplemente nos
dIce el nombre de las restrIccIones y de las tablas a las que afecta.
O53%8&
En el caso de Dracle, se puede utIlIzar la vIsta del dIccIonarIo de datos
]<G>iE\X<O>D4XO<.
Esta vIsta permIte IdentIfIcar las restrIccIones colocadas por el usuarIo
(DFFiE\X<O>D4XO< permIte mostrar las restrIccIones de todos los usuarIos, pero solo
est permItIda a los admInIstradores). En esa vIsta aparece toda la InformacIon que el
dIccIonarIo de datos posee sobre las restrIccIones. En ella tenemos las sIguIentes
columnas Interesantes:
E)9/%0& O"8) +$ +&#)! A$!.*"8."10
\QXG> lD>EBD>-5-c7 ndIca el nombre del usuarIo propIetarIo de la
tabla
E\X<O>D4XOiXDSG lD>EBD>-5Kc7 Nombre de la restrIccIon
E\X<O>D4XOiOa@G lD>EBD>-567 TIpo de restrIccIon:
E= 0e tIpo CHECK o NDT NULL
@= PF|AFY KEY
>= FDFECN KEY
]= UNQUE
ODVFGiXDSG lD>EBD>-5Kc7 Nombre de la tabla en la que se encuentra la
restrIccIon

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%-)#
En el dIccIonarIo de datos hay otra vIsta que proporcIona InformacIon sobre
restrIccIones, se trata de ]<G>iE\X<iE\F]SX<, en dIcha tabla se muestra
InformacIon sobre las columnas que partIcIpan en una restrIccIon. Asi sI hemos defInIdo
una clave prImarIa formada por los campos uno y dos, en la tabla USEF_CDNS_CDLU|NS
aparecern dos entradas, una para el prImer campo del indIce y otra para el segundo.
Se IndIcar adems el orden de aparIcIon en la restrIccIon.
Ejemplo (resultado de la InstruccIon <GFGEO z H>\S ]<G>iE\X<iE\F]SX<):
OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME POSITION
JORGE EXIS_PK EXISTENCIAS TIPO 1
JORGE EXIS_PK EXISTENCIAS MODELO 2
JORGE EXIS_PK EXISTENCIAS N_ALMACEN 3
JORGE PIEZA_FK EXISTENCIAS TIPO 1
JORGE PIEZA_FK EXISTENCIAS MODELO 2
JORGE PIEZA_PK PIEZA TIPO 1
JORGE PIEZA_PK PIEZA MODELO 2
En esta tabla USEF_CDNS_CDLU|NS aparece una restrIccIon de clave prImarIa sobre la
tabla exstencas, esta clave est formada por las columnas (to, modelo y
n_almacen) y en ese orden. Una segunda restrIccIon llamada eza_jk est compuesta
por to y modelo de la tabla exIstencIas. FInalmente la restrIccIon eza_k est
formada por to y modelo, columnas de la tabla pIeza.
Para saber de qu tIpo son esas restrIccIones, habria que acudIr a la vIsta
]<G>iE\FiE\X<O>D4XO<.
(>4C* JZ]
(>4C4)* $"-51#=%%$."
Es una de las partes fundamentales del lenguaje SQL. El 0|L (0ata Manulaton
Lanyuaye) lo forman las InstruccIones capaces de modIfIcar los datos de las tablas. Al
conjunto de InstruccIones 0|L que se ejecutan consecutIvamente, se las llama
#*&0!&..")0$! y se pueden anular todas ellas o aceptar, ya que una InstruccIon 0|L no
es realmente efectuada hasta que no se acepta (E\SS4O).
En todas estas consultas, el unIco dato devuelto por Dracle es el numero de regIstros
que se han modIfIcado.
(>4C49* $",&5%$." #& #3-1,
La adIcIon de datos a una tabla se realIza medIante la InstruccIon 4X<G>O= Su sIntaxIs
fundamental es:
*+#$-' *+'. LubIu =?IIsLuDeCumpos@>
94%:$# ?vuIor1 =!vuIorz CCC>@
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%-*#
La tabla representa la tabla a la que queremos aadIr el regIstro y los valores que
sIguen a 7ALUES son los valores que damos a los dIstIntos campos del regIstro. SI no se
especIfIca la lIsta de campos, la lIsta de valores debe seguIr el orden de las columnas
segun fueron creados (es el orden de columnas segun las devuelve el comando
AG<E>4VG).
La lIsta de campos a rellenar se IndIca sI no queremos rellenar todos los campos. Los
campos no rellenados explicItamente con la orden NSEFT, se rellenan con su valor por
defecto (AGHD]FO) o bIen con NULL sI no se IndIco valor alguno. SI algun campo tIene
restrIccIon de oblIgatorIedad (X\O X]FF), ocurrIr un error sI no rellenamos el campo
con algun valor.
Por ejemplo, supongamos que tenemos una tabla de clIentes cuyos campos son: dn,
nombre, aelldo1, aelldo2, localdad y dreccn; supongamos que ese es el orden
de creacIon de los campos de esa tabla y que la localIdad tIene como valor por defecto
Palenca y la dIreccIon no tIene valor por defecto. En ese caso estas dos InstruccIones
son equIvalentes:
*+#$-' *+'. cIIenLes 94%:$#? '11111111','Pedro','GuLIrrez',
'Crespo',)$,4:%'!+:%%@0

*+#$-' *+'. cIIenLes?dnI,nombre,upeIIIdo1,upeIIIdoz@
94%:$#?'11111111','Pedro','GuLIrrez', 'Crespo'@0
Son equIvalentes puesto que en la segunda InstruccIon los campos no IndIcados se
rellenan con su valor por defecto y la dIreccIon no tIene valor por defecto. La palabra
AGHD]FO fuerza a utIlIzar ese valor por defecto.
El uso de los dIstIntos tIpos de datos debe de cumplIr los requIsItos ya comentados
en apartados anterIores.
(>4C4>* 3%-=38$M3%$." #& 5&+$,-51,
La modIfIcacIon de los datos de los regIstros lo Implementa la InstruccIon ]@ADOG.
SIntaxIs:
:O)4'$ LubIu
#$' coIumnu1[vuIor1 =!coIumnuz[vuIorzCCC>
=\8$-$ condIcIn>
Se modIfIcan las columnas IndIcadas en el apartado SET con los valores IndIcados. La
clusula WHEFE permIte especIfIcar qu regIstros sern modIfIcados.
Ejemplos:
:O)4'$ cIIenLes #$' provIncIu='Ourense'
\8$-$ provIncIu='Orense'0

:O)4'$ producLos #$' precIo=precIo1.160
El prImer dato actualIza la provIncIa de los clIentes de Drense para que aparezca como
Durense.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%-+#
El segundo UP0ATE Incrementa los precIos en un 16. La expresIon para el valor
puede ser todo lo compleja que se desee (en el ejemplo se utIlIzan funcIones de fecha
para conseguIr que los partIdos que se juagaban hoy, pasen a jugarse el martes):
:O)4'$ purLIdos #$' IecIu[ +$7'C)4D?#D#)4'$D'MurLes'@
\8$-$ IecIu=#D#)4'$0
En la condIcIon se pueden utIlIzar cualquIera de los sIguIentes operadores de
comparacIon:
-.*/%6'/ $)F5)G)3%6'
u S&N)* T/$
} S$0)* T/$
um S&N)* ) "(/&9 T/$
}m S$0)* ) "(/&9 T/$
m 4(/&9
}u A"!#"0#)
~m A"!#"0#)
Adems se puede utIlIzar:
-.*/%6'/ $)F5)G)3%6'
DXA
0evuelve verdadero sI las expresIones
a su IzquIerda y derecha son ambas
verdaderas
\>
0evuelve verdadero sI cualquIera de
las dos expresIones a IzquIerda y
derecha del DF, son verdaderas
X\O
nvIerte la logIca de la expresIon que
est a su derecha. SI era verdadera,
medIante NDT pasa a ser falso.

(>4C4B* 21553#1 #& 5&+$,-51,
Se realIza medIante la InstruccIon 0ELETE:
)$%$'$ =,-./> LubIu
=\8$-$ condIcIn>
Es ms sencIlla que las anterIores, elImIna los regIstros de la tabla que cumplan la
condIcIon IndIcada. Ejemplo:
)$%$'$ ,-./ empIeudos
\8$-$ seccIon=z0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%-,#
Hay que tener en cuenta que el borrado de un regIstro no puede provocar fallos de
IntegrIdad y que la opcIon de "0#$(*"+&+ \X AGFGOG ED<EDAG hace que no solo se
borren los regIstros IndIcados en el SELECT, sIno todos los relacIonados.
(>4D* -53",3%%$1"&,
Como se ha comentado anterIormente, una transaccIon est formada por una serIe de
InstruccIones 0|L. Una transaccIon comIenza con la prImera InstruccIon 0|L que se
ejecute y fInalIza con alguna de estas cIrcunstancIas:
Una operacIon E\SS4O o >\FFVDEr
Una InstruccIon 00L (como DFOG> ODVFG por ejemplo)
Una InstruccIon 0CL (como U>DXO)
El usuarIo abandona la sesIon
Caida del sIstema
Hay que tener en cuenta que cualquIer InstruccIon 00L o 0CL da lugar a un CD||T
ImplicIto, es decIr todas las InstruccIones 0|L ejecutadas hasta ese Instante pasan a ser
defInItIvas.
(>4D49* SOZZNR
La InstruccIon CD||T hace que los cambIos realIzados por la transaccIon sean
defInItIvos, Irrevocables. Solo se debe utIlIzar sI estamos de acuerdo con los cambIos,
convIene asegurarse mucho antes de realIzar el CD||T ya que las InstruccIones
ejecutadas pueden afectar a mIles de regIstros.
Adems el cIerre correcto de la sesIon da lugar a un CD||T, aunque sIempre
convIene ejecutar explicItamente esta InstruccIon a fIn de asegurarnos de lo que
hacemos.
(>4D4>* YO]]IUSk
Esta InstruccIon regresa a la InstruccIon anterIor al InIcIo de la transaccIon,
normalmente el ultImo CD||T, la ultIma InstruccIon 00L o 0CL o al InIcIo de sesIon.
Anula defInItIvamente los cambIos, por lo que convIene tambIn asegurarse de esta
operacIon.
Un abandono de sesIon Incorrecto o un problema de comunIcacIon o de caida del
sIstema dan lugar a un FDLL8ACK ImplicIto.
(>4D4B* &,-3#1 #& 81, #3-1, #=53"-& 83 -53",3%%$."
SI se InIcIa una transaccIon usando comandos 0|L hay que tener en cuenta que:
Se puede volver a la InstruccIon anterIor a la transaccIon cuando se desee
Las InstruccIones de consulta SELECT realIzadas por el usuarIo que InIcIo la
transaccIon muestran los datos ya modIfIcados por las InstruccIones 0|L
El resto de usuarIos ven los datos tal cual estaban antes de la transaccIon, de
hecho los regIstros afectados por la transaccIon aparecen bloqueados hasta que
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%%-#
la transaccIon fInalIce. Esos usuarIos no podrn modIfIcar los valores de dIchos
regIstros.
Tras la transaccIon todos los usuarIos ven los datos tal cual quedan tras el fIn
de transaccIon. Los bloqueos son lIberados y los puntos de ruptura borrados.
(>4E* 1-53, $",-5=%%$1"&, JJ]
(>4E4)* !"#$%&,
Los indIces son objetos que forman parte del esquema que hacen que las bases de datos
aceleren las operacIones de consulta y ordenacIon sobre los campos a los que el indIce
hace referencIa.
Se almacenan aparte de la tabla a la que hace referencIa, lo que permIte crearles y
borrarles en cualquIer momento.
Lo que realIzan es una lIsta ordenada por la que Dracle puede acceder para facIlItar
la busqueda de los datos. cada vez que se aade un nuevo regIstro, los indIces
Involucrados se actualIzan a fIn de que su InformacIon est al dia. 0e ahi que cuantos
ms indIces haya, ms le cuesta a Dracle aadIr regIstros, pero ms rpIdas se realIzan
las InstruccIones de consulta.
La mayoria de los indIces se crean de manera ImplicIta, como consecuencIa de las
restrIccIones @>4SD>a rGa, ]X4[]G y H\>G4UX rGa. Estos son indIces oblIgatorIos, por
los que les crea el propIo SC80.
%5&3%$." #& !"#$%&,
Aparte de los indIces oblIgatorIos comentados anterIormente, se pueden crear indIces
de forma explicIta. stos se crean para aquellos campos sobre los cuales se realIzarn
busquedas e InstruccIones de ordenacIon frecuente.
SIntaxIs:
&-$4'$ *+)$7 nombre
.+ LubIu ?coIumnu1 =,coIumnuz...>@
Ejemplo:
&-$4'$ *+)$7 nombre_compIeLo
.+ cIIenLes (upeIIIdo1, upeIIIdoz, nombre);
El ejemplo crea un indIce para los campos apellIdo1, apellIdo2 y nombre. Esto no es lo
mIsmo que crear un indIce para cada campo, este indIce es efectIvo cuando se buscan u
ordenan clIentes usando los tres campos (cpelldo1, cpelldo2, nombre) a la vez.
Se aconseja crear indIces en campos que:
Contengan una gran cantIdad de valores
Contengan una gran cantIdad de nulos
Sean parte habItual de clusulas QBG>G, U>\]@ Va u \>AG> Va
Seann parte de lIstados de consultas de grandes tablas sobre las que casI
sIempre se muestran como mucho un 4 de su contenIdo.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%%%#
No se aconseja en campos que:
Pertenezcan a tablas pequeas
No se usen a menudo en las consultas
Pertenecen a tablas cuyas consultas muestran menos de un 4 del total de
regIstros
Pertenecen a tablas que se actualIzan frecuentemente
Se utIlIzan en expresIones
Los indIces se pueden crear utIlIzando expresIones complejas:
&-$4'$ *+)$7 nombre_compIejo
.+ cIIenLes ?:OO$-(nombre)@;
Esos indIces tIenen sentIdo sI en las consultas se utIlIzan exactamente esas expresIones.
8$,-3 #& !"#$%&,
Para ver la lIsta de indIces en Dracle se utIlIza la vIsta ]<G>i4XAG`G<. |Ientras que la
vIsta ]<G>i4XAiE\F]SX< |uestra la lIsta de columnas que son utIlIzadas por indIces.
215535 !"#$%&,
La InstruccIon A>\@ 4XAG` seguIda del nombre del indIce permIte elImInar el indIce en
cuestIon.
(>4E49* ,&%=&"%$3,
Una secuencIa sIrve para generar automtIcamente numeros dIstIntos. Se utIlIzan para
generar valores para campos que se utIlIzan como clave forzada (claves cuyo valor no
Interesa, solo sIrven para IdentIfIcar los regIstros de una tabla). Es decIr se utIlIzan en
los IdentIfIcadores de las tablas (campos que comIenzan con la palabra d), sIempre y
cuando no Importe qu numero se asIgna a cada fIla.
Es una rutIna Interna de la base de datos la que realIza la funcIon de generar un
numero dIstInto cada vez. Las secuencIas se almacenan IndependIentemente de la
tabla, por lo que la mIsma secuencIa se puede utIlIzar para dIversas tablas.
%5&3%$." #& ,&%=&"%$3,
SIntaxIs:
&-$4'$ #$Q:$+&$ secuencIu
|*+&-$/$+' 5D n|
|#'4-' \*'8 n|
=1/4794%:$ n2+./4794%:$3>
=1/*+94%:$ n2+./*+94%:$3>
=1&D&%$2+.&D&%$]|
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ K7 SQL (). 00L y 0|L
!%%"#
0onde:
secuenca. Es el nombre que se le da al objeto de secuencIa
4XE>GSGXO Va= ndIca cunto se Incrementa la secuencIa cada vez que se usa.
Por defecto se Incrementa de uno en uno
<OD>O Q4OB= ndIca el valor InIcIal de la secuencIa (por defecto 1)
SD`lDF]G= |xImo valor que puede tomar la secuencIa. SI no se toma
X\SD`lDF]G que permIte llegar hasta el 10
27

S4XlDF]G= |inImo valor que puede tomar la secuencIa. Por defecto 10
26

EaEFG= Hace que la secuencIa vuelva a empezar sI se ha llegado al mxImo
valor.
Ejemplo:
&-$4'$ #$Q:$+&$ numeroPIunLu
*+&-$/$+' 1oo
#'4-'# \*'8 1oo
/4794%:$ zooo0
7&5 8$,-3 #& ,&%=&"%$3,
La vIsta del dIccIonarIo de datos de Dracle ]<G>i<G[]GXEG< muestra la lIsta de
secuencIas actuales. La columna FD<OiX]SVG> muestra cual ser el sIguIente numero
de secuencIa dIsponIble
=,1 #& 83 ,&%=&"%$3
Los mtodos XG`OlDF y E]>>lDF se utIlIzan para obtener el sIguIente numero y el
valor actual de la secuencIa respectIvamente. Ejemplo de uso (Dracle):
#$%$&' numeroPIunLu<+$7'94% ,-./ ):4%0
En SQL estndar:
#$%$&' KHXV]MU?numeroPlanta@0
Eso muestra en pantalla el sIguIente valor de la secuencIa. Fealmente XG`OlDF
Incrementa la secuencIa y devuelve el valor actual. E]>>lDF devuelve el valor de la
secuencIa, pero sIn Incrementar la mIsma.
Ambas funcIones pueden ser utIlIzadas en:
Una consulta <GFGEO que no lleve A4<O4XEO, nI grupos, nI sea parte de una
vIsta, nI sea subconsulta de otro <GFGEO, ]@ADOG o AGFGOG
Una subconsulta <GFGEO en una InstruccIon 4X<G>O
La clusula lDF]G< de la InstruccIon 4X<G>O
La clusula <GO de la InstruccIon ]@ADOG
No se puede utIlIzar (y sIempre hay tentacIones para ello) como valor para la clusula
AGHD]FO de un campo de tabla.
Su uso ms habItual es como apoyo al comando 4X<G>O (en Dracle):
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%%$#
NSERT NTO pIunLus(num, uso)
VAUES(KWYHGJOUMKVM<+$7'94%, 'SuILes');
:1#$;$%35 ,&%=&"%$3,
Se pueden modIfIcar las secuencIas, pero la modIfIcacIon solo puede afectar a los
futuros valores de la secuencIa, no a los ya utIlIzados. SIntaxIs:
4%'$- #$Q:$+&$ secuencIu
=*+&-$/$+' 5D n>
=#'4-' \*'8 n>
=1/4794%:$ n2+./4794%:$3>
=1/*+94%:$ n2+./*+94%:$3>
=1&D&%$2+.&D&%$3>
215535 ,&%=&"%$3,
Lo hace el comando A>\@ <G[]GXEG seguIdo del nombre de la secuencIa a borrar.
8$,-3 #& ,&%=&"%$3,
En SQL estndar, a travs de 4XH\>SDO4\Xi<EBGSD=<G[]GXEG< podemos acceder a la
InformacIon sobre todas las secuencIas creadas. En Dracle se hace medIante la vIsta
]<G>i<G[]GXEG< permIte observar la lIsta de secuencIas del usuarIo.
(>4E4>* ,$"."$:1,
En Dracle, un sInonImo es un nombre que se asIgna a un objeto cualquIera.
Normalmente es un nombre menos descrIptIvo que el orIgInal a fIn de facIlItar la
escrItura del nombre del objeto en dIversas expresIones.
%5&3%$."
SIntaxIs:
&-$4'$ =O:5%*&> #D+.+D/ nombre ,.- objeLo"
obeto es el objeto al que se referIr el sInonImo. La clusula @]VF4E hace que el
sInonImo est dIsponIble para cualquIer usuarIo (solo se permIte utIlIzar sI dIsponemos
de prIvIlegIos admInIstratIvos).
21553#1
)-.O #D+.+D/ nombre
8$,-3 #& ,$"."$:1,
La vIsta ]<G>i<aX\XaS< permIte observar la lIsta de sInonImos del usuarIo, la vIsta
DFFi<aX\XaS< permIte mostrar la lIsta completa de sInonImos de todos los esquemas
a los que tenemos acceso.
!%%(#

(B*
G\] (NN*4
S1",=8-3,
(B4)* %1",=8-3, #& #3-1, %1" G\]4 J\]
(B4)4)* %3<3%$#3#&,
A[F es la abrevIatura del 0ata Query Lanyuaye (lenguaje de consulta de datos) de
SQL. El unIco comando que pertenece a este lenguaje es el verstIl comando <GFGEO
Este comando permIte:
Dbtener datos de cIertas columnas de una tabla (8*)N$.."10)
Dbtener regIstros (fIlas) de una tabla de acuerdo con cIertos crIterIos
(!$9$.."10)
|ezclar datos de tablas dIferentes (&!)."&."10I J)"0)
FealIzar clculos sobre los datos
Agrupar datos
(B4)49* ,$"-3@$, ,&"%$883 #&8 %1:3"#1 G`]`SR
#$%$&' ( ] {|)*#'*+&'| #$%&'() ] *+,-*./0( ==4#| )%/).>! ...3
,-./ 1)2%)0
0onde:
z. El asterIsco sIgnIfIca que se seleccIonan todas las columnas
A4<O4XEO. Hace que no se muestren los valores duplIcados.
.)9/%0&. Es el nombre de una columna de la tabla que se desea mostrar
$L8*$!"10. Una expresIon vlIda SQL
&9"&!. Es un nombre que se le da a la cabecera de la columna en el resultado de
esta InstruccIon.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%%)#

Ejemplos:
23 E(#(!!-.& ;( /";", #", +(A-,/+", ;( #' /'0#' !#-(&/(, 32
#$%$&' ( ,-./ CIIenLes;
23 E(#(!!-.& ;( '#A$&", !'%*",32
#$%$&' nombre, upeIIIdo1, upeIIIdoz ,-./ CIIenLes;
(B49* %K8%=81,
(B494)* 35$-:^-$%1,
Los operadores + (suma), (resta), * (multIplIcacIon) y / (dIvIsIon), se pueden utIlIzar
para hacer clculos en las consultas. Cuando se utIlIzan como expresIon en una consulta
SELECT, no modIfIcan los datos orIgInales sIno que como resultado de la vIsta generada
por SELECT, aparece un nueva columna. Ejemplo:
#$%$&' nombre, precIo,precIo1.16 ,-./ urLIcuIos;
Esa consulta obtIene tres columnas. La tercera tendr como nombre la expresIon
utIlIzada, para poner un alIas basta utIlIzar dIcho alIas tras la expresIon:
#$%$&' nombre, precIo, precIo1.16 4# precIo_con_Ivu
,-./ urLIcuIos;
La prIorIdad de esos operadores es la normal: tIenen ms prIorIdad la multIplIcacIon y
dIvIsIon, despus la suma y la resta. En caso de Igualdad de prIorIdad, se realIza prImero
la operacIon que est ms a la IzquIerda. Como es logIco se puede evItar cumplIr esa
prIorIdad usando parntesIs; el InterIor de los parntesIs es lo que se ejecuta prImero.
Cuando una expresIon arItmtIca se calcula sobre valores X]FF, el resultado es el
propIo valor X]FF.
Se puede utIlIzar cualquIera de los operadores arItmtIcos: suma (), resta (e),
multIplIcacIon (z), dIvIsIon (Y). Como es habItual, la multIplIcacIon y la dIvIsIon tIenen
preferencIa sobre la suma y la resta en el orden de ejecucIon de la InstruccIon; dIcho
orden se puede alterar medIante el uso de los parntesIs.
(B4949* %1"%3-&"3%$." #& -&@-1,
Todas las bases de datos Incluyen algun operador para encadenar textos. En <[F<G>lG>
es el sIgno en Dracle son los sIgnos xx= Ejemplo (Dracle):
#$%$&' LIpo, modeIo, LIpo 22 '-' 22 modeIo "CIuve PIezu"
,-./ pIezus;
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%%*#

El resultado seria:
TIPO MODELO Clave Pieza
AR 6 AR-6
AR 7 AR-7
AR 8 AR-8
AR 9 AR-9
AR 12 AR-12
AR 15 AR-15
AR 20 AR-20
AR 21 AR-21
BI 10 BI-10
BI 20 BI-20
BI 22 BI-22
BI 24 BI-24
En la mayoria de bases de datos, la funcIon E\XEDO (se descrIbe ms adelante) realIza
la mIsma funcIon.
(B4>* %1"#$%$1"&,
Se pueden realIzar consultas que restrInjan los datos de salIda de las tablas. Para ello se
utIlIza la clusula QBG>G. Esta clusula permIte colocar una condIcIon que han de
cumplIr todos los regIstros, los que no la cumplan no aparecen en el resultado.
Ejemplo:
#$%$&' TIpo, ModeIo ,-./ PIezu \8$-$ PrecIo>;
(B4>4)* 1<&53#15&, #& %1:<353%$."
Se pueden utIlIzar en la clusula QBG>G, son:
-.*/%6'/ $)F5)G)3%6'
u S&N)* T/$
} S$0)* T/$
um S&N)* ) "(/&9 T/$
}m S$0)* ) "(/&9 T/$
m 4(/&9
}u A"!#"0#)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%%+#
-.*/%6'/ $)F5)G)3%6'
~m A"!#"0#)
Se pueden utIlIzar tanto para comparar numeros como para comparar textos y fechas.
En el caso de los textos, las comparacIones se hacen en orden alfabtIco. Solo que es un
orden alfabtIco estrIcto. Es decIr el orden de los caracteres en la tabla de codIgos.
En muchas bases de datos hay problemas con la y otros simbolos nacIonales (en
especIal al ordenar o comparar con el sIgno de mayor o menor, ya que la el orden ASC
no respeta el orden de cada alfabeto nacIonal). No obstante es un problema que tIende
a arreglarse en la actualIdad en todos los SC80 (en Dracle no exIste problema alguno)
especIalmente sI son compatIbles con UnIcode.
(B4>49* 73815&, 8.+$%1,
Son:
-.*/%6'/ $)F5)G)3%6'
DXA
0evuelve verdadero sI las expresIones
a su IzquIerda y derecha son ambas
verdaderas
\>
0evuelve verdadero sI cualquIera de
las dos expresIones a IzquIerda y
derecha del DF, son verdaderas
X\O
nvIerte la logIca de la expresIon que
est a su derecha. SI era verdadera,
medIante NDT pasa a ser falso.
Ejemplos:
23 F0/-(&( ' #', *(+,"&', ;( (&/+( 5@ 8 @= '7",32
#$%$&' nombre, upeIIIdo1,upeIIIdoz ,-./ personus
\8$-$ edud>=z 4+) edud<=o;
23F0/-(&( ' #' A(&/( ;( %G, ;( 9= '7", " ;( %(&", ;( 5=32
#$%$&' nombre, upeIIIdo1,upeIIIdoz ,-./ personus
\8$-$ edud>6o .- edud<zo;
23F0/-(&( ' #' A(&/( ;( !"& *+-%(+ '*(##-;" (&/+( #' H 8 #' F 32
#$%$&' nombre,upeIIIdo1,upeIIIdoz ,-./ personus
\8$-$ apellido1>A 4+) apellido2<Z;

(B4>4>* I`RT``V
El operador VGOQGGX nos permIte obtener datos que se encuentren en un rango. Uso:
#$%$&' LIpo,modeIo,precIo ,-./ pIezus
\8$-$ precIo 5$'\$$+ 4+) 8;
Saca pIezas cuyos precIos estn entre J y 8 (ambos IncluIdos).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%%,#

(B4>4B* NV
PermIte obtener regIstros cuyos valores estn en una lIsta de valores:
#$%$&' LIpo,modeIo,precIo ,-./ pIezus
\8$-$ precIo *+ (,, 8);
DbtIene pIezas cuyos precIos sean J, 5 u 8 (no valen nI el precIo 4 nI el 6, por ejemplo).
(B4>4C* ]Nk`
Se usa sobre todo con textos, permIte obtener regIstros cuyo valor en un campo cumpla
una condIcIon textual. LKE utIlIza una cadena que puede contener estos simbolos:
<?%,)9) <"(0"2".&+)

Una serIe cualquIera de caracteres
i
Un carcter cualquIera
Ejemplos:
23 E(#(!!-"&' &"%0+(, I$( (%*-(!(& *"+ E 32
#$%$&' nombre ,-./ personus \8$-$ nombre %*R$ 'S%';
23E(#(!!-"&' #', *(+,"&', !$8" '*(##-;" ,(' E'&!>(JD E(&!>(JD
E/&!>(JDCCC32
#$%$&' upeIIIdo1 ,-./ Personus \8$-$ upeIIIdo1
%*R$ 'S_ncIez';
(B4>4D* NG V_]]
0evuelve verdadero sI el valor que examIna es nulo:
#$%$&' nombre,upeIIIdos ,-./ personus
\8$-$ LeIeIono *# +:%%
Esa InstruccIon seleccIona a la gente que no tIene telfono. Se puede usar la expresIon
4< X\O X]FF que devuelve verdadero en el caso contrarIo, cuando la expresIon no es
nula.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%"-#

(B4>4E* <5&%&#&"%$3 #& 1<&53#15&,
A veces las expresIones que se producen en los <GFGEO son muy extensas y es dIficIl
saber que parte de la expresIon se evalua prImero, por ello se IndIca la sIguIente tabla
de precedencIa (tomada de Dracle):
-/6*5 6* ./*3*6*53)% -.*/%6'/
6 z5|ultIplIcar) Y (dIvIdIr)
- (Suma) e (Festa)
K xx (ConcatenacIon)
M ComparacIones 5uI }I ~mI ===7
P 4< vX\Ow X]FFI vX\O wF4rGI 4X
R X\O
W DXA
^ \>
(B4B* 15#&"3%$."
El orden InIcIal de los regIstros obtenIdos por un SELECT no guarda ms que una relacIon
respecto al orden en el que fueron IntroducIdos. Para ordenar en base a crIterIos ms
Interesantes, se utIlIza la clusula DF0EF 8Y.
En esa clusula se coloca una lIsta de campos que IndIca la forma de ordenar. Se
ordena prImero por el prImer campo de la lIsta, sI hay coIncIdencIas por el segundo, sI
ahi tambIn las hay por el tercero, y asi sucesIvamente.
Se puede colocar las palabras D<E D AG<E (por defecto se toma D<E7= Esas palabras
sIgnIfIcan en ascendente (de la A a la Z, de los numeros pequeos a los grandes) o en
descendente (de la Z a la a, de los numeros grandes a los pequeos) respectIvamente.
SIntaxIs completa de SELECT (para una sola tabla):
#$%$&' {( ] |)*#'*+&'| {#$%&'() ] *+,-*./0(] ||4#| )%/).|! ... ]
,-./ 1)2%)
|\8$-$ #$(3/#/0(|
|.-)$- 5D *+,-*./0(4 |,*+,-*./0(5,||{4#&])$#&]||0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%"%#

(B4C* ;="%$1"&,
(B4C4)* ;="%$1"&,
Todos los SC80 Implementan funcIones para facIlItar la creacIon de consultas
complejas. Esas funcIones dependen del SC80 que utIlIcemos, las que aqui se comentan
son algunas de las que se utIlIzan con Dracle.
Todas las funcIones devuelven un resultado que procede de un determInado clculo.
La mayoria de funcIones precIsan que se les envie datos de entrada (8&*3%$#*)! o
&*(/%$0#)!) que son necesarIos para realIzar el clculo de la funcIon. Este resultado,
logIcamente depende de los parmetros envIados. 0Ichos parmetros se pasan entre
parntesIs. 0e tal manera que la forma de Invocar a una funcIon es:
($'2-*6&(#/0(=?,)-7'*1-$4=! ,)-7'*1-$5!<<<>@>
SI una funcIon no precIsa parmetros (como <a<ADOG) no hace falta colocar los
parntesIs.
En realIdad hay dos tIpos de funcIones:
FuncIones que operan con datos de la mIsma fIla
FuncIones que operan con datos de varIas fIlas dIferentes (2/0.")0$! +$
&(*/8&."10).
En este apartado se tratan las funcIones del prImer tIpo (ms adelante se comentan las
de agrupacIon).

X)#& #&,9& A]DF 5\*&.9$7
Dracle proporcIona una tabla llamada dual con la que se permIten hacer pruebas. Esa
tabla tIene un solo campo (llamado A]SSa) y una sola fIla de modo que es posIble
hacer pruebas. Por ejemplo la consulta:
<GFGEO <[>O5P7 H>\S A]DFp
|uestra una tabla con el contenIdo de ese clculo (la raiz cuadrada de 5). 0UAL es una
tabla Interesante para hacer pruebas.
En los sIguIentes apartados se descrIben algunas de las funcIones ms Interesantes, las
ms Importantes son las remarcadas con un fondo naranja ms Intenso.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%""#

(B4C49* ;="%$1"&, "=:^5$%3,
5&#1"#&1,
8953)H5 !*(3/).3)H5
>\]XA5n,decImales7 Fedondea el numero al sIguIente numero con el
numero de decImales IndIcado ms cercano.
>\]XA(8.2J9,2) devuelve 8.24
O>]XE5nIdecImales7 Los decImales del numero se cortan para que
solo aparezca el numero de decImales IndIcado
:3-&:K-$%3,
8953)H5 !*(3/).3)H5
S\A5n1,n27 0evuelve el resto resultado de dIvIdIr n1 entre
n2
@\QG>5valor,exponente7 Eleva el valor al exponente IndIcado
<[>O5n7 Calcula la raiz cuadrada de n
<4UX5n7 0evuelve 1 sI n es posItIvo, cero sI vale cero y 1
sI es negatIvo
DV<5n) Calcula el valor absoluto de n
G`@5n)
Calcula e
n
, es decIr el exponente en base e del
numero n
FX(n) LogarItmo neperIano de n
F\U(n) LogarItmo en base 10 de n
<4X(n) Calcula el seno de n (n tIene que estar en
radIanes)
E\<5n) Calcula el coseno de n (n tIene que estar en
radIanes)
ODX(n7 Calcula la tangente de n (n tIene que estar en
radIanes)
DE\<5n7 0evuelve en radIanes el arco coseno de n
D<4X5n) 0evuelve en radIanes el arco seno de n
DODX5n) 0evuelve en radIanes el arco tangente de n
<4XB5n) 0evuelve el seno hIperbolIco de n
E\<B5n) 0evuelve el coseno hIperbolIco de n
ODXB5n7 0evuelve la tangente hIperbolIca de n

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%"$#

(B4C4>* ;="%$1"&, #& %353%-&5&,
%1"7&5,$." #&8 -&@-1 3 :3/L,%=83, / :$"L,%=83,
8953)H5 !*(3/).3)H5
F\QG>5texto7 ConvIerte el texto a mInusculas (funcIona con los
caracteres espaoles)
]@@G>5texto7 ConvIerte el texto a mayusculas
4X4OED@5texto7 Coloca la prImera letra de cada palabra en
mayusculas
;="%$1"&, #& -53",;15:3%$."
8953)H5 !*(3/).3)H5
>O>4S5texto7 ElImIna los espacIosa la derecha del texto
FO>4S5texto7 ElImIna los espacIos a la IzquIerda que posea el
texto
O>4S5texto7 ElImIna los espacIos en blanco a la IzquIerda y la
derecha del texto y los espacIos dobles del
InterIor.
O>4S5caracteres H>\S texto7 ElImIna del texto los caracteres IndIcados. Por
ejemplo O>4S('h' H>\S nombre) elImIna las
haches de la columna nombre que estn a la
IzquIerda y a la derecha
<]V<O>5texto,nv,mw7 DbtIene los m sIguIentes caracteres del texto a
partIr de la posIcIon n (sI m no se IndIca se cogen
desde n hasta el fInal).
FGXUOB5texto7 DbtIene el tamao del texto
4X<O>5texto, texto8uscado
vIposnIcIal vI nAparIcIonww7
DbtIene la posIcIon en la que se encuentra el
texto buscado en el texto InIcIal. Se puede
empezar a buscar a partIr de una posIcIon InIcIal
concreta e Incluso IndIcar el numero de
aparIcIon del texto buscado.
Ejemplo, sI buscamos la letra a y ponemos 2 en
nAarcn, devuelve la posIcIon de la segunda
letra a del texto).
SI no lo encuentra devuelve 0
>G@FDEG5texto, textoA8uscar,
[textoFeemplazo]7
8uscar el texto a buscar en un determInado
texto y lo cambIa por el IndIcado como texto de
reemplazo.
SI no se IndIca texto de reemplazo, entonces
est funcIon elImIna el texto a buscar
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%"'#
8953)H5 !*(3/).3)H5
O>DX<FDOG5texto,
caracteresACambIar,
caracteresSustItutIvos7
PotentisIma funcIon que permIte transformar
caracteres. Los caracteresACambar son los
caracteres que se van a cambIar, los
caracteresSusttutvos son los caracteres que
reemplazan a los anterIores. 0e tal modo que el
prImer carcter a cambIar se cambIa por el
prImer carcter sustItutIvo, el segundo por el
segundo y asi sucesIvamente. Ejemplo:
<GFGEO O>DX<FDOG5prueba,ue,wx7
H>\S A]DFp
El resultado seria el texto rwxba, de tal forma
que la u se cambIa por la w y la e por la x.
SI la segunda cadena es ms corta, los caracteres
de la prImera que no encuentran sustItuto, se
elImInan. Ejemplo:
<GFGEO O>DX<FDOG5prueba,ue,w7
H>\S A]DFp
0a como resultado rwba
F@DA5texto, anchura|xIma,
[caracter0eFelleno]7
>@DA5texto, anchura|xIma,
[caracter0eFelleno]7
Fellena el texto a la IzquIerda (LPA0) o a la
derecha (FPA0) con el carcter IndIcado para
ocupar la anchura IndIcada.
SI el texto es ms grande que la anchura
IndIcada, el texto se recorta.
SI no se IndIca carcter de relleno se rellenar el
espacIo marcado con espacIos en blanco.
Ejemplo:
F@DA(Hola,10,)
da como resultado
------Hola
>GlG><G5texto7 nvIerte el texto (le da la vuelta)
1-53, ;="%$1"&, #& %353%-&5&,
8953)H5 !*(3/).3)H5
D<E445carcter7 0evuelve el codIgo ASC del carcter IndIcado
EB>5numero7 0evuelve el carcter correspondIente al codIgo
ASC IndIcado
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%"(#
8953)H5 !*(3/).3)H5
<\]XAG`5texto7 0evuelve el valor fontIco del texto. Es una
funcIon muy Interesante para buscar textos de
los que se no se sabe con exactItud su escrItura.
Por ejemplo:
<GFGEO z H>\S personas
QBG>G <\]XAG`5apellIdo1)=SOUNDEX(Smith7
En el ejemplo se busca a las personas cuyo
prImer apellIdo suena como Smth

(B4C4B* ;="%$1"&, #& -5323?1 %1" "=81,
PermIten defInIr valores a utIlIzar en el caso de que las expresIones tomen el valor nulo.
8953)H5 !*(3/).3)H5
E\DFG<EG5lIstaExpresIones7 0evuelve la prImera de las expresIones que no es
nula. Ejemplo
2
:
E>GDOG ODVFG test 5
col1 lD>EBD>-(1),
col2 lD>EBD>-(1),
colJ lD>EBD>-(1)7p

4X<G>O 4XO\ test lDF]G< 5X]FF, '8', 'C'7p
4X<G>O 4XO\ test lDF]G< 5'A', X]FF, 'C'7p
4X<G>O 4XO\ test lDF]G< 5X]FF, X]FF, 'C'7p
4X<G>O 4XO\ test lDF]G< 5'A', '8', 'C'7p

<GFGEO E\DFG<EG5col1, col2, colJ7 H>\S test;
El resultado es:

A
C
A
XlF5valor,sustItuto7 SI el valor es NULL, devuelve el valor susttuto;
de otro modo, devuelve valor


2
Ejemplo tomado de http://www.psoug.org/reference/strIng_func.html
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%")#
8953)H5 !*(3/).3)H5
XlF-5valor,sustItuto1,
sustItuto27
7arIante de la anterIor, devuelve el valor
susttuto1 sI valor no es nulo. SI valor es nulo
devuelve el susttuto2
X]FF4H5valor1,valor27
0evuelve nulo sI valor1 es Igual a valor2. 0e
otro modo devuelve valor1
(B4C4C* ;="%$1"&, #& &@<5&,$1"&, 5&+=835&,
&@<5&,$1"&, 5&+=835&,
Las expresIones regulares son una parte cada vez ms Importante de los lenguajes de
programacIon. Han exIstIdo desde que aparecIeron los lenguajes de programacIon de
alto nIvel y cada vez tIenen ms ImportancIa, hasta el punto de que lenguajes como
@$*9 no tendrian cabIda sIn las expresIones regulares.
En el caso de las bases de datos, tambIn tIenen una enorme ImportancIa, en
especIal para crear restrIccIones de valIdacIon (EBGEr) que Imponen una forma muy
concreta que debe de cumplIr el texto., Es lo que comunmente se conoce como patron
o mscara de entrada.
Por ejemplo sI nuestra base de datos almacena numeros de IdentIdad espaoles,
stos se forman por ocho numeros y una letra. SI no queremos permItIr otra posIbIlIdad
(por ejemplo aceptar que se pueda IntroducIr como dn al texto abcdejyrdddkdk),
entonces lo Ideal es IndIcarlo medIante un check con una expresIon regular, utIlIzando
la funcIon >GUG`@iF4rG por ejemplo.
Una expresIon regular est formada por un texto que contIene simbolos especIales
que son los que permIten IndIcar claramente la expresIon. TradIcIonalmente hay dos
normas de expresIones regulares:
@\<4`. Portable 0eratny System lnterjace, es el formato que procede del
sIstema ]0"L (ahi la equIs en sus sIglas) y que ha sIdo aceptado por el
organIsmo 4GGG 5 lnsttute oj Electrcal and Electroncs Enyneers7 de
estndares. Dracle es totalmente compatIble con el estndar PDSX
correspondIente y exactamente al el borrador estndar !""#$%&'!!$%$
@E>G (Perl Comatble Reyular Exressons). Proceden del lenguaje Perl
(precIsamente famoso por su uso de las expresIones regulares) y es un formato
en claro ascenso. Dracle admIte muchas de las expresIones correspondIente a
esta especIfIcacIon (las ms populares)
Adems Dracle ha IncluIdo la especIfIcacIon que compatIbIlIza las expresIones regulares
con las lenguas IncluIdas en UnIcode, lo que evIta problemas habItuales con las
expresIones regulares en otros lenguajes. A contInuacIon se IndIcan las posIbIlIdades que
tIene Dracle para IndIcar expresIones regulares.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%"*#
%353%-&5&, #& =,1 632$-=38 &" 83, &@<5&,$1"&, 5&+=835&,
!?%,)9) !"(0"2".&+)
c SI c es un carcter cualquIera (por ejemplo a, H, , etc.) IndIca,
donde aparezca dentro de la expresIon, que en esa posIcIon
debe aparecer dIcho carcter para que la expresIon sea vlIda.
Es decIr sI nuestra expresIon regular es sImplemente 'a' ser
vlIdo para esa expresIon cualquIer texto que contenga la letra
a.
cde SIendo c, d, y e caracteres, IndIca que esos caracteres deben
aparecer de esa manera en la expresIon.
x Comenzar por. ndIca el texto debe empezar por la expresIon x.
Por ejemplo:
'Ja' es una expresIon que da por vlIdo cualquIer texto que
empIece por ota y luego lleve una a.
x{ FInalIzar por. ndIca que el StrIng texto termInar con la
expresIon x.
vcdew DpcIon, son vlIdos uno de estos caracteres: c, d o e
ced Cumplen esa expresIon los caracteres que, en orden ASC,
vayan del carcter c al carcter d. Por ejemplo a-z repsenta
todas las letras mInusculas del alfabeto Ingls.
vxw No es vlIdo nInguno de los caracteres que cumplan la expresIon
x. Por ejemplo [djt] IndIca que no son vlIdos las caracteres
d, j o t.
= CualquIer carcter. El punto IndIca que en esa posIcIon puede Ir
cualquIer carcter
x La expresIon a la IzquIerda de este simbolo se puede repetIr una
o ms veces
xz la expresIon a la IzquIerda de este simbolo se puede repetIr
cero o ms veces
xk El carcter a la IzquIerda de este simbolo se puede repetIr cero
o una veces
xony SIgnIfIca que la expresIon x aparecer n veces, sIendo n un
numero entero posItIvo.
xon,y SIgnIfIca que la expresIon x aparecer n o ms veces
xom,ny SIgnIfIca que la expresIon x aparecer de m a n veces.
5x7 PermIte IndIcar un subpatron dentro del parntesIs. Ayuda a
formar expresIones regulares complejas.
xxy La barra IndIca que las expresIones x e y son opcIonales, se
puede cumplIr una u otra.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%"+#
%353%-&5&, &,<&%$38&,
Nos permIten IndIcar caracteres que de otra forma no se pueden escrIbIr (como el salto
de linea por ejemplo), ase les llama tambIn secuencIas de escape y proceden del
lenguaje E.
.&*3.#$* !"(0"2".&+)
# Tabulador
0 Salto de linea
* Salto de carro
; Tabulador vertIcal
La propIa barra
TambIn se utIlIza sI necesItamos poner como lIterales algunos de los simbolos
especIales de las expresIones regulares. Por ejemplo el simbolo punto (=) sIgnIfIca
cualquIer carcter, pero sI IndIcamos = entonces es el propIo carcter punto. Por
ejemplo sI nuestra expresIon verIfIca que un texto contIene una dIreccIon de correo
electronIco, pondriamos: .*.*\..* y eso daria vlIdo cualquIer texto que empIece con
lo que sea (.*), que luego tenga el simbolo , luego lo que sea (.*) luego,
oblIgatorIamente, un punto (\.) y luego lo que sea.
Lo mIsmo para otros simbolos: {, v, w,
,!:2181, <51%&#&"-&, #&8 :1#&81 XOGNW
0eben utIlIzarse sIempre dentro de los corchetes, asi por ejemplo sI nuestra expresIon
se refIere a una letra, se pondria [[:alha:] y sI es cualquIer carcter excepto letra, se
usa [[:alha:] y sI fuera una letra o el numero5, seria: [[:alha:]3]
.9&!$ !"(0"2".&+)
v&98:&w Letra
v&90/%w Letra o numero
v,9&0fw EspacIo o tabulador
v.0#*9w Carcter de control
v+"("#w Numero
v(*&8:w Carcter vIsIble (no valen nI espacIos nI caracteres de control
v9)C$*w Letra mInuscula
v8*"0#w Carcter vIsIble o el espacIo en blanco
v8/0.#w Caracteres de puntuacIon
v!8&.$w EspacIos en blanco y simbolos que aaden espacIos (como el
salto de lnea, tabulador,)
v/88$*w Letra mayuscula
vL+"("#w 0igIto hexadecImal

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%",#

,!:2181, <51%&#&"-&, #&8 :1#&81 X&58 #& &@<5&,$." 5&+=835 (/ 7K8$#1, &"
O53%8&*

.9&!$! !"(0"2".&+)
+ 0igIto, vale cualquIer digIto numrIco
A Todo menos digIto
! EspacIo en blanco
< CualquIer carcter salvo el espacIo en blanco
C Word, carcter vlIdo dentro de los que PHP consIdera para
IdentIfIcar varIables. Es decIr, letras, numeros o el guIon bajo.
Q Todo lo que no sea un carcter de tIpo Word.
&?&:<81, #& &@<5&,$1"&, 5&+=835&,
AX4 (ocho numeros y una letra).
'^|o-q|{8||A-Z|$'
Se delImIta entre y para que exactamente el contenIdo del texto que cumpla la
expresIon sea asi. 0e otro modo este texto cumplIria la expresIon:
IoIIoIu^_`_P`^P&IoIuIoIu 8$ *. 97%/3$: ;-)#/). ) <= >
Xn +$ !$*"$ con una o dos letras mayusculas, tres numeros, seguIdo de una letra un
guIon y dos numeros:
ab=4c;>1^!P3=Bcd>1A3=4c;>c=Bcd>1P3ea
E1+"() 8)!#&9, numeros del 01000 al 52999 (se hacen tres grupos: del 10000 al 19999;
del 01000 al 09000; y del 51000 al 52999; de otro modo dejariamos algun caso de ms)
'b?=^cf>=Bcd>1f3@ 2 ?B=^cd>=Bcd>1A3@2 ?g=^cP>=Bcd>1A3@ea
E)**$) $9$.#*10".) (al menos una letra con posIbIlIdad de punto (y sI lo hay habria letra
a sus dos lados y al menos un punto tras el simbolo de arroba, al fInal un punto y
nombre de domInIo de dos o tres letras; w sIgnIfIca 8&9&,*&)
ab=hi>j?h<=hi>j@(k=hi>j ?h<=hi>j@( ?h<=McZ>1P!A3@ea
;="%$1"&, #& O53%8& <353, =,1 %1" &@<5&,$1"&, 5&+=835&,
H/0."10 A$!.*"8."10
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%$-#
H/0."10 A$!.*"8."10
>GUG`@iF4rG5texto,
expresIonFegular [,flag]7
0evuelve verdadero sI el texto cumple la
expresIon regular.
El jlay que se puede IndIcar como tercer
parmetro es una de estas letras (entrecomI
lladas):
- ". No dIstIngue entre mayusculas y
mInusculas
- .. 0IstIngue entre mayusculas y
mInusculas
- 0. Hace que el punto represente a todos
los caractere4s excepto al salto de linea
(07.
- L. gnora los espacIos en blanco
>GUG`@iE\]XO5texto,
expresIonFegular v,posIcIon
v,flagww7
Cuenta las veces que aparece la expresIon
regular en el texto. Se puede especIfIcar la
oscn en el texto desde la que empezamos a
buscar y el parmetro jlay comentado
anterIormente.
>GUG`@i4X<O>5texto,
expresIonFegular vIposnIcIal vI
nAparIcIon v,modoPos vIflag
v,subexprwwwww77
Es una versIon de la funcIon 4X<O>, pero con ms
potencIa. 8usca la expresIon regular en el texto
y devuelve su posIcIon (o cero sI no la
encuentra).
Se puede empezar a buscar desde una posIcIon
(IndIcando un numero en el parmetro
oslncal) e Incluso IndIcar que buscamos no la
prImera aparIcIon (que es como funcIona por
defecto) sIno que buscamos el numero de
aparacIon que IndIquemos en el cuarto
parmetro.
El quInto parmetro vale cero (valor por defecto)
sI la posIcIon devuelta IndIca el prImer carcter
en el que aparece la expresIon; y vale uno sI la
posIcIon devuelta es la del sIguIente carcter
respecto al texto qaue cumple la expresIon
regular.
jlay es el parmetro comentado en la funcIon
>GUG`@iF4rG.
>GUG`@i>G@FDEG5texto,
expresIonFegular [, nuevoTexto
vIposnIcIal vI nAparIcIon
vIflagwwww77
8usca la expresIon regular en el texto y
reemplaza todo el texto que la cumple por el
nuevo texto IndIcado.
SI no hay 0/$;)O$L#), entonces se elImInan los
caracteres que cumplan la expresIon regular
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$%#
H/0."10 A$!.*"8."10
>GUG`@i<]V<O>5texto,
expresIonFegular vIposnIcIal vI
nAparIcIon vIflag [,subexprwwww77
8usca la expresIon regular en el texto y extrae
los caracteres que cumplen la expresIon. Es, por
lo tanto, una versIon ms potente de <]V<O>.
(B4C4D* ;="%$1"&, #& ;&%63 / :3"&?1 #& ;&%63, & $"-&57381,
Las fechas se utIlIzan muchisImo en todas las bases de datos. Dracle proporcIona dos
tIpos de datos para manejar fechas, los tIpos ADOG y O4SG<ODS@. En el prImer caso se
almacena una fecha concreta (que Incluso puede contener la hora), en el segundo caso
se almacena un Instante de tIempo ms concreto que puede IncluIr Incluso fraccIones de
segundo.
Hay que tener en cuenta que a los valores de tIpo fecha se les pueden sumar
numeros y se entenderia que esta suma es de dias. SI tIene decImales entonces se
suman dias, horas, mInutos y segundos. La dIferencIa entre dos fechas tambIn obtIene
un numero de dias.
$"-&57381,
Los Intervalos son datos relacIonados con las fechas en si, pero que no son fechas. Hay
dos tIpos de Intervalos el 4XOG>lDF ADa O\ <GE\XA que sIrve para representar dias,
horas, mInutos y segundos; y el 4XOG>lDF aGD> O\ S\XOB que representa aos y
meses.
Para los Intervalos de ao a mes los valores se pueden IndIcar de estas formas:
23 456 '7", 8 ,(-, %(,(, 32
*+'$-94% '1z-6' D$4-(q) '. /.+'8
23 456 '7", 32
*+'$-94% '1z' D$4-(q) '. /.+'8
23 9 %(,(, 32
*+'$-94% '6' /.+'8() '. /.+'8
La precIsIon en el caso de IndIcar tanto aos como meses, se IndIca solo en el ao. En
Intervalos de dias a segundos los Intervalos se pueden IndIcar como:
23 : ;<', 4= >"+', 45 %-&$/", 8 ? !"& 6@5 ,(A$&;", 32
*+'$-94% 'q 1o:1z:;,z' )4D '. #$&.+)()
23 : ;<', 4= >"+', 45 %-&$/", 32
*+'$-94% 'q 1o:1z' )4D '. /*+:'$
23 : ;<', 4= >"+', 32
*+'$-94% 'q 1o' )4D '. 8.:-
23 : ;<',32
*+'$-94% 'q' )4D
234= >"+',32
*+'$-94% '1o' 8.:-
235@ >"+',32
*+'$-94% 'z' 8.:-
2345 %-&$/",32
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%$"#
*+'$-94% '1z' /*+:'$
236= ,(A$&;", 32
*+'$-94% 'o' #$&.+)
23B >"+', 8 @= %-&$/", 32
*+'$-94% '8:o' 8.:- '. /*+:'$0
23? %-&$/", 9 ,(A$&;",32
*+'$-94% ';:o6 /*+:'$ '. #$&.+)0
23B >"+', ? %-&$/", 9 ,(A$&;",32
*+'$-94% '8:o;:o6' 8.:- '. #$&.+)0
Esos Intervalos se pueden sumar a valores de tIpo ADOG o O4SG<ODS@ para hacer
clculos. CracIas a ello se permIten sumar horas o mInutos por ejemplo a los datos de
tIpo O4SG<ODS@.
12-&"&5 83 ;&%63 / 6153 3%-=38
H/0."10 A$!.*"8."10
<a<ADOG DbtIene la fecha y hora actuales
<a<O4SG<ODS@ DbtIene la fecha y hora actuales en formato
O4SG<ODS@
%38%=835 ;&%63,
H/0."10 A$!.*"8."10
DAAiS\XOB<5fecha,n7 Aade a la fecha el numero de meses IndIcado
por n
S\XOB<iVGOQGGX5fecha1,
fecha27
DbtIene la dIferencIa en meses entre las dos
fechas (puede ser decImal)
XG`OiADa5fecha,dia7 ndIca cual es el dia que corresponde a aadIr a
la fecha el dia IndIcado. El dia puede ser el texto
'Lunes', 'Martes', 'Mrcoles',... (sI la confIgura
cIon est en espaol) o el numero de dia de la
semana (1=lunes, 2=martes,...)
FD<OiADa5fecha7 DbtIene el ultImo dia del mes al que pertenece
la fecha. 0evuelve un valor 0ATE
G`O>DEO5valor H>\S fecha7 Extrae un valor de una fecha concreta. El valor
puede ser +&N (dia), %)0#: (mes), N$&* (ao),
etc.
U>GDOG<O5fecha1, fecha2,..7 0evuelve la fecha ms moderna la lIsta
FGD<O5fecha1, fecha2,..7 0evuelve la fecha ms antIgua la lIsta
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$$#
H/0."10 A$!.*"8."10
>\]XA5fecha vI'formato'w Fedondea la fecha al valor de aplIcar el formato
a la fecha. El formato puede ser:
'YEAF' Hace que la fecha refleje el ao
completo
'|DNTH' Hace que la fecha refleje el mes
completo ms cercano a la fecha
'HH24' Fedondea la hora a las 00:00 ms
cercanas
'DAY Fedondea al dia ms cercano
O>]XE5fecha vformatow7 gual que el anterIor pero trunca la fecha en
lugar de redondearla.
(B4C4E* ;="%$1"&, #& %1"7&5,$."
Dracle es capaz de convertIr datos automtIcamente a fIn de que la expresIon fInal
tenga sentIdo. En ese sentIdo son fcIles las conversIones de texto a numero y
vIceversa. Ejemplo:
#$%$&' +'' ,-./ ):4% 23K# +(,$#/';" (, B 32
#$%$&' ]] '' ,-./ ):4% 23 K# +(,$#/';" (, @6 32
TambIn ocurre eso con la conversIon de textos a fechas. 0e hecho es forma habItual de
asIgnar fechas.
Pero en dIversas ocasIones querremos realIzar conversIones explicItas.
ROlSjUY
DbtIene un texto a partIr de un numero o una fecha. En especIal se utIlIza con fechas
(ya que de numero a texto se suele utIlIzar de forma ImplicIta.
;&%63,
En el caso de las fechas se IndIca el formato de conversIon, que es una cadena que
puede IncluIr estos simbolos (en una cadena de texto):
<?%,)9) <"(0"2".&+)
aa Ao en formato de dos cIfras
aaaa Ao en formato de cuatro cIfras
SS |es en formato de dos cIfras
S\X Las tres prImeras letras del mes
S\XOB Nombre completo del mes
Aa 0ia de la semana en tres letras
ADa 0ia completo de la semana
A 0ia de la semana (del 1 al 7)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%$'#
<?%,)9) <"(0"2".&+)
AA 0ia del mes en formato de dos cIfras (del 1 al J1)
AAA 0ia del ao
[ Semestre
QQ Semana del ao
DS ndIcador A|
@S ndIcador P|
BB6- Hora de 1 a 12
BB-M Hora de 0 a 2J
S4 |Inutos (0 a 59)
<< Segundos (0 a 59)
<<<< Segundos desde medIanoche
/ . ,:; PosIcIon de los separadores, donde se pongan
estos simbolos aparecern en el resultado
Ejemplos:
#$%$&' '.C&84-(SYSDATE, 'DDJMONTHJYYYY, DAY HH:M:SS')
,-./ ):4% 0
23 E'#( L 492HMFENF 25==:D OPQKE =BL6@L4@D *"+ (R(%*#"32
"L:&51,
Para convertIr numeros a textos se usa est funcIon cuando se desean caracteristIcas
especIales. En ese caso en el formato se pueden utIlIzar estos simbolos:
<?%,)9) <"(0"2".&+)
_ PosIcIon del numero
c PosIcIon del numero (muestra ceros)
{ Formato dolar
F Simbolo local de la moneda
< Hace que aparezca el simbolo del sIgno
A PosIcIon del simbolo decImal (en espaol, la
coma)
U PosIcIon del separador de grupo (en espaol el
punto)
ROlV_ZI`Y
ConvIerte textos en numeros. Se IndIca el formato de la conversIon (utIlIzando los
mIsmos simbolos que los comentados anterIormente).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$(#
ROlJUR`
ConvIerte textos en fechas. Como segundo parmetro se utIlIzan los codIgos de formato
de fechas comentados anterIormente.
SUGR
FuncIon muy verstIl que permIte convertIr el resultado a un tIpo concreto. SIntaxIs:
&4#'?*+,-*./0( 4# 1/,$?)1$.@
Ejemplo:
#$%$&' &4#'?z.q6; 4# +:/5$-(;,6)@ ,-./ ):4%;
Lo Interesante es que puede convertIr de un tIpo a otro. Por ejemplo ImagInemos que
tenemos una columna en una tabla mal planteada en la que el precIo de las cosas se ha
escrIto en Euros. Los datos son (se muestra solo la columna precIo:
+3*0,%
25.2
2.8
123.65
.78
.123
20
magInemos que queremos doblar el precIo, no podremos porque la columna es de tIpo
texto, por ello debemos tomar solo la parte numrIca y convertIrla a numero, despus
podremos mostrar los precIos multIplIcados por dos:
#$%$&' z &4#'(#:5#'-(precIo,1,*+#'-(precio,'')-z) 4# +:/5$-)
,-./ precIos;
La combInacIon de SU8STF e NSTF es para obtener solo los numeros. ncluso es posIble
que haya que utIlIzar FEPLACE para cambIar los puntos por comas (para utIlIzar el
separador decImal del IdIoma espaol).
(B4C4b* ;="%$." J`SOJ`
FuncIon que permIte realIzar condIcIones en una consulta Se evalua una expresIon y se
colocan a contInuacIon pares valor, resultado de forma que sI se la expresIon equIvale al
valor, se obtIene el resultado IndIcado. Se puede IndIcar un ultImo parmetro con el
resultado a efectuar en caso de no encontrar nInguno de los valores IndIcados.
SIntaxIs:
)$&.)$?*+,-*./0(, 9)%$-4, -*.&%1)3$4
=,9)%$-5, -*.&%1)3$5,...>
=!9)%$-@$-3*A*#1$>@
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%$)#
Ejemplo:
#$%$&'
)$&.)$(coLIzucIon,1, suIurIoo.8,
z,suIurIo o.q,
,suIurIo o.q6,
suIurIo)
,-./ empIeudos;
En el ejemplo dependIendo de la cotIzacIon se muestra rebajado el salarIo: un 85 sI la
cotIzacIon es uno, un 9J sI es dos y un 96 sI es tres. SI la cotIzacIon no es nI uno nI dos nI
tres, sencIllamente se muestra el salarIo sIn ms.
(B4C4c* ;="%$1"&, WZ]
Dracle tIene la posIbIlIdad de conseguIr resultados compatIbles con el lenguaje X|L
(que despus podramos utilizar para formatear, analizar, consultar, utilizando
herramIentas propIas de X|L).
Aprender X|L va ms all de los objetIvos de estos apuntes, sI se desea aprender
ms al respecto desde www.jorgesanchez.net hay varIos manuales de X|L (y hay
muchos ms y mejores escrItos por otros autores tanto lIbremente en nternet como en
lIbros).
WZ]`8&:&"-
Es una de las funcIones ms utIlIzadas para mostrar InformacIon en forma X|L. Su
sIntaxIs es:
7/%$UHYHKV?nombreEIemenLo[,clusulaDeAtributos][,valor1[,]]@
Es una funcIon muy poderosa. En su forma ms fcIl sImplemente se IndIca el elemento:
#$%$&' 7/%$UHYHKV?"pruebu"@ ,-./ ):4%0
Esa consulta (sobre la tabla estndar de pruebas 0UAL) muestra:
<pruebu><Jpruebu>
Es decIr un elemento X|L sIn contenIdo. SIn embargo esta otra:
#$%$&' 7/%$UHYHKV?"nombre",nombre@ MN I^ ,-./ LHGNJKMN0
|uestra un resultado como, por ejemplo:
.6
nombre7anesa/nombre
nombreLuIs/nombre
nombreLuIsa/nombre
nombre|ercedes/nombre
nombreLaura/nombre
nombre|atias/nombre
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$*#
nombreEsperanza/nombre
Para cada persona aparece una fIla y en ella el nombre dentro de un elemento llamado
nombre.
Dtro ejemplo ms complejo (con subelementos):
#$%$&' 7/%$UHYHKV(
"personu",
7/%$UHYHKV("nombre",nombre),
7/%$UHYHKV("upeIIIdo1",upeIIIdo1),
7/%$UHYHKV("upeIIIdoz",upeIIIdoz)
) 4# duLos
,-./ uIumnos;
Fesultado:
+&#)!
personanombre7anesa/nombreapellIdo1|egIno/apellIdo1apellIdo2Snchez/ap
ellIdo2/persona
personanombreLuIs/nombreapellIdo1Abadia/apellIdo1apellIdo2CastrourdIales/
apellIdo2/persona
personanombreLuIsa/nombreapellIdo1Calvo/apellIdo1apellIdo2Calvo/apellIdo2
/persona
personanombre|ercedes/nombreapellIdo1Aragon/apellIdo1apellIdo2Cantor/ap
ellIdo2/persona
personanombreLaura/nombreapellIdo1Albero/apellIdo1apellIdo2SInIestra/apel
lIdo2/persona
personanombre|atias/nombreapellIdo1HIerro/apellIdo1apellIdo2Amo/apellIdo
2/persona
personanombreEsperanza/nombreapellIdo1Castro/apellIdo1apellIdo2Conzlez/
apellIdo2/persona
Podemos tambIn usar clusulas de atrIbutos, eso es posIble con `SFD##*",/#$!, otra
funcIon que es capaz de usar atrIbutos. Su sIntaxIs es:
7/%4VVGFlWVHN?vuIor1 4# uIIus1 |,vuIorz 4# alias2 [,]]@
El valor es el contenIdo del atrIbuto y los alIas el nombre del atrIbuto. Solo puede haber
una clusula X|LAtrIbutes dentro de una X|LElement. Ejemplo:
#$%$&' 7/%$UHYHKV(
"personu",
7/%4VVGFlWVHN(sexo 4# "sexo",dnI 4# "Id"),
7/%$UHYHKV("nombre",nombre),
7/%$UHYHKV("upeIIIdo1",upeIIIdo1),
7/%$UHYHKV("upeIIIdoz",upeIIIdoz)
) 4# duLos ,-./ personus;
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%$+#
Fesultado:
+&#)!
persona sexo=m Id=120J04J0
nombre7anesa/nombreapellIdo1|egIno/apellIdo1apellIdo2Snchez/apellIdo2/persona
persona sexo=h Id=12049558
nombreLuIs/nombreapellIdo1Abadia/apellIdo1apellIdo2CastrourdIales/apellIdo2/person
a
persona sexo=m Id=12080980
nombreLuIsa/nombreapellIdo1Calvo/apellIdo1apellIdo2Calvo/apellIdo2/persona
persona sexo=m Id=12162777
nombre|ercedes/nombreapellIdo1Aragon/apellIdo1apellIdo2Cantor/apellIdo2/persona
persona sexo=m Id=12178979
nombreLaura/nombreapellIdo1Albero/apellIdo1apellIdo2SInIestra/apellIdo2/persona
persona sexo=h Id=1221J987
nombre|atias/nombreapellIdo1HIerro/apellIdo1apellIdo2Amo/apellIdo2/persona
persona sexo=m Id=122J9J47
nombreEsperanza/nombreapellIdo1Castro/apellIdo1apellIdo2Conzlez/apellIdo2/person
a
WZ]g15&,-
Se trata de una funcIon sImIlar a `SFG9$%$0#, solo que de uso ms comodo. |uestra
elementos X|L a partIr de datos de las tablas. Su sIntaxIs es:
7/%,JGHNV?nombre1 |4# uIIus1| |,nombrez |4# alias2]][,])
Se maneja Igual que `SFD##*",/#$ pero ahora se refIere a elementos. Ejemplo:
#$%$&' 7/%,JGHNV(nombre,upeIIIdo1 4# up1) ,-./ uIumnos;

+&#)!
ND|8FE7anesa/ND|8FEAP1|egIno/AP1
ND|8FELuIs/ND|8FEAP1Abadia/AP1
ND|8FELuIsa/ND|8FEAP1Calvo/AP1
ND|8FE|ercedes/ND|8FEAP1Aragon/AP1
ND|8FELaura/ND|8FEAP1Albero/AP1
ND|8FE|atias/ND|8FEAP1HIerro/AP1
ND|8FEEsperanza/ND|8FEAP1Castro/AP1
El alIas se ha usado para la segunda etIqueta que es AP1 en lugar de APELLl001.
WZ]U++
Es una funcIon muy poderosa que permIte realIzar agrupacIones al estIlo de la clusula
U>\]@ Va. Es la funcIon que permIte obtener resultados muy espectaculares, como sI
realmente al fInal tuvIramos un archIvo X|L con los datos. SIntaxIs:
7/%4mm?resuILudoDeuncIonXM |cIuusuIu de orden|@
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%$,#
La clusula de orden permIte el uso de la clusula DF0EF 8Y dentro de la funcIon. Con
`SFD(( conseguImos que todos los resultados se puedan asocIar a un solo elemento.
Ejemplo:
#$%$&' 7/%$UHYHKV(
"IIsLudo",
7/%4mm(7/%$UHYHKV(
"personu",
7/%,JGHNV(
nombre us "nombre",
upeIIIdo1 us "upeIIIdo1",u
peIIIdoz us "upeIIIdoz"
)
) .-)$- 5D dnI
)
)
,-./ personus
\8$-$ edud>6o;
Se utIlIzan comIllas dobles y alIas en `SFH)*$!# para asegurar que los elementos X|L
salen en mInusculas (que es lo ms recomendable para X|L). Aunque el resultado
saldria seguIdo y en una sola fIla, se muestra a contInuacIon en una forma ms fcIl de
leer en X|L.
<IIsLudo>
<personu>
<nombre>uIsu<Jnombre>
<upeIIIdo1>CuIvo<JupeIIIdo1>
<upeIIIdoz>CuIvo<JupeIIIdoz>
<Jpersonu>
<personu>
<nombre>AnLonIo<Jnombre>
<upeIIIdo1>SuncIez<JupeIIIdo1>
<upeIIIdoz>ernundez<JupeIIIdoz>
<Jpersonu>
<personu>
<nombre>PubIo<Jnombre>
<upeIIIdo1>VurIIIu<JupeIIIdo1>
<upeIIIdoz>SuncIez<JupeIIIdoz>
<Jpersonu>
<personu>
<nombre>Jorge uIs<Jnombre>
<upeIIIdo1>Andrez<JupeIIIdo1>
<upeIIIdoz>SuncIez<JupeIIIdoz>
<Jpersonu>
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%'-#
<personu>
<nombre>JoIunn<Jnombre>
<upeIIIdo1>MuzukeIIe<JupeIIIdo1>
<upeIIIdoz>Nburu<JupeIIIdoz>
<Jpersonu>
<JIIsLudo>
`SFD(( ha conseguIdo meter todos los elementos dentro del grupo creado, lIstado. Un
ejemplo ms complejo seria (combInando todas las funcIones anterIores y usando varIas
tablas, cuya tcnIca se explIca en el apartado (4.6)):
#$%$&' 7/%$UHYHKV(
"IIsLudo",
7/%4mm(7/%$UHYHKV(
"empresu",
7/%,JGHNV(e.nombre us "nombre"),
(
#$%$&' 7/%$UHYHKV(
"Lrubujudor",
7/%4mm(
7/%,JGHNV(
nombre us "nombre",
upeIIIdo1 us "upeIIIdo1",
upeIIIdoz us "upeIIIdoz")
)
) ,-./ uIumnos u
\8$-$ u.cII=e.cII

)
) .-)$- 5D e.nombre
)
)
,-./ empresus e;
El resultado (mostrado de una forma ms legIble, porque en realIdad se mostraria todo
seguIdo):
<IIsLudo>
<empresu>
<nombre>CIuss<Jnombre>
<Lrubujudor>
<nombre>MuLius<Jnombre>
<upeIIIdo1>HIerro<JupeIIIdo1>
<upeIIIdoz>Amo<JupeIIIdoz>
<nombre>Esperunzu<Jnombre>
<upeIIIdo1>CusLro<JupeIIIdo1>
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%'%#
<upeIIIdoz>GonzuIez<JupeIIIdoz>
<JLrubujudor>
<Jempresu>
<empresu>
<nombre>RT S. A.<Jnombre>
<Lrubujudor>
<nombre>uIs<Jnombre>
<upeIIIdo1>Abudiu<JupeIIIdo1>
<upeIIIdoz>CusLrourdIuIes<JupeIIIdoz>
<nombre>Mercedes<Jnombre>
<upeIIIdo1>Arugn<JupeIIIdo1>
<upeIIIdoz>CunLor<JupeIIIdoz>
<JLrubujudor>
<Jempresu>
<empresu>
<nombre>VIdrIos CurmeIo<Jnombre>
<Lrubujudor>
<nombre>uIsu<Jnombre>
<upeIIIdo1>CuIvo<JupeIIIdo1>
<upeIIIdoz>CuIvo<JupeIIIdoz>
<JLrubujudor>
<Jempresu>
<JIIsLudo>
(B4D* 12-&"&5 #3-1, #& :L8-$<8&, -3283,
Es ms que habItual necesItar en una consulta datos que se encuentran dIstrIbuIdos en
varIas tablas. Las bases de datos relacIonales se basan en que los datos se dIstrIbuyen
en tablas que se pueden relacIonar medIante un campo. Ese campo es el que permIte
Integrar los datos de las tablas.
Por ejemplo sI dIsponemos de una tabla de empleados cuya clave es el dn y otra
tabla de tareas que se refIere a tareas realIzadas por los empleados, es seguro (sI el
dIseo est bIen hecho) que en la tabla de tareas aparecer el dnI del empleado para
saber qu empleado realIzo la tarea.
(B4D4)* <51#=%-1 %5=M3#1 1 %35-&,$3"1 #& -3283,
En el ejemplo anterIor sI quIere obtener una lIsta de los datos de las tareas y los
empleados, se podria hacer de esta forma:
#$%$&' cod_Lureu, descrIpcIon_Lureu, dnI_empIeudo,
nombre_empIeudo
,-./ VMGHMN!HYLUHMEJN;
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%'"#
La sIntaxIs es correcta ya que, efectIvamente, en el apartado H>\S se pueden IndIcar
varIas tareas separadas por comas. Pero eso produce un producto cruzado, aparecern
todos los regIstros de las tareas relacIonados con todos los regIstros de empleados,.
El producto cartesIano a veces es utIl para realIzar consultas complejas, pero en el
caso normal no lo es. necesItamos dIscrImInar ese producto para que solo aparezcan los
regIstros de las tareas relacIonadas con sus empleados correspondIentes. A eso se le
llama asocIar (on) tablas
(B4D49* 3,1%$3"#1 -3283,
La forma de realIzar correctamente la consulta anterIor (asocIado las tareas con los
empleados que la realIzaron seria:
SEECT cod_Lureu, descrIpcIon_Lureu, dnI_empIeudo, nombre_empIeudo
ROM Lureus,empIeudos
\8$-$ VMGHMN<EKFCHYLUHMEJ [ HYLUHMEJN<EKF0
Notese que se utIlIza la notacIon tabla.columna para evItar la ambIgedad, ya que el
mIsmo nombre de campo se puede repetIr en ambas tablas. Para evItar repetIr
contInuamente el nombre de la tabla, se puede utIlIzar un alIas de tabla:
SEECT u.cod_Lureu, u.descrIpcIon_Lureu, b.dnI_empIeudo, b.nombre_empIeudo
ROM VMGHMN M!HYLUHMEJN l
WHERE u.dnI_empIeudo = b.dnI;
Al apartado WHEFE se le pueden aadIr condIcIones encadenndolas con el operador
AN0. Ejemplo:
#$%$&' u.cod_Lureu, u.descrIpcIon_Lureu
,-./ Lureus u,empIeudos b
\8$-$ u.dnI_empIeudo = b.dnI 4+)
b.nombre_empIeudo='JuvIer';
FInalmente IndIcar que se pueden enlazar ms de dos tablas a travs de sus campos
relacIonados. Ejemplo:
#$%$&' u.cod_Lureu, u.descrIpcIon_Lureu, b.nombre_empIeudo,
c.nombre_uLensIIIo
,-./ Lureus u,empIeudos b, uLensIIIos_uLIIIzudos c
\8$-$ u.dnI_empIeudo = b.dnI 4+) u.cod_Lureu=c.cod_Lureu;
(B4D4>* 5&83%$1"&, ,$" $+=38#3#
A las relacIones descrItas anterIormente se las llama relacIones en Igualdad (equons),
ya que las tablas se relacIonan a travs de campos que contIenen valores Iguales en dos
tablas.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%'$#
SIn embargo no sIempre las tablas tIenen ese tIpo de relacIon, por ejemplo:
E|PLEA0DS
G%89$&+) </$9+)
D0#)0") 6^ccc
S&*#& -6ccc
<)0"& 6Pccc
CATECDFAS
.&#$()*?& </$9+) %?0"%) </$9+) %3L"%)
A Rccc 66___
E 6-ccc 6W___
V 6^ccc -c___
D -c___ ^cccc
En el ejemplo anterIor podriamos averIguar la categoria a la que pertenece cada
empleado, pero estas tablas poseen una relacIon que ya no es de Igualdad.
La forma !$*?&:
SEECT u.empIeudo, u.sueIdo, b.cuLegorIu
,-./ empIeudos u, cuLegorIus b
\8$-$ u.sueIdo 5$'\$$+ b.sueIdo_mInImo 4+)
b.sueIdo_muxImo;
(B4D4B* ,$"-3@$, G\] )ccc
En la versIon SQL de 1999 se Ideo una nueva sIntaxIs para consultar varIas tablas. La
razon fue separar las condIcIones de asocIacIon respecto de las condIcIones de seleccIon
de regIstros. Dracle Incorpora totalmente esta normatIva.
La sIntaxIs completa es:
#$%$&' 1)2%)4B#$%&'()4: 1)2%4B#$%&'()5,...
1)2%)5B#$%&'()4, 1)2%)5B#$%&'()5,... ,-./ 1)2%)4
|&-.## n.*+ 1)2%)5|]
|+4':-4% n.*+ 1)2%)5>2
|n.*+ LubIuz :#*+6?#$%&'()@|]
=n.*+ LubIuz .+ ?1)2%)4B#$%&')[1)2%)5B#$%&'()@>2
|%$,'2-*68'2,:%% .:'$- n.*+ 1)2%)5 .+
?1)2%)4B#$%&')[1)2%)5B#$%&'()@|
Se descrIben sus posIbIlIdades en los sIguIentes apartados.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%''#
SYOGG QONV
UtIlIzando la opcIon E>\<< b\4X se realIza un producto cruzado entre las tablas
IndIcadas. Eso sIgnIfIca que cada tupla de la prImera tabla se combIna con cada tupla de
la segunda tabla. Es decIr sI la prImera tabla tIene 10 fIlas y la segunda otras 10, como
resultado se obtIenen 100 fIlas, resultado de combInar todas entre si. Ejemplo:
#$%$&' ,-./ pIezus &-.## n.*+ exIsLencIus;
No es una operacIon muy utIlIzada, aunque posIbIlIta resolver consultas
extremadamente complIcadas.
VUR_YU] QONV
Establece una relacIon de Igualdad entre las tablas a travs de los campos que tengan el
mIsmo nombre en ambas tablas:
#$%$&' ,-./ pIezus
+4':-4% n.*+ exIsLencIus;
En ese ejemplo se obtIenen los regIstros de pIezas relacIonados en exIstencIas a travs
de los campos que tengan el mIsmo nombre en ambas tablas.
Hay que asegurarse de que solo son las claves prIncIpales y secundarIas de las tablas
relacIonadas, las columnas en las que el nombre coIncIde, de otro modo fallaria la
asocIacIon y la consulta no funcIonaria.
QONV _GNVH
PermIte establecer relacIones IndIcando qu columna (o columnas) comun a las dos
tablas hay que utIlIzar:
#$%$&' ,-./ pIezus
n.*+ exIsLencIus :#*+6(LIpo,modeIo);
Las columnas deben de tener exactamente el mIsmo nombre en ambas tablas
QONV OV
PermIte establecer relacIones cuya condIcIon se establece manualmente, lo que
permIte realIzar asocIacIones ms complejas o bIen asocIacIones cuyos campos en las
tablas no tIenen el mIsmo nombre:
#$%$&' ,-./ pIezus
n.*+ exIsLencIus .+?pIezus.LIpo=exIsLencIus.LIpo 4+)
pIezus.modeIo=exIsLencIus.modeIo@0
5&83%$1"&, &@-&5"3,
UtIlIzando las formas anterIores de relacIonar tablas (IncluIdas las explIcadas con la
sIntaxIs SQL 92), solo aparecen en el resultado de la consulta fIlas presentes en las
tablas relacIonadas. Es decIr en esta consulta:
#$%$&' ,-./ pIezus
n.*+ exIsLencIus
.+?pIezus.LIpo=exIsLencIus.LIpo 4+)
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%'(#
pIezus.modeIo=exIsLencIus.modeIo@0
Solo aparecen pIezas presentes en la tabla de exIstencIas. SI hay pIezas que no estn en
exIstencIas, stas no aparecen (y sI hay exIstencIas que no estn en la tabla de pIezas,
tampoco salen).
Por ello se permIte utIlIzar relacIones laterales o externas (outer on). Su sIntaxIs
es:
...
{%$,' ] -*68' ] ,:%%] .:'$- n.*+ LubIu
{.+?condIcIn) ] USNG (expresIon)]
...
Asi esta consulta:
#$%$&' ,-./ pIezus
%$,' .:'$- n.*+ exIsLencIus
.+?pIezus.LIpo=exIsLencIus.LIpo 4+)
pIezus.modeIo=exIsLencIus.modeIo@0
DbtIene los datos de las pIezas estn o no relacIonadas con datos de la tabla de
exIstencIas (la tabla FGHO seria pIezas por que es la que est a la IzquIerda del b\4X).
En la consulta anterIor, sI el FGHO lo cambIamos por un >4UBO, aparecern las
exIstencIas no presentes en la tabla pIezas (adems de las relacIonadas en ambas
tablas).
La condIcIon H]FF \]OG> b\4X producIria un resultado en el que aparecen los
regIstros no relacIonados de ambas tablas (pIezas sIn exIstencIas relacIonadas y
vIceversa).
%1",=8-3, #& "1 %1$"%$#&"-&,
Un caso tipIco de uso de las relacIones externas es el uso de consultas de no
coIncIdentes. Estas consultas sustItuyen de forma ms efIcIente al operador X\O 4X (se
explIca ms adelante) ya que permIten comprobar fIlas de una tabla que no estn
presentes en una segunda tabla que se relacIona con la prImera a travs de alguna clave
secundarIa.
Por ejemplo supongamos que tenemos una base de datos que posee una tabla de
empresas y otra de trabajadores de las empresas. Ambas tablas supongamos que se
relacIonan a travs del CF de la empresa. SI exIsten empresas de las que no tenemos
nIngun trabajador podremos saberlo medIante esta consulta:
#$%$&' e.nombre ,-./ empresus e
%$,' .:'$- n.*+ Lrubujudores L .+ (L.cII=e.cII)
\8$-$ L.dnI *# +:%%0
En la consulta anterIor gracIas a utIlIzar el operador FGHO \]OG>, obtenemos la lIsta
completa de empresas (tengan o no trabajadores). SI elImInamos aquellas fIlas con el
dn de los trabajadores nulo, entonces salen las empresas sIn trabajadores relacIonados
(solo las empresas sIn trabajadores mostrarn valores nulos en los datos de los
trabajadores).
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%')#
(B4E* 3+5=<3%$1"&,
Es muy comun utIlIzar consultas en las que se desee agrupar los datos a fIn de realIzar
clculos en vertIcal, es decIr calculados a partIr de datos de dIstIntos regIstros.
Para ello se utIlIza la clusula CFDUP 8Y que permIte IndIcar en base a qu regIstros
se realIza la agrupacIon. Con CFDUP 8Y la InstruccIon SELECT queda de esta forma:
#$%$&' IIsLuDeExpresIones
,-./ IIsLuDeTubIus
=n.*+ LubIusReIucIonudusYCondIcIonesDeReIucIn>
=\8$-$ condIcIones>
|6-.:O 5D grupos|
=849*+6 condIcIonesDeGrupo>
|.-)$- 5D coIumnus|;
En el apartado CFDUP 8Y, se IndIcan las columnas por las que se agrupa. La funcIon de
este apartado es crear un unIco regIstro por cada valor dIstInto en las columnas del
grupo. SI por ejemplo agrupamos en base a las columnas to y modelo en una tabla de
exstencas, se crear un unIco regIstro por cada tIpo y modelo dIstIntos:
#$%$&' LIpo,modeIo
,-./ exIsLencIus
6-.:O 5D LIpo,modeIo;
SI la tabla de exIstencIas sIn agrupar es:
TI MODELO N_ALMACEN CANTIDAD
AR 6 1 2500
AR 6 2 5600
AR 6 3 2430
AR 9 1 250
AR 9 2 4000
AR 9 3 678
AR 15 1 5667
AR 20 3 43
BI 10 2 340
BI 10 3 23
BI 38 1 1100
BI 38 2 540
BI 38 3
La consulta anterIor crear esta salIda:
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%'*#
TI MODELO
AR 6
AR 9
AR 15
AR 20
BI 10
BI 38

Es decIr es un resumen de los datos anterIores. Los datos n_almacen y cantdad no
estn dIsponIbles dIrectamente ya que son dIstIntos en los regIstros del mIsmo grupo.
Solo se pueden utIlIzar desde funcIones (como se ver ahora). Es decIr esta consulta es
erronea:
#$%$&' LIpo,modeIo, cunLIdud
,-./ exIsLencIus
6-.:O 5D LIpo,modeIo;

#$%$&' VFLJ!YJEHUJ! IMKVFEME
(
$--.- HK UoKHM ^p
.-4cBBd_dp KJ HN WKM HXLGHNFqK 6-.:O 5D
(B4E4)* ;="%$1"&, #& %K8%=81 %1" +5=<1,
Lo Interesante de la creacIon de grupos es las posIbIlIdades de clculo que ofrece. Para
ello se utIlIzan funcIones que permIten trabajar con los regIstros de un grupo son:
8953)H5 $)F5)G)3%6'
E\]XO5z7 E/$0#& 9)! $9$%$0#)! +$ /0 (*/8)= <$ /#"9"d& $9
&!#$*"!.) 8&*& 0) #$0$* T/$ "0+".&* /0 0)%,*$
+$ .)9/%0& .)0.*$#)I $9 *$!/9#&+) $! $9 %"!%)
8&*& ./&9T/"$* .)9/%0&
<]S5expreson7 </%& 9)! ;&9)*$! +$ 9& $L8*$!"10
DlU5expreson7 E&9./9& 9& %$+"& &*"#%g#".& !),*$ 9& $L8*$!"10
"0+".&+&
S4X5expreson7 S?0"%) ;&9)* T/$ #)%& 9& $L8*$!"10 "0+".&+&
SD`5expreson7 S3L"%) ;&9)* T/$ #)%& 9& $L8*$!"10 "0+".&+&
<OAAGl5expreson7 E&9./9& 9& +$!;"&."10 $!#30+&*
lD>4DXEG5expreson7 E&9./9& 9& ;&*"&0d&

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%'+#
Todas las funcIones de la tabla anterIor se calculan para cada elemento del grupo, asi la
expresIon:
#$%$&' LIpo,modeIo, cunLIdud, #:/?CunLIdud@
,-./ exIsLencIus
6-.:O 5D LIpo,modeIo;
DbtIene este resultado:
TI MODELO SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 10 363
BI 38 1740
Se suman las cantIdades para cada grupo
(B4E49* %1"#$%$1"&, jUhNVH
A veces se desea restrIngIr el resultado de una expresIon agrupada, por ejemplo con:
#$%$&' LIpo,modeIo, cunLIdud, #:/?CunLIdud@
,-./ exIsLencIus
\8$-$ #:/?CunLIdud@>oo
6-.:O 5D LIpo,modeIo;
Pero Dracle devolveria este error:
\8$-$ #:/?&MKVFEME@rgBB
(
$--.- HK UoKHM Ap
.-4cBBdAfp SWKIFqK EH mGWLJ KJ LHGYFVFEM MsWo
La razon es que Dracle calcula prImero el WHEFE y luego los grupos; por lo que esa
condIcIon no la puede realIzar al no estar establecIdos los grupos.
Por ello se utIlIza la clusula BDl4XU, que se ejecuta una vez realIzados los grupos.
Se usaria de esta forma:
#$%$&' LIpo,modeIo, cunLIdud, #:/(CunLIdud)
,-./ exIsLencIus
6-.:O 5D LIpo,modeIo
849*+6 #:/(CunLIdud)>oo;
Eso no ImplIca que no se pueda usar WHEFE. sta expresIon si es vlIda:
#$%$&' LIpo,modeIo, cunLIdud, #:/(CunLIdud)
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%',#
,-./ exIsLencIus
\8$-$ LIpo!='AR'
6-.:O 5D LIpo,modeIo
849*+6 #:/(CunLIdud)>oo;
En defInItIva, el orden de ejecucIon de la consulta marca lo que se puede utIlIzar con
WHEFE y lo que se puede utIlIzar con HA7NC:
Para evItar problemas estos podrian ser los pasos en la ejecucIon de una InstruccIon
de agrupacIon por parte del gestor de bases de datos:
!'# SeleccIonar las fIlas deseadas utIlIzando QBG>G. Esta clusula elImInar
columnas en base a la condIcIon IndIcada
!(# Se establecen los grupos IndIcados en la clusula U>\]@ Va
!)# Se calculan los valores de las funcIones de totales (E\]XO, <]S, DlU,...)
!*# Se fIltran los regIstros que cumplen la clusula BDl4XU
!+# El resultado se ordena en base al apartado \>AG> Va.
(B4b* ,=2%1",=8-3,
(B4b4)* =,1 #& ,=2%1",=8-3, ,$:<8&,
Se trata de una tcnIca que permIte utIlIzar el resultado de una tabla SELECT en otra
consulta SELECT. PermIte solucIonar consultas que requIeren para funcIonar el resultado
prevIo de otra consulta.
La sIntaxIs es:
#$%$&' %/.1)C+,-*./$(*.
,-./ 1)2%)
\8$-$ *+,-*./0( D@CEF?DE
?#$%$&' %/.1)C+,-*./$(*.
,-./ 1)2%)@0
Se puede colocar el SELECT dentro de las clusulas QBG>G, BDl4XU o H>\S. El
operador puede ser ,,=,=,!=, = o N.
Ejemplo:
SEECT nombre_empIeudo, pugu
ROM empIeudos
WHERE LMmM <
(SEECT LMmM ROM empIeudos
WHERE nombre_empIeudo='MurLInu')
;
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%(-#
LogIcamente el resultado de la subconsulta debe IncluIr el campo que estamos
analIzando. Se pueden realIzar esas subconsultas las veces que haga falta:
SEECT nombre_empIeudo, pugu
ROM empIeudos
WHERE LMmM <
(SEECT LMmM ROM empIeudos
WHERE nombre_empIeudo='MurLInu')
AND LMmM >
(SEECT LMmM ROM empIeudos WHERE nombre_empIeudo='uIs');
En realIdad lo prImero que hace la base de datos es calcular el resultado de la
subconsulta:
SEECT nombre_empIeudo, pugu
ROM empIeudos
WHERE pugu <
(SEECT pugu ROM empIeudos
WHERE nombre_empIeudo='MurLInu')

AND pugu >
(SEECT pugu ROM empIeudos
WHERE nombre_empIeudo='uIs');
La ultIma consulta obtIene los empleados cuyas pagas estn entre lo que gana Luis
(1870 euros) y lo que gana |artIna (2500) .
Las subconsultas sIempre se deben encerrar entre parntesIs y se deberia colocar a
la derecha del operador relacIonal. Una subconsulta que utIlIce los valores ,,=,...
tIene que devolver un unIco valor, +$ )#*) %)+) )./**$ /0 $**)*. Adems tIenen que
tener el mIsmo tIpo de columna para relacIonar la subconsulta con la consulta que la
utIlIza (no puede ocurrIr que la subconsulta tenga dos columnas y ese resultado se
compare usando una sola columna en la consulta general).
(B4b49* =,1 #& ,=2%1",=8-3, #& :L8-$<8&, ;$83,
En el apartado anterIor se comentaba que las subconsultas solo pueden devolver una
fIla. Pero a veces se necesItan consultas del tIpo: mostrar el sueldo y nombre de los
emleados cuyo sueldo suera al de cualquer emleado del deartamento de
ventas.
La subconsulta necesarIa para ese resultado mostraria #)+)! los sueldos del
departamento de ventas. Pero no podremos utIlIzar un operador de comparacIon
dIrectamente ya que esa subconsulta devuelve ms de una fIla. La solucIon a esto es
utIlIzar InstruccIones especIales entre el operador y la consulta, que permIten el uso de
subconsultas de varIas fIlas.
2500
1870
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%(%#
Esas InstruccIones son:
A5(&/933)H5 $)F5)G)3%6'
DXa Compara con cualquIer regIstro de la
subconsulta. La InstruccIon es vlIda sI hay un
regIstro en la subconsulta que permIte que la
comparacIon sea cIerta
DFF Compara con todos los regIstros de la consulta.
La InstruccIon resulta cIerta sI es cIerta toda
comparacIon con los regIstros de la subconsulta
4X No usa comparador, ya que sIrve para comprobar
sI un valor se encuentra en el resultado de la
subconsulta
X\O 4X Comprueba sI un valor no se encuentra en una
subconsulta
Ejemplo:
#$%$&' nombre, sueIdo
,-./ empIeudos
\8$-$ sueIdo r[ 4%% ?#$%$&' sueIdo ,-./ empIeudos@0
La consulta anterIor obtIene el empleado que ms cobra. Dtro ejemplo:
#$%$&' nombre ,-./ empIeudos
\8$-$ dnI *+ ?#$%$&' dnI ,-./ dIrecLIvos@0
En ese caso se obtIenen los nombres de los empleados cuyos dn estn en la tabla de
dIrectIvos.
SI se necesIta comprobar dos columnas en una consulta N, se hace:
#$%$&' nombre ,-./ empIeudos
\8$-$ ?cod1,codz@ *+ ?#$%$&' cod1,codz ,-./ dIrecLIvos@0
(B4b4>* %1",=8-3, `WNGRG
Este operador devuelve verdadero sI la consulta que le sIgue devuelve algun valor. SI
no, devuelve falso. Se utIlIza sobre todo en consultas correlacIonadas. Ejemplo:
#$%$&' LIpo,modeIo, precIo_venLu
,-./ pIezus p
\8$-$ $7*#'# ?
#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ LIpo=p.LIpo 4+) modeIo=p.modeIo@0
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%("#
Esta consulta devuelve las pIezas que se encuentran en la tabla de exIstencIas (es Igual
al ejemplo comentado en el apartado subconsultas sobre multIples valores). La consulta
contrarIa es :
#$%$&' LIpo,modeIo, precIo_venLu
,-./ pIezus p
\8$-$ +.' $7*#'# ?
#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ LIpo=p.LIpo 4+) modeIo=p.modeIo@0
Normalmente las consultas EXSTS se pueden realIzar de alguna otra forma con los
operadores ya comentados.
(B4c* %1:2$"3%$1"&, &,<&%$38&,
(B4c4)* ="$1"&,
La palabra ]X4\X permIte aadIr el resultado de un SELECT a otro SELECT. Para ello
ambas InstruccIones tIenen que utIlIzar el mIsmo numero y tIpo de columnas. Ejemplo:
#$%$&' nombre ,-./ provIncIus
:+*.+
#$%$&' nombre ,-./ comunIdudes
El resultado es una tabla que contendr nombres de provIncIa y de comunIdades. Es
decIr, UNDN crea una sola tabla con regIstros que estn presentes en cualquIera de las
consultas. SI estn repetIdas solo aparecen una vez, para mostrar los duplIcados se
utIlIza ]X4\X DFF en lugar de la palabra ]X4\X=
Es muy Importante sealar que tanto sta clusula como el resto de combInacIones
especIales, requIeren en los dos SELECT que unen el mIsmo tIpo de columnas (y en el
mIsmo orden).
(B4c49* $"-&5,&%%$1"&,
0e la mIsma forma, la palabra 4XOG><GEO permIte unIr dos consultas SELECT de modo
que el resultado sern las fIlas que estn presentes en ambas consultas.
Ejemplo; tIpos y modelos de pIezas que se encuentren solo en los almacenes 1 y 2:
#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ n_uImucen=1
*+'$-#$&'
#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ n_uImucen=z
(B4c4>* #$;&5&"%$3
Con S4X]< tambIn se combInan dos consultas SELECT de forma que aparecern los
regIstros del prImer SELECT que no estn presentes en el segundo.

-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%($#
Ejemplo; tIpos y modelos de pIezas que se encuentren el almacn 1 y no en el 2
?#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ n_uImucen=1@
/*+:#?#$%$&' LIpo,modeIo ,-./ exIsLencIus
\8$-$ n_uImucen=z@
Se podrian hacer varIas combInacIones anIdadas (una unIon cuyo resultado se
Intersectar con otro SELECT por ejemplo), en ese caso es convenIente utIlIzar
parntesIs para IndIcar qu combInacIon se hace prImero:
(#$%$&'....
....
:+*.+
#$%$&'....
...
)
/*+:#
#$%$&'.... 23 S+-%(+" ,( >'!( #' $&-.& 8 #$(A" #' ;-T(+(&!-'32
(B4)d* %1",=8-3, 373"M3#3,
(B4)d4)* %1",=8-3, %1" YOTV_Z
La funcIon >\QX]S devuelve el numero de la fIla de una consulta. Por ejemplo en:
#$%$&' -.\+:/, edud, nombre ,-./ cIIenLes
Aparece el numero de cada fIla en la posIcIon de la tabla. Esa funcIon actualIza sus
valores usando subconsultas de modo que la consulta:
#$%$&' -.\+:/ 4# runkIng, edud, nombre ,-./ cIIenLes
,-./ (#$%$&' edud, nombre ,-./ cIIenLes .-)$- 5D edud )$#&)
Puesto que la consulta SEECT edud, nombre ROM cIIenLes ORDER BY edud DESC!
obtIene una lIsta de los clIentes ordenada por edad, el SELECT superIor obtendr esa
lIsta pero mostrando el orden de las fIlas en esa consulta. Eso permIte hacer consultas
el tIpo topn, (los n ms....).
Por ejemplo para sacar el top10 de la edad de los clIentes (los 10 clIentes ms
mayores):
SEECT ROWNUM AS runkIng, edud, nombre ROM cIIenLes
ROM (SEECT edud, nombre ROM cIIenLes ORDER BY edud DESC)
WHERE ROWNUM<=1o
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%('#
(B4)d49* %1",=8-3, ,125& &,-5=%-=53, ?&5K5F=$%3,
magInemos una tabla de empleados defInIda por un codIgo de empleado, nombre del
mIsmo y el codIgo del jefe. Este ultImo codIgo est relacIonado con el codIgo de
empleado que posee el jefe en cuestIon. Asi defInIdo, una consulta que muestre el
nombre de un empleado y el nombre de su jefe dIrecto, seria:
#$%$&' e.nombre 4# empIeudo, j.nombre 4# jeIe
,-./ empIeudos e
n.*+ empIeudos j .+ (e.cod_jeIe=j.cod_empIeudo);
Saldria por ejemplo:
EMPLEADO JEFE
Antonio ngel
ngel
Eva ngel
Carmen Eva
Andrs Eva
Carmelo Andrs
En el ejemplo se observa como un jefe puede tener otro jefe, generando una estructura
jerrquIca:
ngel
Antonio Eva
Carmen Andrs
Carmelo
En este tIpo de estructuras, a veces se requIeren consultas que muestren todos los
empleados de un jefe, mostrando los mandos IntermedIos. Se trata de una consulta que
recorre ese rbol. Este tIpo de consultas posee esta sIntaxIs:
#$%$&' =%$9$%!> IIsLuDeCoIumnusYExpresIones
,-./ LubIu(s)...
=\8$-$ condIcIones...>
|#'4-' \*'8 #$(3/#/$(*.|
&.++$&' 5D |+.&D&%$| |O-*.-| *+,-*./$(4G|O-*.-| *+,-*./$(5
El apartado E\XXGEO permIte IndIcar qu relacIon hay que seguIr para recorrer el
rbol. La palabra @>4\> IndIca hacIa donde se dIrIge el recorrIdo. FInalmente el
apartado <OD>O IndIca la condIcIon de InIcIo del recorrIdo (normalmente la condIcIon
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%((#
que permIta buscar el nodo del rbol por el que comenzamos el recorrIdo, es decIr sIrve
para IndIcar desde donde comenzamos. Ejemplo:
#$%$&' nombre ,-./ empIeudos
#'4-' \*'8 nombre='Andrs'
&.++$&' 5D O-*.- n_jeIe=n_empIeudo;
Fesultado:
NOMBRE
Andrs
Eva
ngel
SIn embargo:
#$%$&' nombre ,-./ empIeudos
#'4-' \*'8 nombre='Andrs'
&.++$&' 5D n_jeIe= O-*.- n_empIeudo;
0evuelve:
NOMBRE
Andrs
Carmelo
SI en lugar de Andrs en esa consulta buscramos desde Angel, saldria:
NOMBRE
ngel
Antonio
Eva
Carmen
Andrs
Carmelo
El modIfIcador LE7EL permIte mostrar el nIvel en el rbol jerrquIco de cada elemento:
#$%$&' %$9$%, nombre ,-./ empIeudos
#'4-' \*'8 nombre='ngeI'
&.++$&' 5D n_jeIe= O-*.- n_empIeudo;
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%()#
Fesultado:
LEVEL NOMBRE
1 ngel
2 Antonio
2 Eva
3 Carmen
3 Andrs
4 Carmelo
Para elImInar recorrIdos, se utIlIzan condIcIones en WHEFE o en el propIo CDNNECT. 0e
modo que :
#$%$&' %$9$%, nombre ,-./ empIeudos
\8$-$ nombre!='Evu'
#'4-' \*'8 nombre='ngeI'
&.++$&' 5D n_jeIe= O-*.- n_empIeudo;
En ese ejemplo, Eva no sale en los resultados. En este otro:
#$%$&' %$9$%, nombre ,-./ empIeudos
#'4-' \*'8 nombre='ngeI'
&.++$&' 5D n_jeIe= O-*.- n_empIeudo 4+) nombre!='Evu';
No sale nI Eva nI sus empleados (se corta la rama entera).
Cuando los datos forman un rbol jerrquIco (como ocurre con los ejemplos) no
suele haber nIngun problema. Pero hay dIseos en los que hay padres de hIjos que a su
vez pueden ser sus padres. Con los padres e hIjos no ocurre esta sItuacIon
evIdentemente. Pero por ejemplo sI tuvIramos un dIseo de redes socIales donde se
apunta el nombre del usuarIo y el nombre de sus amIgos, entonces resulta que yo estar
apuntado como amIgo de una persona que, a su vez, es mI amIgo.
En ese caso resultaria un bucle InfInIto cuando se hace esta consulta:
#$%$&' umIgo ,-./ conLucLos
#'4-' \*'8 nombre='ngeI'
&.++$&' 5D O-*.- umIgo=nombre;
UU F!$++( $& 0$!#( -%*",-0#( ;( ,"#$!-"&'+
Para esos casos dIsponemos de la clusula X\EaEFG que controla los resultados
repetIdos y evIta esos camInos. En cualquIer caso consultas en datos no jerarquIzados en
forma de rbol sIno en forma de grafo (como el comentado ejemplo de las redes
socIales), pueden ocupar muchisImo tIempo a Dracle por lo que no es mala Idea pensar
en otra solucIon con ayuda de PL/SQL (lenguaje que se comenta en estos mIsmos
apuntes).
#$%$&' )*#'*+&' umIgo ,-./ conLucLos
#'4-' \*'8 nombre='ngeI'
&.++$&' 5D +.&D&%$ O-*.- umIgo=nombre; UU H>"+' ,<
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%(*#
Por cIerto, el 0STNCT ImpIde que aparezcan muchas veces las mIsmas personas. Ya
que pueden ser amIgos de muchos de mIs amIgos (e Incluso de muchos de los amIgos de
mIs amIgos).
(B4))* %1",=8-3, #& 3+5=<3%$." 373"M3#3
(B4))4)* YO]]_X
Esta expresIon en una consulta de agrupacIon (CFDUP 8Y) permIte obtener los totales
de la funcIon utIlIzada para calcular en esa consulta. Ejemplo:
#$%$&' LIpo, modeIo, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D LIpo,modeIo;
Esta consulta suma las cantIdades de la tabla exIstencIas por cada tIpo y modelo
dIstInto. SI aadImos:
#$%$&' LIpo, modeIo, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D -.%%:O ?LIpo,modeIo@;
Entonces nos aade un regIstro para cada tIpo en el que aparece la suma del total para
ese tIpo. Al fInal mostrar un regIstro con el total absoluto. Es decIr el resultado de esa
consulta es:
TI MODELO SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
AR 21168
BI 10 363
BI 38 1740
BI 57 1638
BI 3741
CL 12 7000
CL 15 3068
CL 18 6612
CL 16680
EM 21 257
EM 42 534
EM 791
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%(+#
TI MODELO SUM(CANTIDAD)
PU 5 12420
PU 9 7682
PU 20102
TO 6 464
TO 9 756
TO 10 987
TO 12 7740
TO 16 356
TO 10303
TU 6 277
TU 9 876
TU 10 1023
TU 12 234
TU 16 654
TU 3064
75849
Se pueden unIr varIas columnas entre parntesIs para tratarlas como sI fueran una
unIdad:
#$%$&' LIpo, modeIo, n_uImucen, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D -.%%:O ((LIpo,modeIo), (n_uImucen));
La dIferencIa respecto a la anterIor es que el total mostado por FDLLUP se referIr al
tIpo y al modelo.
(B4))49* S_I`
Es muy sImIlar al anterIor, solo que este calcula todos los subtotales relatIvos a la
consulta. Ejemplo:
#$%$&' LIpo, modeIo, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D &:5$ ?LIpo,modeIo@0
Fesulta:
TI MODELO SUM(CANTIDAD)
75849
5 12420
6 11271
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%(,#
TI MODELO SUM(CANTIDAD)
9 14242
10 2373
12 14974
15 8735
16 1010
18 6612
20 43
21 257
38 1740
42 534
57 1638
AR 21168
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 3741
BI 10 363
BI 38 1740
BI 57 1638
CL 16680
CL 12 7000
CL 15 3068
CL 18 6612
EM 791
EM 21 257
EM 42 534
PU 20102
PU 5 12420
PU 9 7682
TO 10303
TO 6 464
TO 9 756
TO 10 987
TO 12 7740
TO 16 356
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%)-#
TI MODELO SUM(CANTIDAD)
TU 3064
TU 6 277
TU 9 876
TU 10 1023
TU 12 234
TU 16

Es decIr, calcula totales por tIpo, por modelo y el total absoluto.
(B4))4>* HYO_XNVH
Se trata de una funcIon que funcIona con >\FF]@ y E]VG y que recIbe uno o ms
campos e IndIca sI la fIla muestra un subtotal referIdo a los campos en cuestIon. SI la
fIla es un subtotal de esos campos pone 6, sIno lo marca con c= Ejemplo:
#$%$&' LIpo, modeIo, #:/(cunLIdud),
6-.:O*+6(LIpo), 6-.:O*+6(modeIo)
,-./ exIsLencIus
6-.:O 5D &:5$ ?LIpo,modeIo@;
Sale:
TIPO MODELO SUM(CANTIDAD) GROUPING(TIPO) GROUPING(MODELO)
75849 1 1
5 12420 1 0
6 11271 1 0
9 14242 1 0
10 2373 1 0
12 14974 1 0
15 8735 1 0
16 1010 1 0
18 6612 1 0
20 43 1 0
21 257 1 0
38 1740 1 0
42 534 1 0
57 1638 1 0
AR 21168 0 1
AR 6 10530 0 0
AR 9 4928 0 0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%)%#
TIPO MODELO SUM(CANTIDAD) GROUPING(TIPO) GROUPING(MODELO)
AR 15 5667 0 0
AR 20 43 0 0
BI 3741 0 1
BI 10 363 0 0
BI 38 1740 0 0
BI 57 1638 0 0
CL 16680 0 1
CL 12 7000 0 0
CL 15 3068 0 0
CL 18 6612 0 0
EM 791 0 1
EM 21 257 0 0
EM 42 534 0 0
PU 20102 0 1
PU 5 12420 0 0
PU 9 7682 0 0
TO 10303 0 1
TO 6 464 0 0
TO 9 756 0 0
TO 10 987 0 0
TO 12 7740 0 0
TO 16 356 0 0
TU 3064 0 1
TU 6 277 0 0
TU 9 876 0 0
TU 10 1023 0 0
TU 12 234 0 0
TU 16 654 0 0
Se utIlIza sobre todo para preparar un consulta para la creacIon de Informes.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%)"#
(B4))4B* HYO_XNVH G`RG
Se trata de una mejora de Dracle 9I que permIte realIzar varIas agrupacIones para la
mIsma consulta. SIntaxIs:
#$%$&'<<<
<<<
6-.:O 5D 6-.:O*+6 #$'# ?IIsLuDeCumpos1) |,(IIsLuz)...|
Las lIstas IndIcan los campos por los que se realIza la agrupacIon. Ejemplo:
#$%$&' LIpo, modeIo, n_uImucen, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D 6-.:O*+6 #$'# ((LIpo,modeIo), (n_uImucen));
0e esa consulta se obtIene:
TI MODELO N_ALMACEN SUM(CANTIDAD)
AR 6 10530
AR 9 4928
AR 15 5667
AR 20 43
BI 10 363
BI 38 1740
BI 57 1638
CL 12 7000
CL 15 3068
CL 18 6612
EM 21 257
EM 42 534
PU 5 12420
PU 9 7682
TO 6 464
TO 9 756
TO 10 987
TO 12 7740
TO 16 356
TU 6 277
TU 9 876
TU 10 1023
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%)$#
TI MODELO N_ALMACEN SUM(CANTIDAD)
TU 12 234
TU 16 654
1 30256
2 40112
3 5481
Se trata de dos consultas de totales unIdades
(B4))4C* %1"?="-1, #& 3+5=<3%$1"&, %1:2$"3#3,
Se pueden combInar agrupacIones de dIversas formas creando consultas como:
#$%$&' LIpo, modeIo, n_uImucen, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D LIpo, -.%%:O(modeIo), &:5$(n_uImucen)
Que mostraria un Informe espectacular sobre las tablas anterIores. Asi como:
#$%$&' LIpo, modeIo,n_uImucen, #:/(cunLIdud)
,-./ exIsLencIus
6-.:O 5D 6-.:O*+6 #$'#(LIpo,modeIo@! 6-.:O*+6
#$'#(LIpo,n_uImucen)
(B4)9* J\] &" $",-5=%%$1"&, JZ]
A pesar del poco IlustratIvo titulo de este apartado, la Idea es sencIlla. Se trata de como
utIlIzar InstruccIones SELECT dentro de las InstruccIones 0|L (4X<G>O, AGFGOG o
]@ADOG), ello permIte dar ms potencIa a dIchas InstruccIones.
(B4)94)* 5&88&"1 #& 5&+$,-51, 3 <35-$5 #& ;$83, #& ="3
%1",=8-3
Hay un tIpo de consulta, llamada de adIcIon de datos, que permIte rellenar datos de una
tabla copIando el resultado de una consulta. Se hace medIante la InstruccIon 4X<G>O y,
en defInItIva, permIte copIar datos de una consulta a otra.
Ese relleno se basa en una consulta SELECT que poseer los datos a aadIr.
LogIcamente el orden de esos campos debe de coIncIdIr con la lIsta de campos IndIcada
en la InstruccIon NSEFT.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%)'#
SIntaxIs:
*+#$-' *+'. 1)2%) ?#)',$4, #)',$5,...@
#$%$&' #)',$H$',)1/2%*H)',$4: #)',$H$',)1/2%*H)',$5:BBB
,-./ %/.1) ?*I)2%).
=BBB$1-). #%7&.&%). 3*% JCKCHIBBB>
Ejemplo:
*+#$-' *+'. cIIenLeszooq ?dnI, nombre, IocuIIdud, dIreccIon@


#$%$&' dnI, nombre, IocuIIdud, dIreccIon
,-./ cIIenLes
\8$-$ probIemus=o;
LogIcamente las columnas del SELECT se tIenen que corresponder con las columnas a
rellenar medIante NSEFT (observar las flechas).
(B4)949* ,=2%1",=8-3, &" 83 $",-5=%%$." _XJUR`
La InstruccIon ]@ADOG permIte modIfIcar fIlas. Es muy habItual el uso de la clusula
QBG>G para IndIcar las fIlas que se modIfIcarn. Esta clusula se puede utIlIzar con las
mIsmas posIbIlIdades que en el caso del SELECT, por lo que es posIble utIlIzar
subconsultas. Por ejemplo:
:O)4'$ empIeudos
#$' sueIdo=sueIdo1.1o
\8$-$ Id_seccIon [?#$%$&' Id_seccIon ,-./ seccIones
\8$-$ nom_seccIon='ProduccIn'@0
Esta InstruccIon aumenta un 10 el sueldo de los empleados de la seccIon llamada
Produccn. TambIn podemos utIlIzar subconsultas en la clusula SET de la InstruccIon
UP0ATE.
Ejemplo:
:O)4'$ empIeudos
#$' puesLo_Lrubujo=?#$%$&' puesLo_Lrubujo
,-./ empIeudos
\8$-$ Id_empIeudo=1z@
\8$-$ seccIon=z;
Esta InstruccIon coloca a todos los empleados de la seccIon 2J el mIsmo puesto de
trabajo que el empleado numero 12. Este tIpo de actualIzacIones solo son vlIdas sI el
subselect devuelve un unIco valor, que adems debe de ser compatIble con la columna
que se actualIza.
Hay que tener en cuenta que las actualIzacIones no pueden saltarse las reglas de
IntegrIdad que posean las tablas.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%)(#
(B4)94>* ,=2%1",=8-3, &" 83 $",-5=%%$." J`]`R`
Al Igual que en el caso de las InstruccIones 4X<G>O o <GFGEO, 0ELETE dIspone de
clusula WHEFE y en dIcha clusulas podemos utIlIzar subconsultas. Por ejemplo:
)$%$'$ empIeudos
\8$-$ Id_empIeudo *+
?#$%$&' Id_empIeudo ,-./ errores_gruves@;
En este caso se trata de una subconsulta creada con el operador N, se elImInarn los
empleados cuyo IdentIfIcador est dentro de la tabla de errores yraves.
(B4)>* 7$,-3,
(B4)>4)* $"-51#=%%$."
Una vIsta no es ms que una consulta almacenada a fIn de utIlIzarla tantas veces como
se desee. Una vIsta no contIene datos sIno la InstruccIon <GFGEO necesarIa para crear la
vIsta, eso asegura que los datos sean coherentes al utIlIzar los datos almacenados en las
tablas. Por todo ello, las vIstas gastan muy poco espacIo de dIsco.
Las vIstas se emplean para:
FealIzar consultas complejas ms fcIlmente, ya que permIten dIvIdIr la
consulta en varIas partes
ProporcIonar tablas con datos completos
UtIlIzar vIsIones especIales de los datos
Ser utIlIzadas como tablas que resumen todos los datos
Ser utIlIzadas como cursores de datos en los lenguajes procedImentales (como
PL/SQL)
Hay dos tIpos de vIstas:
<"%89$!= Las forman una sola tabla y no contIenen funcIones de agrupacIon. Su
ventaja es que permIten sIempre realIzar operacIones 0|L sobre ellas.
E)%89$J&!= DbtIenen datos de varIas tablas, pueden utIlIzar funcIones de
agrupacIon. No sIempre permIten operacIones 0|L.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ M7 SQL (). Consultas
!%))#
(B4)>49* %5&3%$." #& 7$,-3,
SIntaxIs:
&-$4'$ |.- -$O%4&$| |,.-&$]+.,.-&$| 9*$\ 9/.1)
|?)%/).|, )%/).5...|@|
4# #$(.&%1)JCKCHI
|\*'8 &8$&R .O'*.+ |&.+#'-4*+' -*.1-/##/0(||
|\*'8 -$4) .+%D |&.+#'-4*+' -*.1-/##/0(||
\> >G@FDEG= SI la vIsta ya exIstia, la cambIa por la actual
H\>EG= Crea la vIsta aunque los datos de la consulta SELECT no exIstan
vstc. Nombre que se le da a la vIsta
clcs. LIsta de alIas que se establecen para las columnas devueltas por la
consulta SELECT en la que se basa esta vIsta. El numero de alIas debe coIncIdIr
con el numero de columnas devueltas por SELECT.
Q4OB EBGEr \@O4\X= Hace que solo las fIlas que se muestran en la vIsta
puedan ser aadIdas (4X<G>O) o modIfIcadas (]@ADOG). La restrccn que
sIgue a esta seccIon es el nombre que se le da a esta restrIccIon de tIpo EBGEr
\@O4\X.
Q4OB >GDA \XFa= Hace que la vIsta sea de solo lectura. PermIte grabar un
nombre para esta restrIccIon.
Lo bueno de las vIstas es que tras su creacIon se utIlIzan como sI fueran una tabla.
Ejemplo:
&-$4'$ 9*$\ resumen
23 '#-', 32
?Id_IocuIIdud, IocuIIdud, pobIucIon, n_provIncIu, provIncIu,superIIcIe,
cupILuI_provIncIu, Id_comunIdud, comunIdud, cupILuI_comunIdud@

4#
? SEECT I.Id_IocuIIdud, I.nombre, I.pobIucIon,
n_provIncIu, p.nombre, p.superIIcIe, Iz.nombre,
Id_comunIdud, c.nombre, I.nombre
ROM IocuIIdudes I
JON provIncIus p USNG (n_provIncIu)
JON comunIdudes c USNG (Id_comunIdud)
JON IocuIIdudes Iz ON (p.Id_cupILuI=Iz.Id_IocuIIdud)
JON IocuIIdudes I ON (c.Id_cupILuI=I.Id_IocuIIdud)
@0

#$%$&' )*#'*+&' (comunIdud, cupILuI_comunIdud)
,-./ resumen; 23 O' V-,/' *',' ' $,'+,( !"%" $&' /'0#' &"+%'#32
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%)*#
La creacIon de la vIsta del ejemplo es compleja ya que hay relacIones complIcadas,
pero una vez creada la vIsta, se le pueden hacer consultas como sI se tratara de una
tabla normal. ncluso se puede utIlIzar el comando AG<E>4VG sobre la vIsta para mostrar
la estructura de los campos que forman la vIsta o utIlIzarse como subconsulta en los
comandos UP0ATE o 0ELETE.
(B4)>4>* :1,-535 83 8$,-3 #& 7$,-3,
La vIsta del dIccIonarIo de datos de Dracle ]<G>il4GQ< permIte mostrar una lIsta de
todas las vIstas que posee el usuarIo actual. Es decIr, para saber qu vIstas hay
dIsponIbles se usa:
#$%$&' ( ,-./ :#$-C9*$\#;
La columna OG`O de esa vIsta contIene la sentencIa SQL que se utIlIzo para crear la
vIsta (sentencIa que es ejecutada cada vez que se Invoca a la vIsta).
(B4)>4B* 215535 7$,-3,
Se utIlIza el comando 0FDP 7EW:
)-.O 9*$\ ($'2-*?*L/.1)0
!%),#

(C*
X]PG\]
(C4)* $"-51#=%%$." 38 G\] <51%&#$:&"-38
CasI todos los grandes SIstemas Cestores de 0atos Incorporan utIlIdades que permIten
amplIar el lenguaje <[F para producIr pequeas utIlIdades que aaden al SQL mejoras
de la programacIon estructurada (bucles, condIcIones, funcIones,....). La razon es que
hay dIversas accIones en la base de datos para las que SQL no es sufIcIente.
Por ello todas las bases de datos Incorporan algun lenguaje de tIpo procedImental
(de tercera generacIon) que permIte manIpular de forma ms avanzada los datos de la
base de datos.
@FY<[F es el lenguaje procedImental que es Implementado por el precompIlador de
\*&.9$. Es una extensIon procedImental del lenguaje SQL; es decIr, se trata de un
lenguaje creado para dar a SQL nuevas posIbIlIdades. Esas posIbIlIdades permIten
utIlIzar condIcIones y bucles al estIlo de los lenguajes de tercera generacIon (como
V&!"., E),)9, EI b&;&, etc.).
En otros sIstemas gestores de bases de datos exIsten otros lenguajes
procedImentales: <[F <$*;$* utIlIza O*&0!&.# <[F, 402)*%"L usa 402)*%"L MUF,...
Lo Interesante del lenguaje PL/SQL es que Integra SQL por lo que gran parte de su
sIntaxIs procede de dIcho lenguaje.
PL/SQL es un lenguaje pensado para la gestIon de datos. La creacIon de aplIcacIones
sobre la base de datos se realIza con otras herramIentas (\*&.9$ A$;$9)8$*) o lenguajes
externos como l"!/&9 V&!". o b&;&. El codIgo PL/SQL puede almacenarse:
En la propIa base de datos
En archIvos externos
(C4)49* ;="%$1"&, F=& <=&#&" 5&38$M35 81, <51+53:3,
X]PG\]
Las ms destacadas son:
FacIlItar la realIzacIon de tareas admInIstratIvas sobre la base de datos (copIa
de valores antiguos, auditoras, control de usuarios,)
7alIdacIon y verIfIcacIon avanzada de usuarIos
Consultas muy avanzadas
Tareas ImposIbles de realIzar con SQL
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%*-#
(C4)4>* %1"%&<-1, 2K,$%1,
281F=& X]PG\]
Se trata de un trozo de codIgo que puede ser Interpretado por Dracle. Se encuentra
Inmerso dentro de las palabras VGU4X y GXA.
<51+53:3 X]PG\]
Conjunto de bloques que realIzan una determInada labor.
<51%&#$:$&"-1
Programa PL/SQL almacenado en la base de datos y que puede ser ejecutado sI se desea
con solo saber su nombre (y tenIendo permIso para su acceso).
;="%$."
Programa PL/SQL que a partIr de unos datos de entrada obtIene un resultado (datos de
salIda). Una funcIon puede ser utIlIzada desde cualquIer otro programa PL/SQL e Incluso
desde una InstruccIon SQL.
-5$++&5 (#$,<353#15*
Programa PL/SQL que se ejecuta automtIcamente cuando ocurre un determInado
suceso a un objeto de la base de datos.
<3F=&-&
ColeccIon de procedImIentos y funcIones agrupados dentro de la mIsma estructura.
SImIlar a las bIblIotecas y lIbrerias de los lenguajes convencIonales.
(C49* &,%5$-=53 #& X]PG\]
(C494)* &,-5=%-=53 #& =" 281F=& X]PG\]
Ya se ha comentado antes que los programas PL/SQL se agrupan en estructuras llamadas
,9)T/$!. Cuando un bloque no tIene nombre, se le llama ,9)T/$ &010"%)= Un bloque
consta de tres seccIones:
A$.9&*&.")0$!= 0efIne e InIcIalIza las varIables, constantes, excepcIones de
usuarIo y cursores utIlIzados en el bloque. 7a precedIda de la palabra AGEFD>G
E)%&0+)! $J$./#&,9$!= SentencIas para manIpular la base de datos y los datos
del programa. Todas estas sentencIas van precedIdas por la palabra VGU4X=
O*&#&%"$0#) +$ $L.$8.")0$!= Para IndIcar las accIones a realIzar en caso de
error. 7an precedIdas por la palabra G`EG@O4\X
H"0&9 +$9 ,9)T/$= La palabra GXA da fIn al bloque.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%*%#

La estructura en si es:
|)$&%4-$
decIurucIones >
5$6*+
InsLruccIones ejecuLubIes
|$7&$O'*.+
InsLruccIones de munejo de errores >
$+);
A los bloques se les puede poner nombre usando (asi se declara un procedImIento):
O-.&$):-$ nombre *#
bIoque
para una funcIon se hace:
,:+&'*.+ nombre
-$':-+ LIpoDeduLos *#
bIoque
Cuando un bloque no se declara como procedImIento o funcIon, se trata de un bloque
anonImo.
(C4949* &,%5$-=53 #& $",-5=%%$1"&, X]PG\]
"15:3, 2K,$%3,
La mayor parte de las normas de escrItura en PL/SQL proceden de SQL, por ejemplo:
Las palabras clave, nombres de tabla y columna, funciones, no distinguen
entre mayusculas y mInusculas
Todas las InstruccIones fInalIzan con el sIgno del punto y coma (p7I excepto las
encabezan un bloque
Los bloques comIenzan con la palabra 8ECN y termInan con EN0
Las InstruccIones pueden ocupar varIas lineas
%1:&"-35$1,
Pueden ser de dos tIpos:
E)%$0#&*")! +$ ;&*"&! 9?0$&!= ComIenzan con Yz y termInan con zY
E)%$0#&*")! +$ 9?0$& !"%89$= Son los que utIlIzan los sIgnos ee (doble guIon). El
texto a la derecha de los guIones se consIdera comentarIo (el de la IzquIerda
no)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%*"#

Ejemplo:
)$&%4-$
v +:/5$- := 1;;
5$6*+
23 K,/( (, $& !"%(&/'+-" I$(
"!$*' V'+-', #<&(', 32
v:=vz; UU (,/( ,.#" "!$*' (,/' #<&('
)5/#C.:'O:'<O:'C%*+$?]@ UU (,!+-0( 6:
$+)0
(C4>* 735$328&,
(C4>4)* =,1 #& 735$328&,
#&%83535 735$328&,
Las varIables se declaran en el apartado AGEFD>G del bloque. PL/SQL no acepta
entrada nI salIda de datos por si mIsmo (para conseguIrlo se necesIta software auxIlIar).
La sIntaxIs de la declaracIon de varIables es:
)$&%4-$
IdenLIIIcudor =&.+#'4+'> LIpoDeDuLos =p[ vuIornIcIuI>0
=siguienteVariable>
Ejemplos:
)$&%4-$
pI &.+#'4+' +:/5$-(q,;):=.1q1qz;;
rudIo +:/5$-();
ureu +:/5$-(1q,z) := z.1z;
El operador m sIrve para asIgnar valores a una varIable. Este operador permIte
InIcIalIzar la varIable con un valor determInado. La palabra E\X<ODXO IndIca que la
varIable no puede ser modIfIcada (es una constante). SI no se InIcIa la varIable, sta
contendr el valor NULL.
Los IdentIfIcadores de Dracle deben de tener J0 caracteres, empezar por letra y
contInuar con letras, numeros o guIones bajos (i7 (tambIn vale el sIgno de dolar ({) y
la almohadIlla (|). No deberia coIncIdIr con nombres de columnas de las tablas nI con
palabras reservadas (como SELECT).
En PL/SQL solo se puede declarar una varIable por linea.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%*$#

-$<1, #& #3-1, <353 83, 735$328&,
Las varIables PL/SQL pueden pertenecer a uno de los sIguIentes datos (solo se lIstan los
tIpos bsIcos, los llamados $!.&9&*$!), la mayoria son los mIsmos del SQL de Dracle.
#"8) +$ +&#)! +$!.*"8."10
EBD>507 Texto de anchura fIja
lD>EBD>-507 Texto de anchura varIable
X]SVG>v58vI!w7w Numero. DpcIonalmente puede IndIcar el tamao del
numero () y el numero de decImales (s)
ADOG Almacena fechas
O4SG<ODS@ Almacena fecha y hora
4XOG>lDF aGD> O\ S\XOB Almacena Intervalos de aos y meses
4XOG>lDF ADa O\ <GE\XA Almacena Intervalos de dias, horas, mInutos y segundos
F\XU Para textos de ms de J2767 caracteres
F\XU >DQ Para datos bInarIos. PL/SQL no puede mostrar estos datos
dIrectamente
4XOGUG> Enteros de J2768 a J2767
V4XD>ai4XOGUG> Enteros largos (de 2.147.48J.647 a 2.147.48J.648)
@F<i4XOGUG> gual que el anterIor pero ocupa menos espacIo
V\\FGDX PermIte almacenar los valores O>]G (verdadero) y HDF<G
(falso)
V4XD>aiA\]VFG 0IsponIble desde la versIon 10g, formato equIvalente al
+)/,9$ del lenguaje C. Fepresenta numeros decImales en
coma flotante.
V4XD>aiHF\DO Dtro tIpo aadIdo en la versIon 10g, equIvalente al 29)&# del
lenguaje C.
&@<5&,$." mRiX`
Se utIlIza para dar a una varIable el mIsmo tIpo de otra varIable o el tIpo de una
columna de una tabla de la base de datos. La sIntaxIs es:
IdenLIIIcudor vurIubIe ] LubIu<coIumnut'DO$;
Ejemplo:
nom LHGNJKMN<KJYlGHt'DO$;
precIo +:/5$-(q,z);
precIo_Ivu precIot'DO$;
La varIable reco_va tomar el tIpo de la varIable precIo (es decIr NUMER(9,2)) la
varIable nom tomar el tIpo de datos asIgnado a la columna nombre de la tabla
ersonas.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%*'#

(C4>49* JIZGlO_RX_R4X_Rl]NV`
Para poder mostrar datos (fechas, textos y numeros), Dracle proporcIona una funcIon
llamada 8/#i9"0$ en el paquete +,%!i)/#8/#. Ejemplo:
)$&%4-$
u +:/5$- := 1;;
5$6*+
)5/#C.:'O:'<O:'C%*+$(u);
$+);
Eso escrIbIria el numero 17 en la pantalla.
(C4>4>* 38%3"%& #& 83, 735$328&,
Ya se ha comentado que en PL/SQL puede haber un bloque dentro de otro bloque. Un
bloque puede anIdarse dentro de:
Un apartado VGU4X
Un apartado G`EG@O4\X
Hay que tener en cuenta que las varIables declaradas en un bloque concreto, son
elImInadas cuando ste acaba (con su EN0 correspondIente).
Ejemplo:
)$&%4-$
v +:/5$- := z;
5$6*+
v:=vz;
)$&%4-$
z +:/5$- := ;
5$6*+
z:=v;
)5/#C.:'O:'<O:'C%*+$(z); UU(,!+-0( 45
)5/#C.:'O:'<O:'C%*+$(v); UU(,!+-0( :
$+)0
)5/#C.:'O:'<O:'C%*+$(vz); UU(,!+-0( B
)5/#C.:'O:'<O:'C%*+$(z); UU(++"+
$+)0
En el ejemplo anterIor, se produce un error porque z no es accesIble desde ese punto,
el bloque InterIor ya ha fInalIzado. SIn embargo desde el bloque InterIor si se puede
acceder a v
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%*(#
(C4>4B* 1<&53#15&, / ;="%$1"&,
1<&53#15&,
En PL/SQL se permIten utIlIzar todos los operadores de SQL: los operadores arItmtIcos
(ezY), condIcIonales (u } ~m }u um }m \> DXA X\O) y de cadena (xx).
A estos operadores, PL/SQL aade el operador de potencIa zz. Por ejemplo 4**3 es
4
3
.
;="%$1"&,
Se pueden utIlIzar las funcIones de Dracle procedentes de SQL (O\iEBD>I <a<ADOGI
XlFI <]V<O>I <4XI etc., etc.) excepto la funcIon AGE\AG y las funcIones de grupo
(<]SI SD`I S4XI E\]XO,...), salvo en las InstruccIones SQL permItIdas.
A estas funcIones se aaden dIversas procedentes de paquetes de Dracle o creados
por los programadores y las funcIones U>GDOG<O y FGD<O
(C4>4C* <3F=&-&, &,-K"#35
Dracle Incorpora una serIe de paquetes para ser utIlIzados dentro del codIgo PL/SQL. Es
el caso del paquete AVS<i\]O@]O que sIrve para utIlIzar funcIones y procedImIentos
de escrItura como @]OiF4XG. Por ejemplo AVS<i\]O@]O=XGQiF4XG57 sIrve para
escrIbIr una linea en blanco en el buffer de datos.
"L:&51, 38&3-15$1,
El paquete AVS<i>DXA\S contIene dIversas funcIones para utIlIzar numero aleatorIos.
QuIz la ms utIl es la funcIon AVS<i>DXA\S=>DXA\S que devuelve un numero entero
(posItIvo o negatIvo) aleatorIo (y muy grande). Por ello sI deseramos un numero
aleatorIo entre 1 y 10 se haria con la expresIon:
MOD(ABS(DBMS_RANDOM.RANDOM),1o)+1
Entre 20 y 50 seria:
MOD(ABS(DBMS_RANDOM.RANDOM),1)+zo
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%*)#

(C4B* $",-5=%%$1"&, G\] <&5:$-$#3,
(C4B4)* $",-5=%%$1"&, G`]`SR &" X]PG\]
PL/SQL admIte el uso de un SELECT que permIte almacenar valores en varIables. Es el
llamado <GFGEO 4XO\.
Su sIntaxIs es:
#$%$&' IIsLuDeCumpos
*+'. IIsLuDeVurIubIes
,-./ LubIu
|n.*+ ...|
|\8$-$ condIcIn|
La clusula NTD es oblIgatorIa en PL/SQL y adems la expresIon SELECT !19) 8/$+$
+$;)9;$* /0& h0".& 2"9&p de otro modo, ocurre un error.
Ejemplo:
)$&%4-$
v_suIurIo +:/5$-(q,z);
V_nombre 94-&84-P(o);
5$6*+
#$%$&' suIurIo,nombre *+'. v_suIurIo, v_nombre
,-./ empIeudos \8$-$ Id_empIeudo=1zqq;
SYSTEM_OUTPUT.PUT_LINE(EI nuevo salario ser de ||
salario*1.2 || euros);
$+)0
(C4B49* $",-5=%%$1"&, JZ] / #& -53",3%%$."
Se pueden utIlIzar InstruccIones 0|L dentro del codIgo ejecutable. Se permIten las
InstruccIones 4X<G>O, ]@ADOG, AGFGOG y SG>UG; con la ventaja de que en PL/SQL
pueden utIlIzar varIables.
Las InstruccIones de transaccIon >\FFVDEr y E\SS4O tambIn estn permItIdas
para anular o confIrmar InstruccIones.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%**#

(C4C* $",-5=%%$1"&, #& %1"-518 #& ;8=?1
Son las InstruccIones que permIten ejecutar un bloque de InstruccIones u otro
dependIendo de una condIcIon. TambIn permIten repetIr un bloque de InstruccIones
hasta cumplIrse la condIcIon (es lo que se conoce como bucles).
La mayoria de estructuras de control PL/SQL son las mIsmas que las de los lenguajes
tradIcIonales como C o Pascal. En concreto PL/SQL se basa en el lenguaje D+&.
(C4C4)* $",-5=%%$." Ng
Se trata de una sentencIa tomada de los lenguajes estructurados. 0esde esta sentencIa
se consIgue que cIertas InstruccIones se ejecuten o no dependIendo de una condIcIon
,&"-&"%$3 Ng ,$:<8&
SIntaxIs:
*, condIcIon '8$+
InsLruccIones
$+) *,0
Las InstruccIones se ejecutan en el caso de que la condIcIon sea verdadera. La condIcIon
es cualquIer expresIon que devuelva verdadero o falso. Ejemplo:
*, depurLumenLo=1q '8$+
suIurIo := suIurIo 1;
depurLumenLo := 1z;
$+) *,0
,&"-&"%$3 NgARj`VA`]G`
SIntaxIs:
*, condIcIn '8$+
InsLruccIones
$%#$
InsLruccIones
$+) *,0
En este caso las InstruccIones bajo el ELSE se ejecutan sI la condIcIon es falsa.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%*+#

,&"-&"%$3 NgARj`VA`]GNg
Cuando se utIlIzan sentencIas de control es comun desear anIdar un F dentro de otro F.
Ejemplo:
*, suIdo>qo '8$+
)5/#C.:'O:'<O:'C%*+$(Saldo mayor que el esperado);
$%#$
*, suIdo>o '8$+
)5/#C.:'O:'<O:'C%*+$(Saldo menor que el esperado);
$%#$
)5/#C.:'O:'<O:'C%*+$(Saldo NEGATIVO);
$+) *,0
$+) *,0
Dtra solucIon es utIlIzar esta estructura:
*, condIcIn1 '8$+
InsLruccIones1
$%#*, condIcInz '8$+
InsLruccIones
|$%#*,<<<< |
|$%#$
InsLruccIonesEIse >
$+) *,0
En este F (que es el ms completo) es evalua la prImera condIcIon; sI es verdadera se
ejecutan las prImeras InstruccIones y se abandona el F; sI no es asi se mIra la sIguIente
condIcIon y sI es verdadera se ejecutan las sIguIentes InstruccIones, sI es falsa se va al
sIguIente ELSF a evaluar la sIguIente condIcIon, y asi sucesIvamente. La clusula ELSE
se ejecuta solo sI no se cumple nInguna de las anterIores condIcIones.
Ejemplo (equIvalente al anterIor):
*, suIdo>qo '8$+
)5/#C.:'O:'<O:'C%*+$(Saldo mayor que el esperado);
$%#*, suIdo>o '8$+
)5/#C.:'O:'<O:'C%*+$(Saldo menor que el esperado);
$%#$
)5/#C.:'O:'<O:'C%*+$(Saldo NEGATIVO);
$+) *,0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%*,#

(C4C49* ,&"-&"%$3 SUG`
La sentencIa CASE devuelve un resultado tras evaluar una expresIon. SIntaxIs:
&4#$ seIecLor
\8$+ expresIon1 '8$+ resuILudo1
\8$+ expresIonz '8$+ resuILudoz
<<<
=$%#$ resuILudoEIse>
$+)0
Ejemplo:
LexLo:= &4#$ ucLILud
\8$+ 'A' '8$+ 'Muy buenu'
\8$+ 'B' '8$+ 'Buenu'
\8$+ 'C' '8$+ 'NormuI'
\8$+ 'D' '8$+ 'MuIu'
$%#$ 'DesconocIdu'
$+);
Hay que tener en cuenta que la sentencIa CASE sIrve para devolver un valor y no para
ejecutar una InstruccIon.
tambIn se pueden escrIbIr sentencIas CASE ms complIcadas. Por ejemplo:
uprobudo:= &4#$
\8$+ ucLILud='A' 4+) noLu>=q '8$+ '-:$
\8$+ noLu>= 4+) (ucLILud='B' .- ucLILud='C') '8$+ '-:$
\8$+ noLu>=; '8$+ '-:$
$%#$ ,4%#$
$+)0
(C4C4>* 2=%8&,
2=%8& ]OOX
Se trata de una InstruccIon que contIene InstruccIon que se repIten IndefInIdamente
(bucle InfInIto). Se InIcIa con la palabra F\\@ y fInalIza con la palabra GXA F\\@ y
dentro de esas palabras se colocan las InstruccIones que se repetIrn.
LogIcamente no tIene sentIdo utIlIzar un bucle InfInIto, por eso exIste una
InstruccIon llamada G`4O que permIte abandonar el bucle. Cuando Dracle encuentra esa
InstruccIon, el programa contInua desde la sIguIente InstruccIon al EN0 LDDP.
Lo normal es colocar EXT dentro de una sentencIa F a fIn de establecer una
condIcIon de salIda del bucle. TambIn se puede acompaar a la palabra EXT de la
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%+-#
palabra QBGX seguIda de una condIcIon. SI se condIcIon es cIerta, se abandona el
bucle, sIno contInuamos dentro.
SIntaxIs
%..O
InsLruccIones
...
$7*' |\8$+ condIcIn|
$+) %..O0
Ejemplo (bucle que escrIbe los numeros del 1 al 10):
)$&%4-$
conL +:/5$- :=1;
5$6*+
%..O
)5/#C.:'O:'<O:'C%*+$(conL);
$7*' \8$+ conL=1o;
conL:=conL+1;
$+) %..O0
$+)0
2=%8& TjN]`
Cenera un bucle cuyas InstruccIones se repIten mIentras la condIcIon que sIgue a la
palabra WHLE sea verdadera. SIntaxIs:
\8*%$ condIcIn %..O
InsLruccIones
$+) %..O0
En este bucle es posIble utIlIzar (aunque no es muy habItual en este tIpo de bucle) la
InstruccIon G`4O o G`4O QBGX. La dIferencIa con el anterIor es que este es ms
estructurado (ms famIlIar para los programadores de lenguajes como 8asIc, Pascal, C,
Java,...)
Ejemplo (escrIbIr numeros del 1 al 10):
)$&%4-$
conL +:/5$- :=1;
5$6*+
\8*%$ conL<=1o %..O
)5/#C.:'O:'<O:'C%*+$(conL);
conL:=conL+1;
$+) %..O0
$+)0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%+%#
2=%8& gOY
Se utIlIzar para bucles con contador, bucles que se recorren un numero concreto de
veces. Para ello se utIlIza una varIable (contador) que no tIene que estar declarada en
el AGEFD>G, esta varIable es declarada automtIcamente en el propIo H\> y se elImIna
cuando ste fInalIza.
Se IndIca el valor InIcIal de la varIable y el valor fInal (el Incremento Ir de uno en
uno). SI se utIlIza la clusula >GlG><G, entonces el contador cuenta desde el valor alto
al bajo restando 1.
SIntaxIs:
,.- conLudor *+ =-$9$-#$> vuIorBujo<<vuIorAILo
InsLruccIones
$+) %..O0
2=%8&, 3"$#3#1,
Se puede colocar un bucle dentro de otro sIn nIngun problema, puede haber un QB4FG
dentro de un H\>, un F\\@ dentro de otro LDDP, etc.
Hay que tener en cuenta que en ese caso, la sentencIa EXT abandonaria el bucle en
el que estamos:
,.- I *+ 1..1o %..O
,.- j *+ 1..o %..O
$7*' \8$+ j=;
...
$+) %..O0
...
$+) %..O0
El bucle ms InterIor solo cuenta hasta que j vale 5 ya que la InstruccIon EXT abandona
el bucle ms InterIor cuando llega a ese valor.
No obstante hay una varIante de la InstruccIon EXT que permIte salIr Incluso del
bucle ms exterIor. Eso se consIgue ponIendo una etIqueta a los bucles que se deseen.
Una etIqueta es un IdentIfIcador que se coloca dentro de los sIgnos }} y uu delante del
bucle. Eso permIte poner nombre al bucle.
Por ejemplo:
uulWIUHFrr
,.- I *+ 1..1o %..O
,.- j *+ 1..o %..O
$7*' bucIeI \8$+ j=;
...
$+) %..O;
...
$+) %..O bucIeI;
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%+"#
En este caso cuando vale 5 se abandonan ambos bucles. No es oblIgatorIo poner la
etIqueta en la InstruccIon EN0 LDDP (en el ejemplo en la InstruccIon EN0 L00P bucle),
pero se suele hacer por dar mayor clarIdad al codIgo.
(C4D* %=5,15&,
(C4D4)* $"-51#=%%$."
Los cursores representan consultas <GFGEO de <[F que devuelven ms de un resultado y
que permIten el acceso a cada fIla de dIcha consulta. Lo cual sIgnIfIca que el cursor
sIempre tIene un puntero sealando a una de las fIlas del SELECT que representa el
cursor.
Se puede recorrer el cursor hacIendo que el puntero se mueva por las fIlas. Los
cursores son las herramIentas fundamentales de PL/SQL
(C4D49* <51%&,3:$&"-1 #& %=5,15&,
Los cursores se procesan en tres pasos:
!%# A$.9&*&* $9 ./*!)*
!"# D,*"* $9 ./*!)*. Tras abrIr el cursor, el puntero del cursor sealar a la prImera
fIla (sI la hay)
!$# @*).$!&* $9 ./*!)*= La InstruccIon FETCH permIte recorrer el cursor regIstro a
regIstro hasta que el puntero llegue al fInal (se dIce que hasta que el cursor est
vacio)
!'# E$**&* $9 ./*!)*
(C4D4>* #&%8353%$." #& %=5,15&,
SIntaxIs:
&:-#.- nombre *# senLencIuSEECT;
La sentencIa <GFGEO IndIcada no puede tener apartado 4XO\. LogIcamente esta
sentencIa solo puede ser utIlIzada en el apartado AGEFD>G.
Ejemplo:
&:-#.- cursorProvIncIus *#
#$%$&' p.nombre, #:/(pobIucIon) 4# pobIucIon
,-./ IocuIIdudes I
n.*+ provIncIus p :#*+6 (n_provIncIu)
6-.:O 5D p.nombre;
(C4D4B* 3<&5-=53 #& %=5,15&,
.O$+ cursor0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%+$#
Esta sentencIa abre el cursor, lo que sIgnIfIca:
!'# Feservar memorIa sufIcIente para el cursor
!(# Ejecutar la sentencIa <GFGEO a la que se refIere el cursor
!)# Colocar el puntero de recorrIdo de regIstros en la prImera fIla
SI la sentencIa SELECT del cursor no devuelve regIstros, Dracle no devolver una
excepcIon. Hasta Intentar leer no sabremos sI hay resultados o no.
(C4D4C* $",-5=%%$." g`RSj
La sentencIa FETCH es la encargada de recorrer el cursor e Ir procesando los valores del
mIsmo:
,$'&8 cursor *+'. IIsLuDeVurIubIes;
Esta InstruccIon almacena el contenIdo de la fIla a la que apunta actualmente el
puntero en la lIsta de varIables IndIcada. La lIsta de varIables tIene tener el mIsmo tIpo
y numero que las columnas representadas en el cursor (por supuesto el orden de las
varIables se tIene que corresponder con la lIsta de columnas). Tras esta InstruccIon el
puntero de regIstros avanza a la sIguIente fIla (sI la hay).
Ejemplo:
,$'&8 cursorProvIncIus *+'. v_nombre, v_pobIucIon;
Una InstruccIon FETCH lee una sola fIla y su contenIdo lo almacena en varIables. Por
ello se usa sIempre dentro de bucles a fIn de poder leer todas las fIlas de un cursor:
%..O
,$'&8 cursorProvIncIus *+'. (v_nombre, v_pobIucIon);
$7*' \8$+... UU'I$< ,( *"&;+<' #' !"&;-!-.& ;( ,'#-;'
... UU-&,/+$!!-"&(, ;( *+"!(," ;( #", ;'/", ;(# !$+,"+
$+) %..O0
(C4D4D* %&5535 &8 %=5,15
&%.#$ cursorW
Al cerrar el cursor se lIbera la memorIa que ocupa y se ImpIde su procesamIento (no se
podria seguIr leyendo fIlas). Tras cerrar el cursor se podria abrIr de nuevo.
(C4D4E* 3-5$2=-1, #& 81, %=5,15&,
Para poder procesar adecuadamente los cursores se pueden utIlIzar una serIe de
atrIbutos que devuelven ;$*+&+$*) o 2&9!) segun la sItuacIon actual del cursor. Estos
atrIbutos facIlItan la manIpulacIon del cursor. Se utIlIzan IndIcando el nombre del
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%+'#
cursor, el simbolo e InmedIatamente el nombre del atrIbuto a valorar (por ejemplo
cursorProvncasXlS0PEN)
mNGOX`V
0evuelve verdadero sI el cursor ya est abIerto.
mVORgO_VJ
0evuelve verdadero sI la ultIma InstruccIon FETCH no devolvIo nIngun valor. Ejemplo:
)$&%4-$
&:-#.- cursorProvIncIus *#
#$%$&' p.nombre, #:/(pobIucIon) 4# pobIucIon
,-./ %.&4%*)4)$# I
n.*+ O-.9*+&*4# p :#*+6 (n_provIncIu)
6-.:O 5D p.nombre;

v_nombre O-.9*+&*4#.nombret'DO$;
v_pobIucIon %.&4%*)4)$#.pobIucIont'DO$;

5$6*+
.O$+ cursorProvIncIus;
%..O
,$'&8 cursorProvIncIus *+'. v_nombre,
v_pobIucIon;
$7*' \8$+ cursorProvIncIus%+.',.:+);
)5/#C.:'O:'<O:'C%*+$(v_nombre ]] ',' ]]
v_pobIucIon);
$+) %..O0
&%.#$ cursorProvIncIus;
$+);
En el ejemplo anterIor se recorre el cursor hasta que el FETCH no devuelve nInguna fIla.
Lo que sIgnIfIca que el programa anterIor muestra el nombre de cada provIncIa seguIda
de una coma y de la poblacIon de la mIsma.
mgO_VJ
nstruccIon contrarIa a la anterIor, devuelve verdadero sI el ultImo FETCH devolvIo una
fIla.
mYOTSO_VR
ndIca el numero de fIlas que se han recorrIdo en el cursor (InIcIalmente vale cero). Es
decIr, IndIca cuntos FETCH se han aplIcado sobre el cursor.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%+(#
(C4D4b* 735$328&, #& 5&+$,-51
$"-51#=%%$."
Los regIstros son una estructura esttIca de datos presente en casI todos los lenguajes
clsIcos (*$.)*+ en Pascal o !#*/.# en C). Se trata de un tIpo de datos que se compone
de datos ms sImple. Por ejemplo el regIstro ersona se compondria de los datos
sImples nombre, aelldos, dreccn, jecha de nacmento, etc.
En PL/SQL su Inters radIca en que cada fIla de una tabla o vIsta se puede
Interpretar como un regIstro, ya que cada fIla se compone de datos sImples. CracIas a
esta InterpretacIon, los regIstros facIlItan la manIpulacIon de los cursores ya que
podemos entender que un cursor es un conjunto de regIstros (cada regIstro seria una fIla
del cursor).
#&%8353%$."
Para utIlIzar regIstros, prImero hay que defInIr los datos que componen al regIstro. Asi
se defIne el tIpo de regIstro (por eso se utIlIza la palabra TYPE). 0espus se declarar
una varIable de regIstro que sea del tIpo declarado (es decIr, puede haber varIas
varIables del mIsmo tIpo de regIstro).
SIntaxIs:
'DO$ nombreTIpoRegIsLro *# -$&.-)?
cumpo1 LIpoCumpo1 =p[ vuIornIcIuI>!
cumpoz LIpoCumpoz =p[ vuIornIcIuI>!
<<<
cumpoN LIpoCumpoN =p[ vuIornIcIuI>
@0

nombreVurIubIeDeRegIsLro nombreTIpoRegIsLro0
Ejemplo:
'DO$ regPersonu *# -$&.-)?
nombre 94-&84-P(z),
upeIIIdo1 94-&84-P(z),
upeIIIdoz 94-&84-P(z),
IecIu_nuc )4'$
@0
uIvuro regPersonu;
Iuuru regPersonu;
=,1 #& 5&+$,-51,
Para rellenar los valores de los regIstros se IndIca el nombre de la varIable de regIstro
seguIda de un punto y el nombre del campo a rellenar:
uIvuro.nombre := 'AIvuro';
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%+)#
uIvuro.IecIu_nuc := '.C)4'$(2/3/2004);
mYOTRiX`
Al declarar regIstros, se puede utIlIzar el modIfIcador FDWTYPE que sIrve para asIgnar
a un regIstro la estructura de una tabla. Por ejemplo:
)$&%4-$
regPersonu LHGNJKMNt-.\'DO$;
ersonas debe ser una tabla. reyPersona es un regIstro que constar de los mIsmos
campos y tIpos que las columnas de la tabla ersonas.
(C4D4c* %=5,15&, / 5&+$,-51,
=,1 #& g`RSj %1" 5&+$,-51,
Una de las desventajas, con lo vIsto hasta ahora, de utIlIzar HGOEB resIde en que
necesItamos asIgnar todos los valores de cada fIla del cursor a una varIable. Por lo que
sI una fIla tIene 10 columnas, habr que declarar 10 varIables.
En lugar de ello se puede utIlIzar una varIable de regIstro y asIgnar el resultado de
FETCH a esa varIable. Ejemplo (equIvalente al de la pgIna 18J):
)$&%4-$
&:-#.- cursorProvIncIus *#
#$%$&' p.nombre, #:/(pobIucIon) 4# pobIucIon
,-./ %.&4%*)4)$# I
n.*+ O-.9*+&*4# p :#*+6 (n_provIncIu)
6-.:O 5D p.nombre;

rProvIncIus cursorProvIncIust-.\'DO$;
5$6*+
.O$+ cursorProvIncIus;
%..O
,$'&8 cursorProvIncIus *+'. rProvIncIus;
$7*' \8$+ cursorProvIncIust+.',.:+);
)5/#C.:'O:'<O:'C%*+$(rProvIncIus.nombre ]] , ||
rProvIncIus.pobIucIon);
$+) %..O0
&%.#$ cursorProvIncIus;
$+)0
2=%8& gOY #& 5&%155$#1 #& %=5,15&,
Es la forma ms habItual de recorrer todas las fIlas de un cursor. Es un bucle FDF que se
encarga de realIzar tres tareas:
!%# Abre un cursor (realIza un \@GX ImplicIto sobre el cursor antes de empezar el
bucle)
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%+*#
!"# Fecorre todas las fIlas de un cursor (cada vez que se entra en el InterIor del H\>
se genera un HGOEB ImplicIto) y en cada vuelta del bucle almacena el contenIdo
de cada fIla en una varIable de regIstro. La varIable de regIstro utIlIzada en el
bucle FDF no se debe declarar en la zona 0ECLAFE; se crea al InIcIo del bucle y
se elImIna cuando ste fInalIza.
!$# CIerra el cursor (cuando fInalIza el H\>)
SIntaxIs:
,.- vurIubIeRegIsLro *+ cursor %..O
<<InsLruccIones
$+) %..O0
Esa sIntaxIs es equIvalente a:
.O$+ cursor0
%..O
,$'&8 cursor *+'. vurIubIeRegIsLro0
$7*' \8$+ cursort+.',.:+)0
<<<InsLruccIones
$+) %..O0
Ejemplo (equIvalente al ejemplo comentado en los apartados anterIores):
)$&%4-$
&:-#.- cursorProvIncIus *#
#$%$&' p.nombre, #:/(pobIucIon) 4# pobIucIon
,-./ %.&4%*)4)$# I
n.*+ O-.9*+&*4# p :#*+6 (n_provIncIu)
6-.:O 5D p.nombre;
5$6*+
,.- rProvIncIus *+ cursorProvIncIus %..O
)5/#C.:'O:'<O:'C%*+$(rProvincias.nombre || , ||
rProvIncIus.pobIucIon);
$+) %..O0
$+)0
Naturalmente este codIgo es ms sencIllo de utIlIzar y ms corto que los anterIores.
(C4D4)d* %=5,15&, 373"M3#1,
%=5,15&, %1" <35K:&-51,
En muchas ocasIones se podria desear que el resultado de un cursor dependa de una
varIable. Por ejemplo al presentar una lIsta de personal, hacer que aparezca el cursor
de un determInado departamento y puesto de trabajo.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%++#
Para hacer que el cursor varie segun esos parmetros, se han de IndIcar los mIsmos
en la declaracIon del cursor. Para ello se pone entre parntesIs su nombre y tIpo tras el
nombre del cursor en la declaracIon.
Ejemplo:
)$&%4-$
&:-#.- cur_personus(dep +:/5$-, pue 94-&84-P(zo)) S
#$%$&' nombre, upeIIIdos
,-./ empIeudos
\8$-$ depurLumenLo=dep 4+) puesLo=pue;
5$6*+
.O$+ cur_personus(12,administrativo);
.....
&%.#$ cur_personus;
$+)
Es al abrIr el. cursor cuando se IndIca el valor de los parmetros, lo que sIgnIfIca que se
puede abrIr varIas veces el cursor y que ste obtenga dIstIntos resultados dependIendo
del valor del parmetro.
Se pueden IndIcar los parmetros tambIn en el bucle FDF:
)$&%4-$
&:-#.- cur_personus(dep +:/5$-, pue 94-&84-P(zo)) *#
#$%$&' nombre, upeIIIdos
,-./ empIeudos
\8$-$ depurLumenLo=dep 4+) puesLo=pue;
5$6*+
,.- r *+ cur_personus(1z,'udmInIsLruLIvo') %..O
.....
$+) %..O;
$+)

3%-=38$M3%$1"&, 38 5&%155&5 5&+$,-51,
En muchas ocasIones se realIzan operacIones de actualIzacIon de regIstros sobre el
cursor que se est recorrIendo. Para evItar problemas se deben bloquear los regIstros
del cursor a fIn de detener otros procesos que tambIn desearan modIfIcar los datos.
Esta clusula se coloca al fInal de la sentencIa <GFGEO del cursor (Iria detrs del
\>AG> Va). DpcIonalmente se puede colocar el texto X\QD4O para que el programa no
se quede esperando en caso de que la tabla est bloqueada por otro usuarIo. Se usa el
texto DF seguIdo del nombre del campo que se modIfIcar (no es necesarIa esa clusula,
pero se mantIene para clarIfIcar el codIgo).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%+,#
SIntaxIs:
&:-#.- <<<
#$%$&'<<<
,.- :O)4'$ |., cumpo| |+.\4*'|
Ejemplo:
)$&%4-$
&:-#.- c_emp *#
#$%$&' Id_emp, nombre, n_depurLumenLo, suIurIo
,-./ empIeudos, depurLumenLos
\8$-$ empIeudos.Id_dep=depurLumenLos.Id_dep
4+) empIeudos.Id_dep=8o
,.- :O)4'$ ., suIurIo +.\4*' 0
A contInuacIon en la InstruccIon UP0ATE que modIfIca los regIstros se puede utIlIzar una
nueva clusula llamada WHEFE CUFFENT DF seguIda del nombre de un cursor, que hace
que se modIfIque solo el regIstro actual del cursor.
Ejemplo:
,.- r_emp *+ ICHYL %..O
*, r_emp.suIurIo<1oo '8$+
:O)4'$ empIeudos #$' suIurIo = suIurIo 1.o
\8$-$ &:--$+' ., c_emp ;
(C4E* &@%&<%$1"&,
(C4E4)* $"-51#=%%$."
Se llama excepcIon a todo hecho que le sucede a un programa que causa que la
ejecucIon del mIsmo fInalIce. LogIcamente eso causa que el programa termIne de forma
anormal.
Las excepcIones se debe a:
Que ocurra un error detectado por Dracle (por ejemplo sI un <GFGEO no
devuelve datos ocurre el error 0RA-01403 llamado N0_0ATA_F0UN0).
Que el propIo programador las lance (comando >D4<G).
Las excepcIones se pueden capturar a fIn de que el programa controle mejor la
exIstencIa de las mIsmas.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%,-#
(C4E49* %3<-=53 #& &@%&<%$1"&,
La captura se realIza utIlIzando el bloque G`EG@O4\X que es el bloque que est justo
antes del EN0 del bloque. Cuando una excepcIon ocurre, se comprueba el bloque
EXCEPTDN para ver sI ha sIdo capturada, sI no se captura, el error se propaga a Dracle
que se encargar de IndIcar el error exIstente.
Las excepcIones pueden ser de estos tIpos:
GL.$8.")0$! 8*$+$2"0"+&! +$ \*&.9$= Que tIenen ya asIgnado un nombre de
excepcIon.
GL.$8.")0$! +$ \*&.9$ !"0 +$2"0"*= No tIenen nombre asIgnado pero se les
puede asIgnar.
A$2"0"+&! 8)* $9 /!/&*")= Las lanza el programador.
La captura de excepcIones se realIza con esta sIntaxIs:
)$&%4-$
seccIn de decIurucIones
5$6*+
InsLruccIones
$7&$O'*.+
\8$+ excepcIn1 |.- excepcInz <<<| '8$+
InsLruccIones que se ejcuLun sI suceden esus excepcIones
|\8$+ excepcIn |.-...| '8$+
InsLruccIones que se ejcuLun sI suceden esus excepcIones>
|\8$+ .'8$-# '8$+
InsLruccIones que se ejecuLun sI suceden oLrus
excepcIones>
$+)0
Cuando ocurre una determInada excepcIon, se comprueba el prImer WHEN para
comprobar sI el nombre de la excepcIon ocurrIda coIncIde con el que dIcho WHEN
captura; sI es asi se ejecutan las InstruccIones, sI no es asi se comprueba el sIguIente
QBGX y asi sucesIvamente.
SI exIsten clusula QBGX \OBG><, entonces las excepcIones que no estaban
reflejadas en los dems apartados WHEN ejecutan las InstruccIones del WHEN DTHEFS.
sta clusula debe ser la ultIma.
(C4E4>* &@%&<%$1"&, <5&#&;$"$#3,
Dracle tIene las sIguIentes excepcIones predefInIdas. Son errores a los que Dracle asIgna
un nombre de excepcIon. Estn presentes los ms comunes:
Nombre de excec|n Numero de
error
Ocurre cuondo..
DEEG<<i4XO\iX]FF \>DecRPKc Se Intentan asIgnar valores a un objeto que
no se habia InIcIalIzado
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,%#
Nombre de excec|n Numero de
error
Ocurre cuondo..
ED<GiX\OiH\]XA \>DecRP_- NInguna opcIon WHEN dentro de la
InstruccIon CASE captura el valor, y no hay
InstruccIon ELSE
E\FFGEO4\Xi4<iX]FF \>DecRPK6 Se Intenta utIlIzar un varray o una tabla
anIdada que no estaba InIcIalIzada
E]><\>iDF>GDAai\@GX \>DecRP66 Se Intenta abrIr un cursor que ya se habia
abIerto
A]@ilDFi\Xi4XAG` \>Decccc6 Se Intento aadIr una fIla que provoca que un
indIce unIco repIta valores
4XlDF4AiE]><\> \>Dec6cc6 Se realIzo una operacIon Ilegal sobre un
cursor
4XlDF4AiX]SVG> \>Dec6W-- Falla la conversIon de carcter a numero
F\U4XiAG4XGA \>Dec6c6W Se Intenta conectar con Dracle usando un
nombre de usuarIo y contrasea InvlIdos
X\iADODiH\]XA \>Dec6McK El SELECT de fIla unIca no devolvIo valores
@>\U>DSiG>>\> \>DecRPc6 Error Interno de Dracle
>\QOa@GiS4<SDOEB \>DecRPcM Hay IncompatIbIlIdad de tIpos entre el cursor
y las varIables a las que se Intentan asIgnar
sus valores
<O\>DUGiG>>\> \>DecRPcc No hay memorIa sufIcIente
<]V<E>4@OiVGa\XAiE\]XO \>DecRPKK Se hace referencIa a un elemento de un
varray o una tabla anIdada usando un indIce
mayor que los elementos que poseen
<]V<E>4@Oi\]O<4AGiF4S4O \>DecRPK- Se hace referencIa a un elemento de un
varray o una tabla anIdada usando un indIce
cuyo valor est fuera del rango legal
<a<i4XlDF4Ai>\Q4A \>Dec6M6c Se convIerte un texto en un numero de
IdentIfIcacIon de fIla (FDW0) y el texto no
es vlIdo
O4SG\]Oi\Xi>G<\]>EG \>DecccP6 Se consumIo el mxImo tIempo en el que
Dracle permIte esperar al recurso
O\\iSDXai>\Q< \>Dec6M-- El SELECT de fIla unIca devuelve ms de una
fIla
lDF]GiG>>\> \>DecRPc- Hay un error arItmtIco, de conversIon, de
redondeo o de tamao en una operacIon
qG>\iA4l4AG \>Dec6MWR Se Intenta dIvIdIr entre el numero cero.

($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%,"#
Ejemplo:
)$&%4-$
x +:/5$- :=o;
y +:/5$- := ;
res +:/5$-;
5$6*+
res:=yJx;
)5/#C.:'O:'<O:'C%*+$(res);
$7&$O'*.+
\8$+ ;$-.C)*9*)$ '8$+
)5/#C.:'O:'<O:'C%*+$('No se puede dIvIdIr por cero') ;
\8$+ .'8$-# '8$+
)5/#C.:'O:'<O:'C%*+$('Error Inesperudo') ;
$+)0
(C4E4B* &@%&<%$1"&, ,$" #&;$"$5
Pueden ocurrIr otras muchas excepcIones que no estn en la lIsta anterIor. En ese caso
aunque no tIenen un nombre asIgnado, si tIenen un numero asIgnado. Ese numero es el
que aparece cuando Dracle muestra el mensaje de error tras la palabra DFA.
Por ejemplo en un error por restrIccIon de IntegrIdad Dracle lanza un mensaje
encabezado por el texto: \>Dec--_- Por lo tanto el error de IntegrIdad referencIa es
el 02292.
SI deseamos capturar excepcIones sIn defInIr hay que:
!%# 0eclarar un nombre para la excepcIon que capturaremos. Eso se hace en el
apartado AGEFD>G con esta sIntaxIs:
nombreDeExcepcIn $7&$O'*.+0
!"# AsocIar ese nombre al numero de error correspondIente medIante esta sIntaxIs
en el apartado AGEFD>G (tras la InstruccIon del paso 1):
O-46/4 $7&$O'*.+C*+*'?nombreDeExcepcIn! nDeExcepcIn@0
!$# En el apartado G`EG@O4\X capturar el nombre de la excepcIon como sI fuera una
excepcIon normal.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,$#
Ejemplo:
)$&%4-$
e_InLegrIdud $7&$O'*.+;
O-46/4 $7&$O'*.+C*+*'(e_InLegrIdud, -zzqz);
5$6*+
)$%$'$ ,-./ pIezus \8$-$ LIpo='TU' 4+) modeIo=6;
$7&$O'*.+
\8$+ e_InLegrIdud '8$+
)5/#C.:'O:'<O:'C%*+$(No se puede borrar esa pieza ||
porque tiene existencias relacionadas);
$+);
(C4E4C* ;="%$1"&, #& =,1 %1" &@%&<%$1"&,
Se suelen usar dos funcIones cuando se trabaja con excepcIones:
<[FE\AG= Fetorna el codIgo de error del error ocurrIdo
<[FG>>S= 0evuelve el mensaje de error de Dracle asocIado a ese numero de
error.
Ejemplo:
$7&$O'*.+
...
\8$+ .'8$-# '8$+
)5/#C.:'O:'<O:'C%*+$(Ocurri el error ||
#Q%&.)$ ||mensaje: || #Q%$--/);
$+);
(C4E4D* &@%&<%$1"&, #& =,=35$1
El programador puede lanzar sus propIas excepcIones sImulando errores del programa.
Para ello hay que:
!%# 0eclarar un nombre para la excepcIon en el apartado AGEFD>G, al Igual que para
las excepcIones sIn defInIr:
mIExcepcIon $7&$O'*.+;
!"# En la seccIon ejecutable (VGU4X) utIlIzar la InstruccIon >D4<G para lanzar la
excepcIon:
-4*#$ mIExcepcIon;
!$# En el apartado de excepcIones capturar el nombre de excepcIon declarado:
$7&$O'*.+
...
\8$+ mIExcepcIon '8$+ ....
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%,'#
Dtra forma es utIlIzar la funcIon >D4<GiD@@F4EDO4\XiG>>\> que sImplIfIca los tres
pasos anterIores. SIntaxIs:
-4*#$C4OO%*&4'*.+C$--.-?nDeError! mensuje, |!{'-:$2,4%#$]|)0
Esta InstruccIon se coloca en la seccIon ejecutable o en la de excepcIones y sustItuye a
los tres pasos anterIores. Lo que hace es lanzar un error cuyo numero debe de estar
entre el 20000 y el 20999 y hace que Dracle muestre el mensaje IndIcado. El tercer
parmetro opcIones puede ser O>]G o HDF<G (por defecto TFUE) e IndIca sI el error se
aade a la pIla de errores exIstentes.
Ejemplo:
)$&%4-$

5$6*+
)$%$'$ ,-./ pIezus \8$-$ LIpo='ZU' 4+) modeIo=z6;
*, #Q%t+.',.:+) '8$+
-4*#$C4OO%*&4'*.+C$--.-(-zooo1,'No exIsLe esu pIezu');
$+) *,0
$+)0
En el ejemplo, sI la pIeza no exIste, entonces <[FX\OH\]XA devuelve verdadero ya
que el 0ELETE no elImIna nInguna pIeza. Se lanza la excepcIon de usuarIo 20001
hacIendo que Dracle utIlIce el mensaje IndIcado. Dracle lanzar el mensaje: ORA-
zooo1: No exIsLe esu pIezu

(C4b* <51%&#$:$&"-1,
(C4b4)* $"-51#=%%$."
Un procedImIento es un bloque PL/SQL al que se le asIgna un nombre. Un procedImIento
se crea para que realIce una determInada tarea de gestIon.
Los procedImIentos son compIlados y almacenados en la base de datos. CracIas a
ellos se consIgue una reutIlIzacIon efIcIente del codIgo, ya que se puede Invocar al
procedImIento las veces que haga falta desde otro codIgo o desde una herramIenta de
desarrollo como \*&.9$ A$;$9)8$*. Una vez almacenados pueden ser modIfIcados de
nuevo.
(C4b49* &,-5=%-=53 #& =" <51%&#$:$&"-1
La sIntaxIs es:
&-$4'$ |.- -$O%4&$| O-.&$):-$ nombreProcedImIenLo
=?purumeLro1 =modeIo> LIpoDuLos
=!purumeLroz =modeIo> LIpoDuLos =!<<<>>@>
{*#]4#]
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,(#
seccInDeDecIurucIones
5$6*+
InsLruccIones
|$7&$O'*.+
conLroIDeExcepcIones>
$+);
La opcIon >G@FDEG hace que sI ya exIste un procedImIento con ese nombre, se
reemplaza con el que se crea ahora. Los parmetros son la lIsta de varIables que
necesIta el procedImIento para realIzar su tarea.
Al declarar cada parmetro se IndIca el tIpo de los mIsmos, pero no su tamao; es
decIr seria VARCHAR2 y no VARCHAR2(50).
El apartado opcIonal %)+$9), se elIge sI el parmetro es de tIpo 4X, \]O o 4X \]O
(se explIca ms adelante).
No se utIlIza la palabra AGEFD>G para IndIcar el InIcIo de las declaracIones. No
obstante la seccIon de declaracIones fIgura tras las palabras 4< o D< (es decIr justo antes
del 8ECN es donde debemos declarar las varIables).
(C4b4>* #&,3551881 #& <51%&#$:$&"-1,
Los pasos para desarrollar procedImIentos son:
!%# EscrIbIr el codIgo en un archIvo =!T9 desde cualquIer edItor.
!"# CompIlar el codIgo desde un edItor como "<[Fz@9/! o cualquIer otro que realIce
esa tarea (como #)&+ por ejemplo). El resultado es el llamado .1+"() @I el
procedImIento estar creado.
!$# Ejecutar el procedImIento para realIzar su tarea, eso se puede hacer las veces
que haga falta (en "<[Fz@9/!, el comando que ejecuta un procedImIento es el
comando G`GE]OGI en otros entornos se suele crear un bloque anonImo que
Incorpore una llamada al procedImIento).
(C4b4B* <35K:&-51,
Los procedImIentos permIten utIlIzar parmetros para realIzar su tarea. Por ejemplo
supongamos que queremos crear el procedImIento ESCRllR para escrIbIr en el servIdor
(como hace 0MS_0UTPUT.PUT_LlNE) logIcamente dIcho procedImIento necesIta
saber lo que queremos escrIbIr. Ese seria el parmetro, de esa forma el procedImIento
seria:
&-$4'$ .- -$O%4&$ O-.&$):-$
$NIGFlFG(LexLo 94-&84-)
*#
5$6*+
)5/#C.:'O:'<O:'C%*+$(LexLo);
$+);
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%,)#
Para Invocarle:
5$6*+
...
$NIGFlFG(Hola);
Cuando se Invoca a un procedImIento, sI ste no tIene parmetros, se pueden omItIr los
parntesIs (es decIr la llamada al procedImIento actualzar() se puede hacer
sImplemente escrIbIendo actualzar, sIn parntesIs)
<35K:&-51, NV / <35K:&-51, O_R
Hay tres tIpos de parmetros en PL/SQL:
@&*3%$#*)! 4X= Son los parmetros que en otros lenguajes se denomInan como
parmetros por valor. El procedImIento recIbe una copIa del valor o varIable
que se utIlIza como parmetro al llamar al procedImIento. Estos parmetros
pueden ser: valores lIterales (18 por ejemplo), varIables (v_num por ejemplo)
o expresIones (como v_num+18). A estos parmetros se les puede asIgnar un
valor por defecto.
@&*3%$#*)! \]O= FelacIonados con el paso por varIable de otros lenguajes.
Solo pueden ser varIables y no pueden tener un valor por defecto. Se utIlIzan
para que el procedImIento almacene en ellas algun valor. Es decIr, los
parmetros DUT son varIables sIn declarar que se envian al procedImIento de
modo que sI en el procedImIento cambIan su valor, ese valor permanece en
ellas cuando el procedImIento termIna,
@&*3%$#*)! 4X \]O= Son una mezcla de los dos anterIores. Se trata de varIables
declaradas anterIormente cuyo valor puede ser utIlIzado por el procedImIento
que, adems, puede almacenar un valor en ellas. No se las puede asIgnar un
valor por defecto.
Se pueden especIfIcar estas palabras en la declaracIon del procedImIento (es el modo
del procedImIento). SI no se IndIca modo alguno, se supone que se est utIlIzando N
(que es el que ms se usa).
Ejemplo:
&-$4'$ .- -$O%4&$ O-.&$):-$ consuILurEmpresu
(v_Nombre 94-&84-P, v_C .:' 94-&84-P, v_dIr .:' 94-&84-P)
*#
5$6*+
#$%$&' cII, dIreccIon *+'. v_C, v_dIr
,-./ $/O-$#4#
\8$-$ nombre %*R$ '%']]v_nombre]]'%';
$7&$O'*.+
\8$+ +.C)4'4C,.:+) '8$+
)5/#C.:'O:'<O:'C%*+$('No se enconLruron duLos');
\8$+ '..C/4+DC-.\# '8$+
)5/#C.:'O:'<O:'C%*+$ ('Huy mus de una fila con esos
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,*#
|| datos');
$+)0
El procedImIento consulta las empresas cuyo nombre tenga el texto enviado en
v_nombre, captura los posIbles errores y en caso de que la consulta sea buena
almacena el cIf y la dIreccIon de la empresa en los parmetros v_ClF y v_dr.
La llamada al procedImIento anterIor podria ser:
)$&%4-$
v_c 94-&84-P(o);
v_d 94-&84-P(o);
5$6*+
consuILurEmpresu('Hernundez',v_c,v_d);
)5/#C.:'O:'<O:'C%*+$(v_c);
)5/#C.:'O:'<O:'C%*+$(v_d);
$+);
Las varIables v_c y v_d almacenarn (sI exIste una sola empresa con el texto
Hernndez) el CF y la dIreccIon de la empresa buscada.
Los procedImIentos no pueden leer los valores que posean las varIables DUT, solo
escrIbIr en ellas. SI se necesItan ambas cosas es cuando hay que declararlas con N DUT.
(C4b4C* 215535 <51%&#$:$&"-1,
El comando A>\@ @>\EGA]>G seguIdo del nombre del procedImIento que se elImIna es
el encargado de realIzar esta tarea.
(C4c* ;="%$1"&,
(C4c4)* $"-51#=%%$."
Las funcIones son un tIpo especIal de procedImIento que sIrven para calcular un
determInado valor. Todo lo comentado en el apartado anterIor es vlIdo para las
funcIones, la dIferencIa estrIba !19) en que stas devuelven un valor.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!%,+#
(C4c49* ,$"-3@$,
&-$4'$ |.- -$O%4&$| ,:+&'*.+ nombreuncIn
=?purumeLro1 =modeIo> LIpoDuLos
=!purumeLroz =modeIo> LIpoDuLos =!<<<>>@>
-$':-+ LIpoDeDuLos
*#]4#
seccInDeDecIurucIones
5$6*+
InsLruccIones
|$7&$O'*.+
conLroIDeExcepcIones>
$+);
SI comparamos con la declaracIon de las funcIones, la palabra @>\EGA]>G se modIfIca
por la palabra H]XEO4\X (IndIcando que es una funcIon y no un procedImIento) y
aparece la clusula >GO]>X justo antes de la palabra S que sIrve para IndIcar el tIpo de
datos que poseer el valor retornado por la funcIon.
(C4c4>* =,1 #& ;="%$1"&,
Las funcIones se crean Igual que los procedImIentos y, al Igual que stos, se almacenan
en la base de datos. Toda funcIon ha de devolver un valor, lo cual ImplIca utIlIzar la
InstruccIon >GO]>X seguIda del valor que se devuelve.
Ejemplo:
&-$4'$ .- -$O%4&$ ,:+&'*.+ IWMEGMEJ
(x +:/5$-)
-$':-+ +:/5$-
*#
5$6*+
-$':-+ xx;
$+);
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!%,,#

La 2/0."10 descrIta calcula el cuadrado de un numero. Una llamada podria ser:
5$6*+
)5/#C.:'O:'<O:'C%*+$(IWMEGMEJ(q));
$+);
Las funcIones de PL/SQL se utIlIzan como las funcIones de cualquIer lenguaje
estructurado, se pueden asIgnar a una varIable, utIlIzar para escrIbIr, etc. Adems
dentro de una funcIon se puede Invocar a otra funcIon.
(C4c4B* =-$8$M35 ;="%$1"&, #&,#& G\]
Una ventaja fantstIca de las funcIones es la posIbIlIdad de utIlIzarlas desde una
InstruccIon SQL. Por ejemplo:
&-$4'$ .- -$O%4&$ ,:+&'*.+ precIoMedIo
-$':-+ +:/5$-
*#
v_precIo +:/5$-(11,q);
5$6*+
#$%$&' 496(precIo_venLu) *+'. v_precIo
,-./ O*$;4#;
-$':-+ v_precIo;
$+);
Esta funcIon devuelve el precIo medIo de la tabla de pIezas. Una vez compIlada y
almacenada la funcIon, se puede Invocar desde una InstruccIon SQL cualquIera.
Por ejemplo:
#$%$&' ,-./ O*$;4#
\8$-$ precIoMedIo>precIo_venLu;
Esa consulta obtIene los datos de las pIezas cuyo precIo sea menor que el precIo medIo.
Hay que tener en cuenta que para que las funcIones puedan ser Invocadas desde SQL,
stas tIenen que cumplIr que:
Solo valen funcIones que se hayan almacenado
Solo pueden utIlIzar parmetros de tIpo N
Sus parmetros deben ser de tIpos compatIbles con el lenguaje SQL (no valen
tIpos especifIcos de PL/SQL como V\\FGDX por ejemplo)
El tIpo devuelto debe ser compatIble con SQL
No pueden contener InstruccIones ASF
SI una InstruccIon 0|L modIfIca una determInada tabla, en dIcha InstruccIon no
se puede Invocar a una funcIon que realIce consultas sobre la mIsma tabla
No pueden utIlIzar InstruccIones de transaccIones (E\SS4O, >\FFVDEr,...)
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!"--#
La funcIon no puede Invocar a otra funcIon que se salte alguna de las reglas
anterIores.
(C4c4C* &8$:$"35 ;="%$1"&,
SIntaxIs:
)-.O ,:+&'*.+ nombreuncInW
(C4c4D* 5&%=5,$7$#3#
En PL/SQL la recursIvIdad (el hecho de que una funcIon pueda llamarse a si mIsma) est
permItIda. Este codIgo es vlIdo:
&-$4'$ ,:+&'*.+ ,MIVJGFMU
(n +:/5$-)
*#
5$6*+
*, (n<=1) '8$+
-$':-+ 1
$%#$
-$':-+ n ,MIVJGFMU(n-1);
$+) ;
$+);
(C4c4E* :1,-535 <51%&#$:$&"-1, 38:3%&"3#1,
La vIsta ]<G>i@>\EGA]>G<, contIene una fIla por cada procedImIento o funcIon que
tenga almacenado el usuarIo actual.
(C4)d* <3F=&-&,
(C4)d4)* $"-51#=%%$."
Los paquetes sIrven para agrupar bajo un mIsmo nombre funcIones y procedImIentos.
FacIlItan la modularIzacIon de programas y su mantenImIento.
Los paquetes constan de dos partes:
G!8$."2".&."10= Que sIrve para declarar los elementos de los que consta el
paquete. En esta especIfIcacIon se IndIcan los procedImIentos, funcIones y
varIables 8h,9".)! del paquete (los que se podrn Invocar desde fuera del
paquete). 0e los procedImIentos solo se IndIca su nombre y parmetros (sIn el
cuerpo).
E/$*8)= En la que se especIfIca el funcIonamIento del paquete. Consta de la
defInIcIon de los procedImIentos IndIcados en la especIfIcacIon. Adems se
pueden declarar y defInIr varIables y procedImIentos 8*";&+)! (solo vIsIbles
para el cuerpo del paquete, no se pueden Invocar desde fuera del mIsmo).
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"-%#
Los paquetes se edItan, se compIlan (obtenIendo su codIgo P) y se ejecutan al Igual que
los procedImIentos y funcIones
(C4)d49* %5&3%$." #& <3F=&-&,
ConvIene almacenar la especIfIcacIon y el cuerpo del paquete en dos archIvos de texto
(=!T97 dIstIntos para su posterIor mantenImIento.
&,<&%$;$%3%$."
SIntaxIs:
&-$4'$ |.- -$O%4&$| O4&R46$ nombrePuqueLe
{*#]4#]
vurIubIes, consLunLes, cursores y excepcIones pbIIcus
cubeceru de procedImIenLos y IuncIones
$+) nombrePuqueLe0
Ejemplo:
&-$4'$ .- -$O%4&$ O4&R46$ puqueLe1 *#
v_conL +:/5$- := o;
O-.&$):-$ reseL_conL?v_nuevo_conL +:/5$-@;
,:+&'*.+ devoIver_conL
-$':-+ +:/5$-0
$+) puqueLe1;
0e las funcIones hay que IndIcar sus parmetros y el tIpo de datos que devuelve.
%=&5<1
&-$4'$ |.- -$O%4&$| O4&R46$ 5.)D nombrePuqueLe
*#]4#
vurIubIes, consLunLes, cursores y excepcIones prIvudus
cuerpo de Ios procedImIenLos y IuncIones
$+) nombrePuqueLe0
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!"-"#
Ejemplo:
&-$4'$ .- -$O%4&$ O4&R46$ 5.)D puqueLe1 *#
O-.&$):-$ reseL_conL(v_nuevo_conL +:/5$-)
*#
5$6*+
v_conL:=v_new_conL0
$+) reseL_conL;

,:+&'*.+ devoIver_conL
*#
5$6*+
-$':-+ v_conL0
$+) devoIver_conL;
$+) puqueLe1;
=,1 #& 81, 12?&-1, #&;$"$#1, &" 81, <3F=&-&,
0esde dentro del paquete, para utIlIzar otra funcIon o procedImIento o varIable dentro
del mIsmo paquete, basta con Invocarla por su nombre.
SI queremos utIlIzar un objeto de un paquete, fuera del mIsmo, entonces se
antepone el nombre del paquete a la funcIon. Por ejemplo aquete1.reset_cont(4) (en
el ejemplo anterIor).
Para ejecutar un paquete desde SQL*Plus, se usa la orden G`GE]OG. Por ejemplo:
EXECUTE aquete1.reset_cont(4)
=,1 #& %=5,15&, &" 81, <3F=&-&,
Adems las varIables, en la cabecera del paquete se pueden defInIr cursores. Para ello
se IndIca el nombre del cursor, los parmetros (sI hay) y el tIpo devuelto (normalmente
con >\QOa@G).
En el cuerpo del paquete el cursor se usa como habItualmente. La unIca razon para
declarar un cursor en un paquete, es por sI necesItamos acceder a l desde fuera.
Eso mIsmo ocurre con las varIables, las varIables declaradas en la especIfIcacIon de
un paquete, son accesIbles desde fuera del paquete (habria que Invocarlas escrIbIendo
aquete.varable)
(C4))* -5$++&5,
(C4))4)* $"-51#=%%$."
Se llama #*"(($* (o +"!8&*&+)*7 al codIgo que se ejecuta automtIcamente cuando se
realIza una determInada accIon sobre la base de datos. El codIgo se ejecuta
IndependIentemente de la aplIcacIon que realIzo dIcha operacIon.
0e esta forma tenemos tres tIpos trIggers:
O*"(($*! +$ #&,9&= Se trata de trIggers que se dIsparan cuando ocurre una
accIon 0|L sobre una tabla.
O*"(($*! +$ ;"!#&= Se lanzan cuando ocurre una accIon 0|L sobre una vIsta.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"-$#
O*"(($*! +$ !"!#$%&= Se dIsparan cuando se produce un evento sobre la base de
datos (conexin de un usuario, borrado de un objeto,)
En este manual solo se da cabIda a los del prImer y segundo tIpo. Por lo que se dar
por hecho en todo momento que nos referIremos sIempre a ese tIpo de trIggers.
Los trIggers se utIlIzan para:
Ejecutar accIones relacIonadas con la que dsara el trIgger
CentralIzar operacIones globales
FealIzar tareas admInIstratIvas de forma automtIca
EvItar errores
Crear reglas de IntegrIdad complejas
El codIgo que se lanza con el trIgger es @FY<[F. No es convenIente realIzar excesIvos
trIggers, solo los necesarIos, de otro modo se ralentIza en exceso la base de datos.
(C4))49* %5&3%$." #& -5$++&5,
&8&:&"-1, #& 81, -5$++&5,
Puesto que un trIgger es un codIgo que se dIspara, al crearle se deben IndIcar las
sIguIentes cosas:
!%# El evento que da lugar a la ejecucIon del trIgger (4X<G>OI ]@ADOG o AGFGOG)
!"# Cuando se lanza el evento en relacIon a dIcho evento (VGH\>G (antes)I DHOG>
(despus) o 4X<OGDA \H (en lugar de))
!$# Las veces que el trIgger se ejecuta (tIpo de trIgger: de InstruccIon o de fIla)
!'# El cuerpo del trIgger, es decIr el codIgo que ejecuta dIcho trIgger
%=K"#1 &?&%=-35 &8 -5$++&5
En el apartado anterIor se han IndIcado los posIbles tIempos para que el trIgger se
ejecute. stos pueden ser:
VGH\>G= El codIgo del trIgger se ejecuta antes de ejecutar la InstruccIon 0|L
que causo el lanzamIento del trIgger.
DHOG>= El codIgo del trIgger se ejecuta despus de haber ejecutado la
InstruccIon 0|L que causo el lanzamIento del trIgger.
4X<OGDA \H= El trIgger sustItuye a la operacIon 0|L Se utIlIza para vIstas que
no admIten InstruccIones 0|L.
-$<1, #& -5$++&5
A$ "0!#*/.."10= El cuerpo del trIgger se ejecuta una sola vez por cada evento
que lance el trIgger. Esta es la opcIon por defecto. El codIgo se ejecuta aunque
la InstruccIon 0|L no genere resultados.
A$ 2"9&= El codIgo se ejecuta una vez por cada fIla afectada por el evento. Por
ejemplo sI hay una clusula ]@ADOG que desencadena un trIgger y dIcho
UP0ATE actualIza 10 fIlas; sI el trIgger es de fIla se ejecuta una vez por cada
fIla, sI es de InstruccIon se ejecuta solo una vez.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!"-'#
(C4))4>* ,$"-3@$, #& 83 %5&3%$." #& -5$++&5,
-5$++&5, #& $",-5=%%$."
&-$4'$ |.- -$O%4&$| '-*66$- nombreDeTrIgger
cIuusuIuDeTIempo evenLo1 =.- evenLoz=!<<<>>
.+ LubIu
|)$&%4-$
decIurucIones
|
5$6*+
cuerpo
|$7&$O'*.+
cupLuru de excepcIones
|
$+);
La clusula de tIempo es una de estas palabras: VGH\>G o DHOG>. Por su parte el
evento tIene esta sIntaxIs:
{*+#$-']:O)4'$ |., columna1 [,columna2,]]|)$%$'$]
Los eventos asocIan el trIgger al uso de una InstruccIon 0|L. En el caso de la InstruccIon
]@ADOG, el apartado \H hace que el trIgger se ejecute solo cuando se modIfIque la
columna IndIcada (o columnas sI se utIlIza una lIsta de columnas separada por comas).
En la sIntaxIs del trIgger, el apartado \> permIte asocIar ms de un evento al trIgger (se
puede IndIcar 4X<G>O \> ]@ADOG por ejemplo).
Ejemplo:
&-$4'$ .- -$O%4&$ '-*66$- Ins_personuI
5$,.-$ *+#$-' .+ personuI
5$6*+
*,?'.C&84-(#D#)4'$,HH24) +.' *+ ('1o','11','1z')'8$+
-4*#$C4OO%*&4'*.+C$--.-(-zooo1,'SIo se puede ' ]]
' aadir personal entre las 10 y las 12:59');
$+) *,0
$+);
Este trIgger ImpIde que se puedan aadIr regIstros a la tabla de personal sI no estamos
entre las 10 y las 1J horas.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"-(#
-5$++&5, #& ;$83
SIntaxIs:
&-$4'$ |.- -$O%4&$| '-*66$- nombreDeTrIgger
cIuusuIuDeTIempo evenLo1 =.- evenLoz=!<<<>>
.+ LubIu
|-$,$-$+&*+6 {.%) 4# nombreVIejo ] +$\ 4# nombreNuevo]|
,.- $4&8 -.\ |\8$+ condIcIn|
|\8$+ ?condIcIn@|
=decIurucIones>
cuerpo
La dIferencIa con respecto a los trIggers de InstruccIon est en la linea >GHG>GXE4XU y
en H\> GDEB >\Q. sta ultIma es la que hace que el trIgger sea de fIla, es decIr que se
repIta su ejecucIon por cada fIla afectada en la tabla por la InstruccIon 0|L.
El apartado QBGX permIte colocar una condIcIon que deben de cumplIr los regIstros
para que el trIgger se ejecute. Solo se ejecuta el trIgger para las fIlas que cumplan
dIcha condIcIon.
El apartado >GHG>GXE4XU es el que permIte IndIcar un nombre para los valores
antIguos y otro para los nuevos.
(C4))4B* 5&;&5&"%$3, V`T / O]J
Cuando se ejecutan InstruccIones ]@ADOG, hay que tener en cuenta que se modIfIcan
valores antIguos (\FA) para cambIarles por valores nuevos (XGQ). Las palabras NEW y
DL0 permIten acceder a los valores nuevos y antIguos respectIvamente.
El apartado >GHG>GXE4XU de la creacIon de trIggers, permIte asIgnar nombres a las
palabras XGQ y \FA (en la prctIca no se suele utIlIzar esta posIbIlIdad). Asi
XGQ.nombre haria referencIa al nuevo nombre que se asIgna a una determInada tabla y
\FA.nombre al vIejo.
En el apartado de InstruccIones del trIgger (el 8ECN) hay que adelantar el simbolo
a las palabra NEW y DL0 (serian XGQ.nombre y \FA.nombre)
magInemos que deseamos hacer una audItorIa sobre una tabla en la que tenemos un
lIstado de las pIezas mecnIcas que fabrIca una determInada empresa. Esa tabla es
PEZAS y contIene el tIpo y el modelo de la pIeza (los dos campos forman la clave de la
tabla) y el precIo de venta de la mIsma. 0eseamos almacenar en otra tabla dIferente los
cambIos de precIo que realIzamos a las pIezas, para lo cual creamos la sIguIente tabla:
&-$4'$ '45%$ PEZAS_AUDT(
precIo_vIejo +:/5$-(11,q),
precIo_nuevo +:/5$-(11,q),
LIpo 94-&84-P(z),
modeIo +:/5$-(z),
IecIu )4'$
);
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!"-)#
Como queremos que la tabla se actualIce automtIcamente, creamos el sIguIente
trIgger:
&-$4'$ .- -$O%4&$ '-*66$- creur_uudIL_pIezus
5$,.-$ :O)4'$ ., precIo_venLu
.+ O*$;4#
,.- $4&8 -.\
\8$+ ? .%).precIo_venLu<+$\.precIo_venLu @
5$6*+
*+#$-' *+'. PEZAS_AUDT
94%:$#(p .%).precIo_venLu, p+$\.precIo_venL
p.%).LIpo,:.%).modeIo ,#D#)4'$);
$+)0
Con este trIgger cada vez que se modIfIquen un regIstros de la tabla de pIezas, sIempre
y cuando se est Incrementado el precIo, se aade una nueva fIla por regIstro
modIfIcado en la tabla de adItorias, observar el uso de NEW y de DL0 y el uso de los dos
puntos (:NEW y :DL0) en la seccIon ejecutable.
Cuando se aaden regIstros, los valores de DL0 son todos nulos. Cuando se borran
regIstros, son los valores de NEW los que se borran.
(C4))4C* Ng NVG`YRNVHe Ng _XJURNVH & Ng J`]`RNVH
Son palabras que se utIlIzan para determInar la InstruccIon 0|L que se estaba
realIzando cuando se lanzo el trIgger. Esto se utIlIza en trIggers que se lanza para varIas
operacIones (utIlIzando 4X<G>O \> ]@ADOG por ejemplo). En ese caso se pueden
utIlIzar sentencIas F seguIdas de NSEFTNC, UP0ATNC o 0ELETNC; stas palabras
devolvern O>]G sI se estaba realIzando dIcha operacIon.
&-$4'$ .- -$O%4&$ '-*66$- VGFmmHG^
5$,.-$ *+#$-' .- )$%$'$ .- :O)4'$ ., IMYLJ^ .+ VMlUM
,.- $4&8 -.\
5$6*+
*, )$%$'*+6 '8$+
InsLruccIones que se ejecuLun sI eI LrIgger suIL por borrur IIIus
$%#*, *+#$-'*+6 '8$+
InsLruccIones que se ejecuLun sI eI LrIgger suIL por InserLur IIIus
$%#$
InsLruccIones que se ejecuLun sI eI LrIgger suIL por modIIIcur IIIus
$+) *,
$+)0
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"-*#
(C4))4D* -5$++&5, #& -$<1 NVGR`UJ Og
Hay un tIpo de trIgger especIal que se llama NSTEA0 DF y que solo se utIlIza con las
vIstas. Una vIsta es una consulta SELECT almacenada. En general solo sIrven para
mostrar datos, pero podrian ser Interesantes para actualIzar, por ejemplo en esta
declaracIon de vIsta:
&-$4'$ 9*$\
exIsLencIusCompIeLu(LIpo,modeIo,precIo,
uImucen,cunLIdud) 4#
#$%$&' p.LIpo, p.modeIo, p.precIo_venLu,
e.n_uImucen, e.cunLIdud
,-./ O*$;4# p, $7*#'$+&*4# e
\8$-$ p.LIpo=e.LIpo 4+) p.modeIo=e.modeIo
.-)$- 5D p.LIpo,p.modeIo,e.n_uImucen;
Esta InstruccIon daria lugar a error
*+#$-' *+'. exIsLencIusCompIeLu
94%:$#?'ZA',,q,,zoo@0
ndIcando que esa operacIon no es vlIda en esa vIsta (al utIlIzar dos tablas). Esta
sItuacIon la puede arreglar un trIgger que Inserte prImero en la tabla de pIezas (solo sI
no se encuentra ya Insertada esa pIeza) y luego Inserte en exIstencIas.
Eso lo realIza el trIgger de tIpo 4X<OGDA \H, que sustItuIr el NSEFT orIgInal por el
codIgo IndIcado por el trIgger:
&-$4'$ .- -$O%4&$ '-*66$- Ins_pIezus_exIs
*+#'$4) ., *+#$-'
.+ exIsLencIuscompIeLu
5$6*+
*+#$-' *+'. pIezus(LIpo,modeIo,precIo_venLu)
94%:$#(p+$\.LIpo,p+$\.modeIo!p+$\.precIo);
*+#$-' *+'. exIsLencIus(LIpo,modeIo,n_uImucen,cunLIdud)
94%:$#(p+$\.LIpo,p+$\<modeIo,
p+$\.uImucen!p+$\.cunLIdud);
$+)0
Este trIgger permIte aadIr a esa vIsta aadIendo los campos necesarIos en las tablas
relacIonadas en la vIsta. Se podria modIfIcar el trIgger para permItIr actualIzar, elImInar
o borrar datos dIrectamente desde la vIsta y asi cualquIer desde cualquIer acceso a la
base de datos se utIlIzaria esa vIsta como sI fuera una tabla ms.
($!#"10 +$ ,&!$! +$ +&#)!
5/0"+&+ P7 PL/SQL
!"-+#
(C4))4E* 3#:$"$,-53%$." #& -5$++&5,
&8$:$"35 -5$++&5,
SIntaxIs:
)-.O '-*66$- nombreTrIggerW
#&,3%-$735 =" -5$++&5
4%'$- '-*66$- nombreTrIgger )*#45%$0
3%-$735 =" -5$++&5
4%'$- '-*66$- nombreTrIgger $+45%$0
#&,3%-$735 1 3%-$735 -1#1, 81, -5$++&5, #& ="3 -3283
Eso permIte en una sola InstruccIon operar con todos los trIggers relacIonados con una
determInada tabla (es decIr actua sobre los trIggers que tIenen dIcha tabla en el
apartado DN del trIgger). SIntaxIs:
4%'$- '45%$ nombreTubIu 1)*#45%$ 2 $+45%$3 4%% '-*66$-#0
(C4))4b* 5&,-5$%%$1"&, #& 81, -5$++&5,
Un trIgger no puede utIlIzar nInguna operacIon de transaccIones (E\SS4O,
>\FFVDEr, <DlG@\4XO o <GO O>DX<DEO4\X)
No puede llamar a nInguna funcIon o procedImIento que utIlIce operacIones de
transaccIones
No se pueden declarar varIables F\XU o F\XU >DQ= Las referencIas XGQ y
\FA no pueden hacer referencIa a campos de estos tIpos de una tabla
No se pueden modIfIcar (aunque si leer y hacer referencIa) campos de tIpo F\V
de una tabla
(C4))4c* 15#&" #& &?&%=%$." #& 81, -5$++&5,
Puesto que sobre una mIsma tabla puede haber varIos trIggers, es necesarIo conocer en
qu orden se ejecutan los mIsmos. El orden es:
!'# PrImero dIsparadores de tIpo VGH\>G de tIpo InstruccIon
!(# 0Isparadores de tIpo VGH\>G por cada fIla
!)# Se ejecuta la propIa orden que desencadeno al trIgger.
!*# 0Isparadores de tIpo DHOG> con nIvel de fIla.
!+# 0Isparadores de tIpo DHOG> con nIvel de InstruccIon.
-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"-,#
(C4))4)d* <5128&:3, %1" 83, -3283, :=-3"-&,
Una tabla mutante es una tabla que se est modIfIcando debIdo a una InstruccIon 0|L.
En el caso de un trIgger es la tabla a la que se refIere el dIsparador en la clusula \X.
Un dIsparador no puede leer o modIfIcar una tabla mutante (una tabla que est
cambIando) nI tampoco leer o modIfIcar una columna que tIene restrIccIones asocIadas
a una tabla mutante (si se podrian utIlIzar y modIfIcar el resto de columnas). Es decIr,
no podemos hacer consultas nI InstruccIones 0|L sobre una tabla sobre la que ya se ha
comenzado a modIfIcar, Insertar o elImInar datos.
En realIdad !19) 9)! #*"(($*! +$ 2"9& no pueden acceder a tablas mutantes, los
trIggers de tabla si pueden. Por ello la solucIon al problema suele ser combInar trIggers
de tabla con trIggers de fIla (conocIendo el orden de ejecucIon de los trIggers).
El truco consIste en que los trIggers de tabla almacenan los valores que se desean
cambIar dentro de una tabla preparada al efecto o dentro de varIables de paquete
(accesIbles desde cualquIer trIgger sI se crea dentro de dIcho paquete o sI el paquete es
global).

!"%%#

2$28$1+53;!3
40#*)+/.."10 & 9)! <"!#$%&! +$ V&!$! +$ A&#)! 5W G+"."107
C. J. 0ate
PrentIce Hall, 2001
H/0+&%$0#)! N %)+$9)! +$ V&!$! +$ A&#)!
AdoracIon de |Iguel
|arIo PIattInI
rama, 1999
A&#&,&!$ +$!"(0I f0)C "# &99
7arIos autores
ElsevIer, 2009
A&#&,&!$ %)+$99"0( &0+ +$!"(0
Toby Teory
Sam LIghtstone
Tom Nadeau
|organ Kaufman, 2006
A&#&,&!$ %)+$99"0( &0+ +$!"(0
Toby Teory
|organ Kaufman, 1999
V$("00"0( A&#&,&!$ A$!"(0 H*)% X);".$ #) @*)2$!!")0&9
Clare Churchel
Apress, 2007
V$("00"0( A&#&,&!$ A$!"(0
CavIn Powell
Wrox, 2006
A"!$Z) .)0.$8#/&9 +$ V&!$! +$ A&#)!
Carlo 8atInI
Stefano CerI
Shamkant Navathe
AddIson Wesley, 1994
G9 %)+$9) *$9&.")0&9 +$ +&#)!
Covadonga Fernndez
($!#"10 +$ ,&!$! +$ +&#)!
,",9")(*&2?&
!"%"#
EdIcIones 0iaz de Santos, 1987
<"!#$%&! U$!#)*$! +$ V&!$! +$ A&#)!
CregorIo Cabrera Snchez
ParanInfo, 2001
<"!#$%&! U$!#)*$! +$ V&!$! +$ A&#)!
|aria Jesus Famos
AlIcIa Famos
Fernando |ontero
|ac Craw HIll, 2006
\*&.9$ _"
|Iachel Abbey
|Ike Corey
an Abramson
Dracle Press, |ac Craw HIll, 2002
\*&.9$ _"I S&0/&9 +$ >$2$*$0."&
KevIn Loney
Ceorge Koch
Dracle Press, |ac Craw HIll, 200J
\*&.9$ _"I @*)(*&%&."10 @FY<[F
Scott Urman
Dracle Press, |ac Craw HIll, 2002
\*&.9$ A&#&,&!$ 66(= <[F
Jason PrIce
Dracle Press, |ac Craw HIll, 2009
\ED= \*&.9$ 66(= \*&.9$ <[F H/0+&%$0#&9!= GL&% U/"+$
John Watson
Fupert Famklass
Dracle Press, |ac Craw HIll, 2008
\*&.9$ 66(= O:$ E)%89$#$ *$2$*$0.$
KevIn Loney
Scott Cosset
Sreekanth ChIntala
Dracle Press, |ac Craw HIll, 2009
\*&.9$ 66( >SDX= V&.f/8 &0+ >$.);$*N
Fobert C Freeman
|athew Hart
Dracle Press, |ac Craw HIll, 2011


-
)
./*!) +$ &+%"0"!#*&."10 +$ !"!#$%&! "02)*%3#".)! $0 *$+
autor: Jorge Snchez www.jorgesanchez.net

!"%$#

!"%(#

!"#$%& #&
$8=,-53%$1"&,
||u:troc|n I, jem|o de f|chero de occe:o d|recto........................................................................................... I2
||u:troc|n 2, ejem|o de f|chero :ecuenc|o| encodenodo. Lo: untero: |e recorren or |o c|oue ........ I1
||u:troc|n 1, ejem|o de f|chero :ecuenc|o| |ndexodo .................................................................................... I4
||u:troc|n 4, jem|o de orch|uo :ecuenc|o| |ndexodo y encodenodo ....................................................... Is
||u:troc|n s, 5|:temo: de |nformoc|n or|entodo: o| roce:o ....................................................................... I1
||u:troc|n , 5|:temo: de |nformoc|n or|entodo: o doto: ............................................................................ Is
||u:troc|n 1, :quemo de| func|onom|ento y ut|||dod de un :|:temo qe:tor de bo:e: de doto: .......... I9
||u:troc|n s, Mode|o de referenc|o de |o: foc|||dode: de u:uor|o ............................................................... 21
||u:troc|n 9, :quemo de| func|onom|ento de un 5CD ............................................................................. 24
||u:troc|n IO, Re|oc|n entre |o: orqon|:mo: de e:tondor|zoc|n ................................................................21
||u:troc|n II, N|ue|e: en e| mode|o AN5| ........................................................................................................... 2s
||u:troc|n I2, Arqu|tecturo AN5|, ex||coc|n c|:|co de| func|onom|ento ............................................... 29
||u:troc|n I1, Mode|o: de doto: ut|||zodo: en e| de:orro||o de uno D ...................................................... 1I
||u:troc|n I4, jem|o de e:quemo jerrqu|co ................................................................................................ 11
||u:troc|n Is, ejem|o de d|oqromo de e:tructuro de doto: Codo:y| ....................................................... 11
||u:troc|n I, jem|o: de ent|dod y conjunto de ent|dod .......................................................................... 1
||u:troc|n I1, Rere:entoc|n de |o ent|dod er:ono .................................................................................... 1
||u:troc|n Is, nt|dod db|| ................................................................................................................................... 11
||u:troc|n I9, ejem|o de re|oc|n ........................................................................................................................ 11
||u:troc|n 2O, 1|o: de re|oc|one: ........................................................................................................................1s
||u:troc|n 2I, Cord|no||dode:. .............................................................................................................................. 19
||u:troc|n 22, jem|o de ro|................................................................................................................................ 19
||u:troc|n 21, Atr|buto:.......................................................................................................................................... 4O
||u:troc|n 24, Re|oc|n |5A. .................................................................................................................................. 42
||u:troc|n 2s, jem|o de re|oc|n |5A .............................................................................................................. 42
||u:troc|n 2, Re|oc|n de herenc|o, |o c|oue de |o :uerent|dod e: c|oue de |o: :ubent|dode:. ...... 41
||u:troc|n 21, Lo c|oue de |o :uerent|dod no e: c|oue de |o: :ubent|dode:. .......................................... 41
||u:troc|n 2s, Re|oc|n |5A con ob||qotor|edod ............................................................................................... 44
||u:troc|n 29, 1|o: de re|oc|one: |5A ................................................................................................................ 4
||u:troc|n 1O, Re|oc|n cond|doto o ent|dod db|| ........................................................................................ 4
||u:troc|n 1I, nt|dod db|| re|oc|onodo con :u ent|dod fuerte ................................................................. 41
||u:troc|n 12, jem|o de c|oue :ecundor|o ..................................................................................................... ss
||u:troc|n 11,1ron:formoc|n de uno ent|dod fuerte o| e:quemo re|oc|ono| ......................................... O
!"!#$%&! ($!#)*$! +$ ,&!$! +$ +&#)!
?0+".$ +$ "9/!#*&.")0$!
!"%)#
||u:troc|n 14, 1ron:formoc|n de uno re|oc|n n o n .................................................................................... I
||u:troc|n 1s, 1ron:formoc|n en e| mode|o re|oc|ono| de uno ent|dod n-or|o ...................................... I
||u:troc|n 1, 1ron:formoc|n de uno re|oc|n uno o uor|o:....................................................................... 2
||u:troc|n 11, Lo: do: :o|uc|one: u||do: o |o cord|no||dod I o .................................................................... 1
||u:troc|n 1s, 5o|uc|n o |o re|oc|n O o I ......................................................................................................... 1
||u:troc|n 19, o:o o re|oc|ono| de re|oc|one: cero o cero ........................................................................... 4
||u:troc|n 4O, 1ron:formoc|n de re|oc|one: recur:|uo: en e| mode|o re|oc|ono| ................................... 4
||u:troc|n 4I, Ab:trocc|n oro foc|||tor |o conuer:|n de re|oc|one: recur:|uo: ..................................... s
||u:troc|n 42, tron:formoc|n de ent|dode: db||e: en e| mode|o re|oc|ono| .......................................... s
||u:troc|n 41, roce:o de tron:formoc|n de re|oc|one: |5A. .......................................................................
||u:troc|n 44, D|oqromo e:t||o oto de qo||o .................................................................................................. s
||u:troc|n 4s, :quemo re|oc|ono| com|eto de |o bo:e de doto: de un V|deo C|ub ........................... 9
||u:troc|n 4, :quemo re|oc|ono| de| o|mocn :equn e| roqromo V|:|o de M|cro:oft ....................... 1O

S-ar putea să vă placă și