Documente Academic
Documente Profesional
Documente Cultură
W i n d o w s ) Para d e s c a r g a r el m i s m o d e b e m o s i n g r e s a r a l s i t i o d e O r a c l e :
1 . Oracle 1 Og XE
"Accept L i c e n s e A g r e e m e n t " .
( U n i v e r s a l ) " ( O r a c l e X E U n i v . e x e ( 2 1 6 , 9 3 3 , 3 7 2 bytes))
Oracle.
Ora e l e .
Ejecutamos el a r c h i v o q u e a c a b a m o s de d e s c a r g a r : O r a c l e X E U n i v . e x e
i m p o rt a n t e no o l v i d a r d i c h a c l a v e .
O r a c l e en nuestro e q u i p o .
Developer
( J D K 1 . 5 . 0 _ 0 6 is b u n d l e d i n t h i s z i p )
sqldeveloper.exe
2 - Crear tablas (create t a b l e - describe -
all_tables - d r o p t a b l e )
s e c u e n c i a s , í n d i c e s , a g r u p a m i e n t o s ( clusters ) , d i s p a r a d o r e s (triggers ) , i n s t a n t a n e a s
( s n a p s h o t s ) , p r o c e d i m i e n t o s , f u n c i o n e s , p a q u e t e s , s i n ó n i m o s , u s u a r i o s , p e rf i l e s ,
p r i v i l e g i o s , r o l e s , etc.
almacenamiento.
d e b e t e n e r u n n o m b r e . E l n o m b r e d e l c a m p o hace referencia a la i n f o r m a c i ó n q u e
almacenará.
C a d a c a m p o ( c o l u m n a ) t a m b i é n d e b e d e f i n i r el t i p o de dato q u e a l m a c e n a r á .
NOMBRECAMPOl TIPODEDATO,
NOMBRECAMPON TIPODEDATO
) ;
accederemos a e l l a .
tipos:
create table usuarios(
nombre varchar2(30),
clave varchar2(10)
) ;
último.
C u a n d o se crea u n a t a b l a d e b e m o s i n d i c a r s u n o m b r e y d e f i n i r a l m e n o s u n c a m p o
a l m a c e n a r á el n o m b r e de u s u a r i o y
usuario.
e s p a c i o s . La l o n g i t u d m á x i m a es de 30 caracteres.
objeto y l a s e n t e n c i a no se ejecutará.
la tabla:
describe usuarios;
Aparece l a s i g u i e n t e i n f o r m a c i ó n :
NOMBRE VARCHAR2(30)
CLAVE VARCHAR2(10)
E n el s i g u i e n t e e j e m p l o e l i m i n a m o s l a t a b l a " u s u a r i o s " :
i n d i c a n d o tal s i t u a c i ó n y l a s e n t e n c i a n o se ejecuta.
3 - I n g r e s a r registros ( i n s e r t i n t o - se l e ct)
de los c a m p o s .
La s i n t a x i s básica y g e n e r a l es la s i g u i e n t e :
U s a m o s " i n s e rt i n t o " , l u e g o e l n o m b r e d e l a t a b l a , d e t a l l a m o s l o s n o m b r e s d e l o s
comas.
ingresados.
c o l o c a n entre c o m i l l a s s i m p l e s .
a p a r e c e r í a n s o l a m e n t e l o s c a m p o s y la t a b l a v a c í a ) .
Es i m p o rt a n t e i n g r e s a r l o s valores en el m i s m o orden en q u e se n o m b r a n l o s
c a m p o s : E n el s i g u i e n t e e j e m p l o se l i s t a p r i m e r o el c a m p o "clave" y l u e g o el c a m p o
E n el s i g u i e n t e e j e m p l o se c o l o c a n l o s valores en d i s t i n t o orden en q u e se n o m b r a n
Ya e x p l i c a m o s q u e a l crear u n a t a b l a d e b e m o s resolver q u é c a m p o s ( c o l u m n a s )
caracteres, n ú m e r o s , etc.
con m á s d e t a l l e ) :
• - v a r c h a r 2 : se e m p l e a para a l m a c e n a r c a d e n a s de caracteres. U n a c a d e n a es
v a r i a b l e e n l a c u a l d e t e r m i n a m o s el m á x i m o de caracteres entre p a r é n t e s i s .
paréntesis, j u n t o a l n o m b r e d e l c a m p o c o l o c a m o s la l o n g i t u d .
S i i n t e n t a m o s a l m a c e n a r u n a c a d e n a d e caracteres de mayor l o n g i t u d q u e la
s e n t e n c i a no se ejecuta.
Por e j e m p l o , si d e f i n i m o s u n c a m p o de t i p o varchar(1 O ) e i n t e n t a m o s a l m a c e n a r
d e m a s i a d o g r a n d e para la c o l u m n a .
x 1 0 - 1 2 0 a 9 . 9 . . . (38 p o s i c i o n e s ) . D e f i n i m o s c a m p o s de este t i p o c u a n d o
"s" especifica l a e s c a l a , es d e c i r , el m á x i m o d e d í g i t o s d e c i m a l e s . P o r e j e m p l o ,
9 9 9 . 99 (positivo o n e g a t i v o ) .
S i i n t e n t a m o s a l m a c e n a r u n v a l o r mayor fuera d e l r a n g o p e r m i t i d o al d e f i n i r l o ,
no se ejecuta.
Por e j e m p l o , si d e f i n i m o s u n c a m p o de t i p o n u m b e r ( 4 , 2 ) e i n t e n t a m o s g u a r d a r el
v a l o r 1 2 3 . 4 5 , aparece u n mensaje i n d i c a n d o q u e el v a l o r es d e m a s i a d o g r a n d e
para l a c o l u m n a . S i i n g r e s a m o s u n v a l o r con m á s d e c i m a l e s q u e l o s d e f i n i d o s ,
sobrantes se o m i t e n .
Antes de crear u n a t a b l a d e b e m o s p e n s a r en s u s c a m p o s y optar por el t i p o de dato
a d e c u a d o para cada u n o de e l l o s .
Por e j e m p l o , si en u n c a m p o a l m a c e n a r e m o s n ú m e r o s telefónicos o u n n ú m e r o s de
r e a l i z a m o s o p e r a c i o n e s m a t e m á t i c a s . S i en u n c a m p o g u a r d a r e m o s a p e l l i d o s , y
s u p o n e m o s q u e n i n g ú n a p e l l i d o superará l o s 20 caracteres, d e f i n i m o s el c a m p o
instrucción "select".
La s i n t a x i s básica y g e n e r a l es la s i g u i e n t e :
P o d e m o s especificar el n o m b r e de l o s c a m p o s q u e q u e r e m o s ver, s e p a r á n d o l o s p o r
comas:
H e m o s a p r e n d i d o a s e l e c c i o n a r a l g u n o s campos de u n a t a b l a .
l u e g o de e l l a , l a c o n d i c i ó n :
from usuarios
where nombre='Marcelo';
La s i n t a x i s b á s i c a y g e n e r a l es la s i g u i e n t e :
from NOMBRETABLA
where CONDICION;
a d e l a n t e en d e t a l l e ) . E l s i g n o i g u a l ( = ) es u n operador r e l a c i o n a l . Para la s i g u i e n t e
select nombre,clave
from usuarios
where clave='River';
n i n g ú n registro.
select nombre
from usuarios
where clave='River';
i g u a l a "River".
7 - Operadores r e l a c i o n a l e s
c o n c a t e n a r c a d e n a s , hacer c o m p a r a c i o n e s .
O r a c l e reconoce de 4 t i p o s de o p e r a d o r e s :
1) relacionales (o de comparación)
2) aritméticos
3) de concatenación
4) lógicos
u n a t a b l a ; por e j e m p l o :
where autor='Borges';
U t i l i z a m o s el o p e r a d o r r e l a c i o n a l de i g u a l d a d .
= igual
<> distinto
> mayor
< menor
usamos l a c o n d i c i ó n :
where autor<>'Borges';
from libros
where precio>20;
where precio<=30;
c o m p r o b a r si u n c a m p o c u m p l e con u n a c o n d i c i ó n .
Sintaxis básica:
t a b l a de l a c u a l q u e r e m o s e l i m i n a r l o s registros. E n el s i g u i e n t e e j e m p l o se e l i m i n a n
d e l e t e from u s u a r i o s ;
borrar.
where nombre='Marcelo';
c u m p l e con l a c o n d i c i ó n e s p e c i f i c a d a , aparecerá u n m e n s a j e i n d i c a n d o q u e n i n g ú n
de l a t a b l a e s p e c i f i c a d a .
9 - A c t u a l i z a r registros ( u p d a t e )
D e c i m o s q u e a c t u a l i z a m o s u n registro c u a n d o m o d i f i c a m o s a l g u n o de s u s valores.
(actualizar).
Sintaxis básica:
y su nuevo valor.
where nombre='Federicolopez';
También p o d e m o s a c t u a l i z a r varios c a m p o s en u n a s o l a i n s t r u c c i ó n :
where nombre='Marcelo';
ejecuta.
s e g u i d o de u n a barra (*/)
/*mostramos títulos y
from libros;
E n c o n t r a p o s i c i ó n , t e n e m o s c a m p o s q u e no p u e d e n estar vacíos j a m á s .
especificar q u e t a l e s c a m p o s no a d m i t a n valores n u l o s :
precio number(S,2)
) ;
l u e g o de l a d e f i n i c i ó n d e l c a m p o .
e s p a c i o s en b l a n c o (" " ) .
conocemos el valor.
También p o d e m o s colocar " n u l l " e n el c a m p o " e d i t o r i a l " si d e s c o n o c e m o s el n o m b r e
de l a e d i t o r i a l a l a c u a l pertenece el l i b r o q u e vamos a i n g r e s a r :
i n g r e s a m o s u n a c a d e n a v a c í a , se a l m a c e n a el v a l o r " n u l l " .
i n s e r c i ó n no se r e a l i z a ; por e j e m p l o :
si los p e r m i t a .
es n u l l ) .
es n u l l ) .
C o n l a s i g u i e n t e s e n t e n c i a recuperamos l o s l i b r o s q u e c o n t i e n e n v a l o r n u l o e n el
campo "editorial":
Las s i g u i e n t e s s e n t e n c i a s t e n d r á n u n a s a l i d a diferente:
e s p a c i o s en b l a n c o .
tabla.
l u e g o q u e ha s i d o c r e a d a . Vamos a a p r e n d e r a e s t a b l e c e r l a al crear l a t a b l a . N o
existe u n a ú n i c a m a n e r a d e h a c e r l o , p o r a h o r a veremos l a s i n t a x i s m á s s e n c i l l a .
Tenemos nuestra t a b l a " u s u a r i o s " d e f i n i d a con 2 campos ( " n o m b r e " y " c l a v e " ) .
La s i n t a x i s básica y g e n e r a l es la s i g u i e n t e :
CAMPO TIPO,
. . . ,
CAMPO TIPO,
) ;
p a r é n t e s i s , el n o m b r e d e l c a m p o q u e será clave p r i m a r i a .
nombre varchar2(20),
clave varchar2(10),
primary key(nombre)
) ;
U n a t a b l a s ó l o p u e d e t e n e r u n a clave p r i m a r i a . C u a l q u i e r c a m p o ( de c u a l q u i e r t i p o )
n i s e a n n u l o s . P o r e l l o , a l d e f i n i r u n c a m p o como clave p r i m a r i a , a u t o m á t i c a m e n t e
O r a c l e l o c o n v i e rt e a "not n u l l " .
L u e g o de h a b e r e s t a b l e c i d o u n c a m p o como clave p r i m a r i a , al i n g r e s a r los registros,
a c t u a l i z a c i ó n no se r e a l i z a .
siguiente consulta:
join user_constraints uc
uc.table_name='USUARIOS';
N o e x p l i c a r e m o s l a c o n s u l t a a n t e r i o r por el m o m e n t o , s ó l o l a ejecutaremos; si la
p r i m a r i a . E l n o m b r e d e l a t a b l a D E B E i r en m a y ú s c u l a s , s i n o Oracle no la encontrará.
1 4 - Vaciar la t a b l a (truncate t a b l e )
condición "where".
Sintaxis:
estructura d e l a t a b l a .
registros es m u y g r a n d e ) .
1 5 - Tipos de datos a l f a n u m é r i c o s
Las c a d e n a s se c o l o c a n entre c o m i l l a s s i m p l e s .
P o d e m o s a l m a c e n a r letras, s í m b o l o s y d í g i t o s con l o s q u e no se r e a l i z a n
o p e r a c i o n e s m a t e m á t i c a s , por e j e m p l o , c ó d i g o s de i d e n t i f i c a c i ó n , n ú m e r o s de
d o c u m e n t o s , n ú m e r o s telefónicos. Tenemos l o s s i g u i e n t e s t i p o s :
si l a l o n g i t u d es i n v a r i a b l e , es c o n v e n i e n t e u t i l i z a r el t i p o c h a r ; caso contrario, el t i p o
varchar2.
2 ) v a r c h a r 2 ( x ) : a l m a c e n a c a d e n a s de caracteres d e l o n g i t u d v a r i a b l e d e t e r m i n a d a por
el a r g u m e n t o "x" ( o b l i g a t o r i o ) . Q u e sea u n a c a d e n a d e l o n g i t u d v a r i a b l e s i g n i f i c a q u e ,
S u r a n g o es de 1 a 4000 caracteres.
caracter.
5 y 6 ) varchar(x) y c h a r 2 ( x ) : d i s p o n i b l e s en O r a c l e 8 .
7 ) l o n g : g u a r d a caracteres d e l o n g i t u d v a r i a b l e ; p u e d e c o n t e n e r hasta 2 0 0 0 0 0 0 0 0 0
c a n t i d a d e s de datos a l f a n u m é r i c o s .
E n g e n e r a l se u s a r á n l o s 2 p r i m e r o s .
S i i n t e n t a m o s a l m a c e n a r en u n c a m p o a l f a n u m é r i c o u n a c a d e n a de caracteres de
d e m a s i a d o g r a n d e y l a s e n t e n c i a no se ejecuta.
Por e j e m p l o , si d e f i n i m o s u n c a m p o de t i p o v a r c h a r 2 ( 1 O ) y l e a s i g n a m o s la cadena
S i i n g r e s a m o s u n v a l o r n u m é r i c o ( o m i t i e n d o l a s c o m i l l a s ) , l o convierte a cadena y l o
i n g r e s a como t a l .
Por e j e m p l o , si en u n c a m p o d e f i n i d o como v a r c h a r 2 ( 5 ) i n g r e s a m o s el v a l o r 1 2 3 4 5 , lo
Es i m p o rt a n t e e l e g i r el t i p o d e dato a d e c u a d o s e g ú n el caso.
t e n d r á n l a m i s m a l o n g i t u d en u n c a m p o d e t e r m i n a d o , se e m p l e a "varchar2" e n l u g a r
de " c h a r " .
t e n d r á n l a m i s m a l o n g i t u d en u n c a m p o d e t e r m i n a d o , se e m p l e a " c h a r " .
s e p a r a d o r de d e c i m a l e s .
t i p o c u a n d o q u e r e m o s a l m a c e n a r valores n u m é r i c o s con l o s c u a l e s l u e g o
O.
999.99.
O.
ejecuta.
l a c o l u m n a . S i i n g r e s a m o s u n v a l o r con m á s d e c i m a l e s q u e l o s d e f i n i d o s , el v a l o r se
Para a m b o s tipos n u m é r i c o s :
- si i n t e n t a m o s i n g r e s a r u n v a l o r fuera d e r a n g o , no l o acepta.
- si i n g r e s a m o s u n a c a d e n a , Oracle i n t e n t a c o n v e rt i r l a a v a l o r n u m é r i c o , s i d i c h a
l a s e n t e n c i a . S i l a c a d e n a c o n t i e n e caracteres q u e Oracle no p u e d e c o n v e rt i r a v a l o r
los campos.
Por e j e m p l o , si t e n e m o s creada la t a b l a " l i b r o s " con los campos " t i t u l o " , "autor" y
e x p l i c i t a d o u n valor.
Al i n g r e s a r registros d e b e m o s tener en c u e n t a :
v a l o r por defecto o p r e d e t e r m i n a d o .
editorial varchar2(20),
precio number(S,2),
) ;
E n t o n c e s , si a l d e f i n i r el c a m p o e x p l i c i t a m o s u n v a l o r m e d i a n t e l a c l á u s u l a " d e f a u l t " ,
mensaje de error.
select column_name,nullable,data_default
por defecto:
predeterminado;
U n c a m p o s ó l o p u e d e t e n e r u n v a l o r p o r defecto. U n a t a b l a p u e d e t e n e r todos s u s
q u e no a d m i t a valores n u l o s , p u e d e o no a d m i t i r l o s .
error i n d i c a n d o q u e se intenta d u p l i c a r l a c l a v e .
1 9 - Operadores aritméticos y de
concatenación ( c o l u m n a s calculadas)
operaciones.
D i j i m o s q u e O r a c l e t i e n e 4 tipos de o p e r a d o r e s : 1 ) r e l a c i o n a l e s o de c o m p a r a c i ó n ( l o s
v i m o s ) , 2 ) a r i t m é t i c o s , 3 ) de c o n c a t e n a c i ó n y 4 ) l ó g i c o s ( l o veremos m á s a d e l a n t e ) .
Es p o s i b l e o b t e n e r s a l i d a s en l a s c u a l e s u n a c o l u m n a sea el resultado d e u n c á l c u l o
y no u n c a m p o d e u n a t a b l a .
sentencia:
select titulo,precio,cantidad
from libros;
c á l c u l o y l o i n c l u y a en u n a c o l u m n a extra en l a s a l i d a :
precio*cantidad
from libros;
en l a s e n t e n c i a l o s s i g u i e n t e s c á l c u l o s :
select titulo,precio,
precio-(precio*0.1)
from libros;
Para c o n c a t e n a r el t í t u l o y el a u t o r de cada l i b r o u s a m o s el o p e r a d o r de
from libros;
Note q u e c o n c a t e n a m o s a d e m á s u n g u i ó n para separar los c a m p o s .
O r a c l e p u e d e c o n v e rt i r a u t o m á t i c a m e n t e valores n u m é r i c o s a c a d e n a s para u n a
from libros;
20 - A l i a s ( e n c a b e z a d o s de c o l u m n a s )
siguiente manera:
select titulo,
cantidad as stock,
precio
from libros;
select titulo,
precio
from libros;
select titulo,precio,
precio*0.1 as descuento,
precio-(precio*0.1) as "preciofinal"
from libros;
caracteres:
Ejemplo:
cada palabra en m a y ú s c u l a . E j e m p l o :
en i n g l é s . E j e m p l o :
1 1 1 1 •
e s p a c i o s ) ; el r e l l e n o c o m i e n z a desde la i z q u i e r d a . E j e m p l o s :
c o m i e n z o ; si se o m i t e e l s e g u n d o a r g u m e n t o , se e l i m i n a n los e s p a c i o s . E j e m p l o :
select ltrim(' es la casa de la cuadra', ' l a ' ) from dual;-- no elimina ningún caracter
Ejemplo:
select rtrim('la casa lila', ' l a ' ) from dual;-- 'la casa li'
select rtrim('la casa lila ' , ' l a ' ) from dual;-- no borra ningún caracter
select rtrim('la casa lila ' ) from dual; - - ' l a casa lila'
s i g n i f i c a recortar. E j e m p l o :
de r e e m p l a z o ( s u b c a d e 2 ) por l a s u b c a d e n a a reemplazar ( s u b c a e 1 ) . E j e m p l o :
retorna "www.oracle.com'.
en i n g l é s . E j e m p l o :
Ejemplos:
diferencia con " r e p l a c e " es q u e a q u e l l a trabaja con cadenas d e caracteres y reemplaza u n a cadena
s i g u i e n t e e j e m p l o se especifica q u e se r e e m p l a c e n todos los caracteres "O" por el caracter " O " , todos
los caracteres " S " por el caracter "5" y todos los caracteres " G " por " 6 " :
select translate('JORGE LUIS BORGES', 'OSG', ' 0 5 6 ' ) f ro m dual;--'J0R6E LUIS B0R6ES'
caracter.
23 - Funciones de fechas y horas
Oracle d i s p o n e de varias funciones q u e operan con tipos de datos "date". Estas son a l g u n a s :
fecha e n v i a d a tal cantidad de meses; si es negativo, se le resta a la fecha e n viada tal cantidad de meses. E j e m p l o :
select add_months('30/01/2007',1) from dual;-- retorna "25/02/07" ya que es el último día de ese mes
- months_between(f1 ,f2): retorna el numero de meses entre las fechas enviadas como argumento. E j e m p l o :
- next_day(fecha,dia): retorna u n a fecha correspondiente al primer día especificado en "dia" lue go de la fecha
Retorna: 10/08/07 0 9 : 5 9 : 4 4 , 1 0 9 0 0 0 0 0 0 A M E R I C A/ B U E N O S _ A I R E S
Retorna 10/08/07 1 0 : 3 3 : 4 8 , 9 8 4 0 0 0 0 0 0 - 0 3 : 0 0
select to_date ('05-SEP-2007 10:00 A M ' , ' D D - M O N - YY Y Y HH:MI AM') from dual;
Retorna 05/09/07
- extract(parte,fecha): retorna la parte (especificada por el primer a r g u m e n t o ) de u n a fecha. Puede extraer el a ñ o (year),
En Oracle: Los operadores a r i t m é t i c o s " + " (má s) y " - " (menos) pueden emplearse con fechas. Por ejemplos:
select sysdate-3:
Retorna 1 0 / 1 2 / 0 7
24 - O r d e n a r registros ( o r d e r by)
La s i n t a x i s básica es l a s i g u i e n t e :
arder by CAMPO;
arder by titulo;
"precio":
select titulo,autor,precio
S i c o l o c a m o s u n n ú m e r o mayor a l a c a n t i d a d de c a m p o s de la l i s t a de s e l e c c i ó n ,
Por defecto, si no a c l a r a m o s en la s e n t e n c i a , l o s o r d e n a de m a n e r a a s c e n d e n t e ( de
select *libros
arder by titulo,editorial;
i n m e d i a t a m e n t e anterior.
Es p o s i b l e o r d e n a r por u n c a m p o q u e no se lista en la selección i n c l u s o por c o l u m n a s
calculados.
Son los s i g u i e n t e s :
- { ) , paréntesis
no s u p e r e l o s 20 pesos, n e c e s i t a m o s 2 c o n d i c i o n e s :
(precio<=20);
Q u e r e m o s ver los l i b r o s cuyo a u t o r sea " B o r g e s " y/o cuya e d i t o r i a l sea " P l a n e t a " :
where autor='Borges' or
editorial='Planeta';
p r i m e r a c o n d i c i ó n , con l a s e g u n d a c o n d i c i ó n y con a m b a s c o n d i c i o n e s .
Q u e r e m o s recuperar l o s l i b r o s q u e N O c u m p l a n l a c o n d i c i ó n d a d a , p o r e j e m p l o ,
E l operador "not" i n v i e rt e el r e s u l t a d o d e l a c o n d i c i ó n a l a c u a l a n t e c e d e .
Los registros recuperados en u n a s e n t e n c i a en la c u a l aparece el operador " n o t " , no
sola expresión.
a d e m á s p e r m i t e d i f e r e n c i a r l a s expresiones m á s c l a r a m e n t e .
where (autor='Borges') or
(precio<20);
u t i l i z a r l o s para evitar c o n f u s i o n e s .
i g u a l n i v e l d e p r e c e d e n c i a es i n d e f i n i d o , por e l l o se r e c o m i e n d a u s a r l o s p a r é n t e s i s .
s i g n i f i c a " n o . " , i n d i c a q u e no se c u m p l a l a c o n d i c i ó n e s p e c i f i c a d a .
2 6 - Otros operadores r e l a c i o n a l e s ( b e t w e e n )
o no).
20 y m e n o r o i g u a l a 4 0 , u s a m o s 2 c o n d i c i o n e s u n i d a s p o r el o p e r a d o r l ó g i c o " a n d " :
precio<=40;
P o d e m o s u s a r "between" y a s í s i m p l i f i c a r l a c o n s u l t a :
m e n o r e s a 20 y mayores a 3 0 :
valores e s p e c i f i c a d a .
2 condiciones:
autor<>'Paenza';
H e m o s r e a l i z a d o c o n s u l t a s u t i l i z a n d o operadores r e l a c i o n a l e s para c o m p a r a r
"Borges":
where autor='Borges';
l a c o m p a r a c i ó n , busca c o i n c i d e n c i a s d e c a d e n a s c o m p l e t a s , realiza u n a b ú s q u e d a
exacta.
I m a g i n e m o s q u e t e n e m o s registrados estos 2 l i b r o s :
S i q u e r e m o s r e c u p e r a r todos l o s l i b r o s de "Borges" y e s p e c i f i c a m o s l a s i g u i e n t e
condición:
where autor='Borges';
" J . L . Borges".
debemos tipear:
comparación q u e s e ñ a l a n i g u a l d a d o diferencia.
entonces t i p e a m o s esta c o n d i c i ó n :
entre 1 0 . 0 0 y 1 9 . 9 9 :
Q u e r e m o s l o s l i b r o s q u e N O i n c l u y e n centavos en s u s precios:
p r o m e d i o s , o b t e n e r valores m á x i m o s y m í n i m o s . Estas f u n c i o n e s se d e n o m i n a n
i n d i v i d u a l e s y d e v u e l v e n u n ú n i c o valor.
select count(*)
from libros;
tienen valor n u l o .
c o n s u l t a m á s específica. Q u e r e m o s s a b e r l a c a n t i d a d de l i b r o s de la e d i t o r i a l
"Planeta":
select count(*)
from libros
where editorial='Planeta';
c a m p o q u e n e c e s i t a m o s contar:
select count(precio)
from libros;
s u m - avg)
c a l c u l a r s u m a s , p r o m e d i o s , obtener valores m á x i m o s y m í n i m o s , l a s f u n c i o n e s de
retornan u n s o l o v a l o r .
( l a veremos posteriormente).
E l t i p o de dato d e l c a m p o d e t e r m i n a l a s f u n c i o n e s q u e se p u e d e n e m p l e a r con e l l a s .
siguiente:
- c o u n t : se p u e d e e m p l e a r con c u a l q u i e r t i p o de d a t o .
- m i n y m a x : con c u a l q u i e r t i p o de d a t o .
- s u m y a v g : s ó l o en c a m p o s de t i p o n u m é r i c o .
e s p e c i f i c a d o . S i q u e r e m o s s a b e r la c a n t i d a d total de l i b r o s q u e t e n e m o s d i s p o n i b l e s
select sum(cantidad)
from libros;
libros:
select max(precio)
from libros;
c u á l q u e r e m o s el m á x i m o valor.
from libros
campos;
H e m o s a p r e n d i d o q u e l a s f u n c i o n e s de g r u p o permiten r e a l i z a r varios c á l c u l o s
de u n c a m p o .
P o d e m o s g e n e r a r v a l o r e s d e r e s u m e n para u n solo c a m p o , c o m b i n a n d o l a s
consultas detalladas.
Q u e r e m o s s a b e r l a c a n t i d a d de l i b r o s d e cada e d i t o r i a l , p o d e m o s t i p e a r la s i g u i e n t e
sentencia:
where editorial='Planeta';
where editorial='Emece';
where editorial='Paidos';
from libros
group by editorial;
La i n s t r u c c i ó n a n t e r i o r s o l i c i t a q u e muestre el n o m b r e de l a e d i t o r i a l y cuente la
E n t o n c e s , para s a b e r l a c a n t i d a d de l i b r o s q u e t e n e m o s de cada e d i t o r i a l , u t i l i z a m o s
q u e d e s e a m o s q u e se r e a l i c e el a g r u p a m i e n t o , t a m b i é n c o l o c a m o s el n o m b r e d e l
c a m p o a recuperar; l a s i n t a x i s básica es l a s i g u i e n t e :
from NOMBRETABLA
group by CAMPO;
También se p u e d e a g r u p a r por más de u n c a m p o , en tal caso, l u e g o d e l " g r o u p by"
from NOMBRETABLA
group by CAMP01,CAMP02;
from libros
group by editorial;
C o m o r e s u l t a d o aparecen l o s n o m b r e s de l a s e d i t o r i a l e s y la c a n t i d a d de registros de
registros e n l o s c u a l e s el c a m p o especificado es no n u l o .
from libros
group by editorial;
Para s a b e r el m á x i m o y m í n i m o v a l o r d e l o s l i b r o s a g r u p a d o s por e d i t o r i a l :
select editorial,
max(precio) as mayor,
min(precio) as menor
from libros
group by editorial;
Para c a l c u l a r el p r o m e d i o d e l v a l o r de l o s l i b r o s a g r u p a d o s p o r e d i t o r i a l :
from libros
group by editorial;
condiciones.
sea m e n o r a 30 pesos:
select editorial, count(*)
from libros
where precio<30
group by editorial;
Note q u e l a s e d i t o r i a l e s q u e no t i e n e n l i b r o s q u e c u m p l a n la c o n d i c i ó n , no aparecen
en l a s a l i d a .
d e v o l v i e n d o f i l a s por cada g r u p o e s p e c i f i c a d o .
3 2 - Seleccionar grupos (Having)
S i q u e r e m o s s a b e r l a c a n t i d a d de l i b r o s a g r u p a d o s por e d i t o r i a l u s a m o s la s i g u i e n t e
i n s t r u c c i ó n ya a p r e n d i d a :
from libros
group by editorial;
S i q u e r e m o s s a b e r l a c a n t i d a d de l i b r o s a g r u p a d o s por e d i t o r i a l pero c o n s i d e r a n d o
s ó l o a l g u n o s g r u p o s , por e j e m p l o , l o s q u e d e v u e l v a n u n v a l o r mayor a 2 , u s a m o s la
siguiente instrucción:
group by editorial
having count(*)>2;
group by editorial
having avg(precio)>25;
"Planeta".
where editorial<>'Planeta'
group by editorial;
group by editorial
having editorial<>'Planeta';
l i b r o s , s i n c o n s i d e r a r l o s q u e t i e n e n precio n u l o , a g r u p a d o s por e d i t o r i a l , s i n
group by editorial
having editorial<>'Planeta';
e d i t o r i a l , de a q u e l l a s e d i t o r i a l e s q u e t i e n e n m á s de 2 l i b r o s :
group by editorial
P o d e m o s e n c o n t r a r el m a y o r v a l o r de los l i b r o s a g r u p a d o s y o r d e n a d o s por e d i t o r i a l y
s e l e c c i o n a r l a s f i l a s q u e t e n g a n u n v a l o r m e n o r a 1 0 0 y mayor a 3 0 :
from libros
group by editorial
min(precio)>30
arder by editorial;
c l á u s u l a "arder by" s i l a h u b i e r e .
3 3 - Registros d u p l i c a d o s ( D i s t i n c t )
l o s c u a l e s t e n e m o s l i b r o s , si u t i l i z a m o s esta s e n t e n c i a :
También p o d e m o s t i p e a r :
group by autor;
Note q u e en l o s tres casos anteriores aparece " n u l l " como u n v a l o r para " a u t o r " · S i
from libros;
Note q u e si contamos l o s autores s i n " d i s t i n c t " , no i n c l u i r á los valores " n u l l " pero si
los repetidos:
select count(autor)
from libros;
where editorial='Planeta';
También p u e d e u t i l i z a r s e con " g r o u p by" para contar los diferentes autores por
editorial:
from libros
group by editorial;
La c l á u s u l a " d i s t i n c t " afecta a todos los c a m p o s p r e s e n t a d o s . Para mostrar los títulos
y e d i t o r i a l e s de l o s l i b r o s s i n repetir t í t u l o s n i e d i t o r i a l e s , u s a m o s :
from libros
arder by titulo;
c o m p u e s t a s , m á s de u n c a m p o .
n i p u e d e n ser n u l o s .
- horallegada date,
- horasalida date,
campos.
D e f i n i m o s u n a clave c o m p u e s t a c u a n d o n i n g ú n c a m p o p o r si s o l o c u m p l e con l a
c o n d i c i ó n para ser c l a v e .
s i e m p r e será a d i s t i n t a h o r a .
i d e n t i f i c a m o s u n í v o c a m e n t e cada registro.
horallegada date,
horasalida date,
primary key(patente,horallegada)
) ;
realizamos u n a actualización.
join user_constraints uc
uc.table_name='VEHICULOS';
E n t o n c e s , si u n s o l o c a m p o no identifica u n í v o c a m e n t e u n registro p o d e m o s d e f i n i r
nextval - drop s e q u e n c e )
secuencia.
a s i g n á r s e l o s a c a m p o s n u m é r i c o s ; se u t i l i z a n g e n e r a l m e n t e para l a s claves p r i m a r i a s de
l a s t a b l a s g a r a n t i z a n d o q u e s u s valores no se r e p i t a n .
Sintaxis general:
increment by VALORENTERO
maxvalue VALORENTERO
minvalue VALORENTERO
cycle I nocycle;
de O . S i no se i n d i c a , por defecto es 1 .
99999999999999999999999999.
999999999999999999999999999 y "nocycle".
start with 1
increment by 1
maxvalue 99999
minvalue 1;
misma.
Otro e j e m p l o :
increment by 5
cycle;
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 y el v a l o r i n i c i a l es 1 .
"nextval".
s e c u e n c i a y nos retorna el n u e v o v a l o r :
NOMBRESECUENCIA.NEXTVAL;
NOMBRESECUENCIA.CURRVAL;
Los valores retornados por " c u r rv a l " y "nextval" p u e d e n usarse en s e n t e n c i a s " i n s e rt " y
"update".
Veamos u n e j e m p l o c o m p l e t o :
el incremento y q u e no sea c i r c u l a r :
maxvalue 999999
increment by 1
nocycle;
L u e g o i n i c i a l i z a m o s la s e c u e n c i a
para i n i c i a l i z a r l a .
la secuencia:
de la s e c u e n c i a :
consulta:
a n a l i z a r e m o s por el m o m e n t o .
s e c u e n c i a s ; si es u n a s e c u e n c i a e n la c o l u m n a O B J E C T_TYPE se muestra
"SEQUENCE".
secuencias:
where object_type='SEQUENCE';
E n el s i g u i e n t e e j e m p l o se e l i m i n a la s e c u e n c i a " s e c _ c o d i g o l i b r o s " :
Es p o s i b l e m o d i f i c a r u n a s e c u e n c i a , su v a l o r de i n c r e m e n t o , los valores m í n i m o y
start with 1
increment by 1
maxvalue 999
minvalue 1
nocycle;
Para m o d i f i c a r e l m á x i m o v a l o r a 99999 y el i n c r e m e n t o a 2 , t i p e a m o s :
increment by 2
maxvalue 99999;
Es i m p o rt a n t e , a l d i s e ñ a r u n a base de datos y l a s t a b l a s q u e c o n t i e n e , t e n e r e n
m e d i a n t e el t i p o de dato q u e l e d e f i n i m o s ( c a d e n a , n u m é r i c o s , e t c . ) , l a aceptación o
secuencias.
l o s datos, l a s veremos o r d e n a d a m e n t e y a l f i n a l i z a r h a r e m o s u n r e s u m e n de l a s
mismas.
C o m e n z a m o s por l a s restricciones.
l a s t a b l a s se m a n t e n g a .
( e m p l e a n d o " a l t e r t a b l e " ) y se p u e d e n a p l i c a r a u n c a m p o o a v a r i o s . T a m b i é n es
O r a c l e ofrece v a r i o s t i p o s d e restricciones:
- not n u l l : a n i v e l de c a m p o .
una tabla.
p r i m a r i a d e u n a t a b l a con otra.
especifico.
- u n i q u e : a n i v e l de t a b l a .
crearla.
Para o b t e n e r i n f o r m a c i ó n d e l a s restricciones p o d e m o s c o n s u l t a r l o s catálogos
( p r o p i e t a r i o ) , C O N S T R A I N T _ N A M E ( n o m b r e d e l a restricción), C O N S T R A I N T _ T Y P E
otra), D E L E T E _ R U L E ( ) , STATUS ( e s t a d o ) , D E F E R R A B L E ( ) , D E F E R R E D ( ) ,
VALIDATED ( ) , G E N E R A T E D ( ) , I N D E X _ O W N E R ( ) , I N D E X _ N A M E ( ) .
( p r o p i e t a r i o ) , C O N S T R A I N T_ N A M E ( n o m b r e ) , TABLE_NAME ( n o m b r e de l a t a b l a ) ,
s i g u i e n t e s i n t a x i s a l crear l a t a b l a , por e j e m p l o :
titulo varchar(30),
autor varchar(30),
editorial varchar(20),
primary key(codigo)
) ;
u n a serie d e letras y n ú m e r o s a l e a t o r i o s .
básica s i g u i e n t e :
primary key(codigo);
permiten valores d u p l i c a d o s n i n u l o s . I g u a l m e n t e , si a c t u a l i z a m o s .
C u a n d o a g r e g a m o s u n a restricción a u n a t a b l a q u e c o n t i e n e i n f o r m a c i ó n , Oracle
a u t o m á t i c a m e n t e "not n u l l " .
u n i c i d a d de cada registro d e u n a t a b l a .
n o m b r e de l a restricción ( C O N S T R A I N T_ N A M E ) , el t i p o ( C O N S T R A I N T_T Y P E , si es
( T A B L E _ N A M E ) , y otra i n f o r m a c i ó n q u e no a n a l i z a r e m o s por el m o m e n t o .
( C O N S T R A I N T_ N A M E ) , l a t a b l a a l a c u a l se a p l i c a ( T A B L E _ N A M E ) , el c a m p o
( C O L U M N _ N A M E ) y la posición ( P O S I T I O N ) .
3 9 - Restricción u n i q u e
permiten valores n u l o s .
(como n ú m e r o d e d o c u m e n t o ) .
La sintaxis g e n e r a l es l a s i g u i e n t e :
unique (CAMPO);
Ejemplo:
add constraint U Q_ a l u m n o s _ d o c u m e n t o
unique (documento);
m i s m a estructura:
l a s restricciones por t i p o , t a b l a y c a m p o .
Recuerde q u e c u a n d o a g r e g a m o s u n a restricción a u n a t a b l a q u e c o n t i e n e
t i e n e valores n u l o s .
O r a c l e controla l a entrada d e datos en i n s e r c i o n e s y a c t u a l i z a c i o n e s evitando q u e se
i n g r e s e n valores d u p l i c a d o s .
i n f o r m a c i ó n q u e no a n a l i z a r e m o s por el m o m e n t o .
( C O N S T R A I N T_ N A M E ) , l a t a b l a a l a c u a l se a p l i c a ( T A B L E _ N A M E ) , el c a m p o
( C O L U M N _ N A M E ) y la posición ( P O S I T I O N ) .
40 - Restriccion c h e c k
i n g r e s e n valores i n a p r o p i a d o s .
La s i n t a x i s básica es l a s i g u i e n t e :
check CONDICION;
"check":
c u m p l a n con d i c h a restricción.
check (preciomay<=preciomin);
y a l g u n a p a l a b r a con l a c u a l p o d a m o s i d e n t i f i c a r f á c i l m e n t e de q u é se trata la
i n c l u i r varios c a m p o s .
i n c l u i d o en la condición de restricción.
U n campo con u n a restricción " p r i m a ry key" o " u n i q u e " puede tener u n a (o varias)
restricciones "check".
admita valores n u l o s :
- disable)
Sabemos q u e si agregamos u n a restricción a u n a tabla q u e contiene datos, Oracle los controla para asegurarse
tabla.
Podemos hacerlo c u a n d o agregamos l a restricción (de c u a l q u i e r t i p o ) a una t a b l a para q u e Oracle acepte los
La restricción no se aplica en los datos existentes, pero si intentamos ingresar un nuevo valor q u e no c u m p l a la
q u e informa l a c o l u m n a "validated".
También podemos d e s h a b i l i t a r las restricciones para agregar o actualizar datos sin comprobarla:
Entonces, para evitar l a comprobación de datos existentes y futuros al crear la restricción, l a sintaxis básica es l a
siguiente:
disable novalidate;
Por defecto (si no especificamos) l a opción es "validate", es decir, controla los datos existentes y " e n a b l e " , es
ESTADO VALIDACION
constraint NOMBRERESTRICCION;
la restricción:
disable validate
constraint PK_libros_codigo;
enable validate
constraint PK_libros_codigo;
q u e informa l a c o l u m n a "status".
Los estados "validate" y "novalidate" son relativamente i n d e p e n d i e n t e s de los estados " e n a b l e d " y " d i s a b l e d " .
C u a n d o h a b i l i t a m o s u n a restricción " p r i m a ry key" o " u n i q u e " con " e n a b l e " , los datos existentes D E B E N c u m p l i r
restrición y v a l i d a los datos existentes de todas maneras. N o sucede lo m i s m o con u n a restricción "check";
podemos h a b i l i t a r u n a restricción de control con " e n a b l e " y "novalidate", Oracle h a b i l i t a la restricción para futuros
Entonces, " e n a b l e " o " d i s a b l e " activa o desactiva la restricción para los nuevos datos ( " e n a b l e " es la opción
- validate y d i s a b l e : comprueba los valores existentes pero no las posteriores inserciones y actualizaciones;
- novalidate y e n a b l e d : no comprueba los datos existentes, pero si los posteriores ingresos y actualizaciones;
( u s e r_constraints - u s e r_ c o n s _ c o l u m n s )
restricciones e s t a b l e c i d a s en l a s t a b l a s d e l u s u a r i o a c t u a l , d e v u e l v e varias c o l u m n a s ,
e x p l i c a r e m o s a l g u n a s de e l l a s :
- owner: p r o p i e t a r i o d e l a restricción;
- constraints_name: e l n o m b r e de l a restricción;
caracter " C " , si es " p r i m a ry key" muestra " P " , si es " u n i q u e " el caracter " U " .
- t a b l e _ n a m e : n o m b r e de l a t a b l a en la c u a l se e s t a b l e c i ó la restricción;
- s e a r c h _ c o n d i t i o n : s o l a m e n t e es a p l i c a b l e a restricciones de c o n t r o l ; i n d i c a la
o d e s h a b i l i t a d a (d i s a b l e d )
- v a l i d a t e d : i n d i c a si v a l i d a l o s datos existentes en l a t a b l a ( v a l i d a t e d ) o no ( n o
validate)
restricciones e s t a b l e c i d a s en l a s t a b l a s d e l u s u a r i o a c t u a l , d e v u e l v e l a s s i g u i e n t e s
columnas:
- owner: p r o p i e t a r i o d l a restricción;
- c o n s t r a i n t s _ n a m e : e l n o m b r e de l a restricción;
- t a b l e _ n a m e : n o m b r e de la t a b l a en la c u a l se e s t a b l e c i ó ;
drop constraint)
reconocerá.
e l l a , se e l i m i n a n t a m b i é n .
la localización de la información.
Los í n d i c e s se e m p l e a n para f a c i l i t a r la o b t e n c i ó n de i n f o r m a c i ó n de u n a t a b l a . E l
i n d i c e de u n a t a b l a d e s e m p e ñ a la m i s m a f u n c i ó n q u e el í n d i c e de u n l i b r o : p e r m i t e
c u m p l e n l a s c o n d i c i o n e s de l a c o n s u l t a ; l o c u a l i m p l i c a p o s i c i o n a r l a s cabezas
u n a a u n a l a s p á g i n a s de u n l i b r o b u s c a n d o u n tema e s p e c í f i c o ) .
registros y extrayendo l o s q u e c u m p l e n l a s c o n d i c i o n e s de la c o n s u l t a ( c o m p a r a n d o
b u s c a d o , i r directamente a l a p á g i n a i n d i c a d a ) .
registro.
i n d e x a d o s y se crean para a c e l e r a r l a s c o n s u l t a s .
de registros, c u a n d o se r e a l i z a n o p e r a c i o n e s de o r d e n a m i e n t o y a g r u p a m i e n t o y
La desventaja es q u e c o n s u m e e s p a c i o en el d i s c o en d i s c o y g e n e r a costo d e
m a n t e n i m i e n t o ( t i e m p o y recursos).
p r i m a r i a s , claves externas o c a m p o s q u e c o m b i n a n t a b l a s .
c o n s u l t a s o en t a b l a s m u y p e q u e ñ a s .
Los c a m b i o s sobre l a t a b l a , c o m o i n s e r c i ó n , a c t u a l i z a c i ó n o e l i m i n a c i ó n de registros,
son incorporados a u t o m á t i c a m e n t e .
da el m i s m o n o m b r e q u e l a restricción. E n caso q u e l a t a b l a ya t e n g a u n í n d i c e ,
O r a c l e l o u s a , n o crea otro.
a l m a c e n a l a d i r e c c i ó n d o n d e se e n c u e n t r a el dato. Es el t i p o p r e d e t e r m i n a d o y el más
c o m ú n ( el ú n i c o q u e e s t u d i a r e m o s ) .
4 5 - I n d i c e s (Crear - I n f o r m a c i ó n )
es ú t i l c u a n d o l a t a b l a c o n t i e n e m i l e s d e registros, c u a n d o se realizan o p e r a c i o n e s d e
o r d e n a m i e n t o y a g r u p a m i e n t o , etc.
p r i m a r i a s , claves externas o c a m p o s q u e c o m b i n a n t a b l a s .
c o n s u l t a s o en t a b l a s m u y p e q u e ñ a s .
La sintaxis básica es l a s i g u i e n t e :
on NOMBRETABLA{CAMPOS);
valores no p u e d e n d u p l i c a r s e ) . De m o d o p r e d e t e r m i n a d o , si n o se especifica el t i p o
de í n d i c e , se crea u n o no ú n i c o .
tabla "empleados":
on empleados{documento);
Para i d e n t i f i c a r l o s í n d i c e s f á c i l m e n t e , p o d e m o s a g r e g a r u n prefijo al n o m b r e d e l
O r a c l e no l o p e r m i t e .
U n a t a b l a p u e d e indexarse por u n c a m p o (o v a r i o s ) .
on empleado(apellido,nombre);
O r a c l e l o u s a , n o crea otro.
analizaremos):
analizaremos):
E l i m i n a m o s el í n d i c e " l _ e m p l e a d o s _ d o c u m e n t o " :
restricción.
trabaja con m á s de u n a .
registrar.
i d e n t i f i q u e . Veamos:
codigo number(4),
autor varchar2(30),
precio number(S,2),
) ;
codigo number(3),
primary key(codigo)
) ;
necesitamos c o n s u l t a r a m b a s t a b l a s , traer i n f o r m a c i ó n de l a s d o s .
(combinación).
Veamos u n e j e m p l o :
select *from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo;
R e s u m i e n d o : s i d i s t r i b u i m o s l a i n f o r m a c i ó n en varias t a b l a s evitamos l a r e d u n d a n c i a
de datos y o c u p a m o s m e n o s e s p a c i o físico en el d i s c o . U n j o i n es u n a o p e r a c i ó n q u e
registros) d e a m b a s ; l a s t a b l a s p a rt i c i p a n t e s se c o m b i n a n s e g ú n los c a m p o s
ellas.
48 - C o m b i n a c i ó n i n t e r n a ( j o i n )
q u e i n c l u y a datos ( c a m p o s y registros) de a m b a s ; l a s t a b l a s p a rt i c i p a n t e s se
H a y tres t i p o s d e c o m b i n a c i o n e s :
2) combinaciones externas y
3) combinaciones cruzadas.
salida.
La s i n t a x i s básica es l a s i g u i e n t e :
select CAMPOS
from TABLAl
join TABLA2
on CONDICIONdeCOMBINACION;
Ejemplo:
join editoriales
on codigoeditorial=editoriales.codigo;
A n a l i c e m o s l a c o n s u l t a anterior.
especifica q u é t a b l a s se van a c o m b i n a r y c ó m o ;
e m p l e a n c a m p o s c o m u n e s , q u e d e b e n tener t i p o s de datos i g u a l e s o s i m i l a r e s .
La c o n d i c i o n d e c o m b i n a c i ó n , es decir, el o los campos por l o s q u e se van a
Note q u e en l a c o n s u l t a , a l n o m b r a r el c a m p o u s a m o s e l n o m b r e de l a t a b l a t a m b i é n .
E n t o n c e s , si l a s t a b l a s q u e c o m b i n a m o s t i e n e n n o m b r e s de c a m p o s i g u a l e s , D E B E
especificarse a q u é t a b l a pertenece a n t e p o n i e n d o el n o m b r e de la t a b l a a l n o m b r e
d e l c a m p o , s e p a r a d o por u n p u n t o ( . ) .
no a p a r e c e ; si en l a p r i m e r a t a b l a el v a l o r es n u l o , tampoco aparece.
select l.codigo,titulo,autor,nombre
from libros 1
join editoriales e
on l.codigoeditorial=e.codigo;
s i m p l i f i c a c i ó n y hace m á s l e g i b l e l a c o n s u l t a si es l a r g a y c o m p l e j a , pero e n a l g u n a s
c o n s u l t a s es a b s o l u t a m e n t e n e c e s a r i o .
49 - C o m b i n a c i ó n externa i z q u i e r d a (left j o i n )
V i m o s q u e u n a c o m b i n a c i ó n i n t e r n a (j o i n ) encuentra registros d e l a p r i m e r a t a b l a q u e
d e l " o n " y si u n v a l o r d e l a p r i m e r a t a b l a no se e n c u e n t r a e n l a s e g u n d a t a b l a , el
registro no a p a r e c e .
S i q u e r e m o s s a b e r q u é registros de u n a t a b l a N O e n c u e n t r a n c o r r e s p o n d e n c i a en la
c o n d i c i ó n , m á s l o s registros de l a s e g u n d a t a b l a q u e no l a c u m p l e n ; es decir,
c o i n c i d e n t e s entre e l l a s .
c o m b i n a c i o n e s externas se r e a l i z a n s o l a m e n t e entre 2 t a b l a s .
Vamos a e s t u d i a r l a s p r i m e r a s .
t a b l a de l a i z q u i e r d a . S i no e n c u e n t r a c o i n c i d e n c i a con la t a b l a de l a d e r e c h a , el
E n el s i g u i e n t e e j e m p l o s o l i c i t a m o s el t í t u l o y n o m b r e de l a e d i t o r i a l de l o s l i b r o s :
select titulo,nombre
from editoriales e
on codigoeditorial = e.codigo;
E l r e s u l t a d o mostrará el t í t u l o y n o m b r e de la e d i t o r i a l ; l a s e d i t o r i a l e s de l a s c u a l e s no
Es i m p o rt a n t e l a p o s i c i ó n en q u e se c o l o c a n l a s t a b l a s e n u n "left j o i n " , l a t a b l a de l a
con otra t a b l a ( d e r e c h a ) ; si u n v a l o r de l a t a b l a de l a i z q u i e r d a no e n c u e n t r a
from TABLAIZQUIERDA
on CONDICION;
E n el s i g u i e n t e e j e m p l o s o l i c i t a m o s el t í t u l o y el n o m b r e la e d i t o r i a l , l a sentencia es
select titulo,nombre
from libros 1
on codigoeditorial = e.codigo;
E l r e s u l t a d o mostrará el t í t u l o d e l l i b r o y el n o m b r e de la e d i t o r i a l ; l o s t í t u l o s cuyo
c o n s i d e r a n d o s o l a m e n t e los registros q u e e n c u e n t r a n c o i n c i d e n c i a en la t a b l a de la
select titulo,nombre
from editoriales e
on e.codigo=codigoeditorial
decir, q u e N O e n c u e n t r a n c o i n c i d e n c i a en la t a b l a de la d e r e c h a :
select titulo,nombre
from editoriales e
on e.codigo=codigoeditorial
m o d o s ó l o q u e l a t a b l a derecha es l a q u e l o c a l i z a l o s registros en la t a b l a i z q u i e r d a .
E n el s i g u i e n t e e j e m p l o s o l i c i t a m o s el t í t u l o y n o m b r e de la e d i t o r i a l de l o s l i b r o s
from libros 1
on codigoeditorial = e.codigo;
E l r e s u l t a d o mostrará el t í t u l o y n o m b r e de la e d i t o r i a l ; l a s e d i t o r i a l e s de l a s c u a l e s no
en l a s e g u n d a t a b l a ( d e r e c h a ) ; e n el " r i g h t j o i n " l a s e g u n d a t a b l a ( d e r e c h a ) es l a q u e
busca c o i n c i d e n c i a s en l a p r i m e r a t a b l a ( i z q u i e r d a ) .
select titulo,nombre
from editoriales e
on codigoeditorial = e.codigo;
( i z q u i e r d a ) ; si u n v a l o r de l a t a b l a de la derecha no encuentra c o i n c i d e n c i a e n l a t a b l a
la siguiente:
select CAMPOS
from TABLAIZQUIERDA
right JOln TABLADERECHA
on CONDICION;
c o n s u l t a c o n s i d e r a n d o s o l a m e n t e l o s registros q u e e n c u e n t r a n c o i n c i d e n c i a e n l a
tabla izquierda:
select titulo,nombre
from libros 1
on e.codigo=codigoeditorial
select titulo,nombre
from libros 1
on e.codigo=codigoeditorial
izquierda.
U n a c o m b i n a c i ó n externa completa ( " f u l l outer j o i n " o " f u l l j o i n " ) retorna todos los
c o i n c i d e n c i a en l a t a b l a d e r e c h a , l a s c o l u m n a s correspondientes a c a m p o s de l a
c o r r e s p o n d e n c i a en l a t a b l a i z q u i e r d a , l o s c a m p o s de esta ú l t i m a aparecen
Veamos u n e j e m p l o :
select titulo,nombre
from editoriales e
on codigoeditorial = e.codigo;
V i m o s q u e hay tres t i p o s d e c o m b i n a c i o n e s : 1 ) c o m b i n a c i o n e s i n t e r n a s (j o i n ) , 2 )
c o m b i n a c i o n e s externas (left, o u t e r y f u l l j o i n ) y 3) c o m b i n a c i o n e s c r u z a d a s .
c o n d i c i ó n d e e n l a c e . Se g e n e r a el producto c a rt e s i a n o en el q u e el n ú m e r o d e f i l a s
d e l r e s u l t a d o es i g u a l a l n ú m e r o de registros de la p r i m e r a t a b l a m u l t i p l i c a d o por el
en l a otra, retorna 1 2 f i l a s .
select CAMPOS
from TABLAl
m i s m o s datos d e s u s postres.
from comidas e
la s a l i d a .
Este t i p o d e j o i n no es m u y u t i l i z a d o .
5 3 - Autocombinación
D i j i m o s q u e es p o s i b l e c o m b i n a r u n a tabla c o n s i g o m i s m a .
los s i g u i e n t e s c a m p o s :
- nombre varchar(20),
rubro char(6)-- que indica con 'plato' si es un plato principal y 'postre' si es postre.
select el.nombre,
c2.nombre,
cl.precio+c2.precio as total
from comidas el
c2.nombre as postre,
cl.precio+c2.precio as total
from comidas el
c2.rubro='postre';
c2.nombre as postre,
cl.precio+c2.precio as total
from comidas el
join comidas c2
on cl.codigo<>c2.codigo
c2.rubro='postre';
agrupamiento
tablas.
" e d i t o r i a l e s " , ti p e a m o s :
count(*) as cantidad
from editoriales e
join libros 1
on codigoeditorial=e.codigo
group by e.nombre;
Las e d i t o r i a l e s q u e n o t i e n e n l i b r o s no aparecen e n la s a l i d a p o r q u e e m p l e a m o s u n
"join".
y a g r u p a m o s por n o m b r e d e l a e d i t o r i a l :
from editoriales e
on codigoeditorial=e.codigo
group by nombre;
" n u l l " en la c o l u m n a c a l c u l a d a .
5 5 - C o m b i n a r más de 2 t a b l a s
La l i b r e r í a a l m a c e n a l o s datos de s u s l i b r o s en tres t a b l a s : l i b r o s , e d i t o r i a l e s y
autores.
select titulo,a.nombre,e.nombre
from autores a
join libros 1
on codigoautor=a.codigo
join editoriales e
on codigoeditorial=e.codigo;
U t i l i z a m o s a l i a s para u n a s e n t e n c i a m á s s e n c i l l a y c o m p r e n s i b l e .
de referenciar u n c a m p o .
P o d e m o s c o m b i n a r varios t i p o s de j o i n en u n a m i s m a s e n t e n c i a :
select titulo,a.nombre,e.nombre
from autores a
on codigoautor=a.codigo
on codigoeditorial=e.codigo;
E n l a c o n s u l t a a n t e r i o r s o l i c i t a m o s el t í t u l o , autor y e d i t o r i a l de todos l o s l i b r o s q u e
Es p o s i b l e r e a l i z a r v a r i a s c o m b i n a c i o n e s para o b t e n e r i n f o r m a c i ó n d e varias t a b l a s .
3 ) c o m b i n a c i o n e s cruzadas (cross j o i n ) .
También v i m o s q u e es p o s i b l e e m p l e a r varios t i p o s de c o m b i n a c i o n e s en u n a
r e s u e l v e n con los q u e v i m o s a n t e r i o r m e n t e , b á s i c a m e n t e l o q u e c a m b i a es la
sintaxis.
c u a l e s se e n l a z a n t i e n e n el m i s m o n o m b r e . I n v o l u c r a claves p r i m a r i a s y foráneas.
Sintaxis:
select CAMPOS
from TABLAl
Ejemplo:
from libros
natural join
editoriales;
c a m p o " c o d i g o e d i t o r i a l " de " e d i t o r i a l e s " . La c l á u s u l a " o n " n o aparece, este " j o i n " no
de a m b a s t a b l a s ( a m b a s t a b l a s d e b e n tener u n ú n i c o c a m p o con i d é n t i c o n o m b r e , si
mostrará u n m e n s a j e d e error).
c a m p o s ) por el c u a l se e n l a z a r á n l a s t a b l a s ; l o s c a m p o s de a m b a s t a b l a s D E B E N
t e n e r el m i s m o n o m b r e y ser de t i p o s c o m p a t i b l e s .
Sintaxis:
select CAMPOS
from TABLAl
join TABLA2
using (CAMPOenCOMUN);
Ejemplo:
from libros
join editoriales
using (codigoeditorial);
enlazan.
La s i n t a x i s es l a s i g u i e n t e :
select CAMPOS
from TABLAl
join TABLA2
on CAMPOTABLA1=CAMPOTABLA2(+);
para i n d i c a r q u e se i n c l u y a n l o s q u e t i e n e n v a l o r n u l o .
from libros 1
on l.codigoeditorial = e.codigoeditorial;
from libros 1
join editoriales e
on l.codigoeditorial = e.codigoeditorial(+);
"editorial".
n u l o . La sintaxis es l a s i g u i e n t e :
select CAMPOS
from TABLAl
join TABLA2
on CAMPOTABLA1(+)=CAMPOTABLA2;
para i n d i c a r q u e se i n c l u y a n l o s q u e t i e n e n v a l o r n u l o .
from editoriales e
on e.codigoeditorial = l.codigoeditorial;
from editoriales e
join libros 1
on e.codigoeditorial(+) = l.codigoeditorial;
Ambas mostrarán el t í t u l o y n o m b r e de l a e d i t o r i a l ; l a s e d i t o r i a l e s q u e no e n c u e n t r a n
S i l a c o n d i c i ó n d e c o m b i n a c i ó n es compuesta ( m á s de u n c a m p o ) , D E B E colocarse el
N o se p u e d e colocar el m o d i f i c a d o r en c a m p o s de d i s t i n t a s t a b l a s . La s i g u i e n t e
from libros 1
join editoriales e
on l.codigoeditorial(+)= e.codigoeditorial(+);
5 7 - Clave foránea
campos:
tabla " l i b r o s " con " e d i t o r i a l e s " y es clave p r i m a r i a en " e d i t o r i a l e s " con el n o m b r e
"codigo".
correspondan.
i n h a b i l i t a d a para h a c e r los e n l a c e s .
v á l i d o s y q u e l a s r e l a c i o n e s entre l a s t a b l a s se m a n t e n g a n .
V i m o s tres t i p o s de restricciones:
código.
Analicémosla:
- N O M B R E T A B L A 1 referencia el n o m b r e d e la t a b l a a l a c u a l le a p l i c a m o s la
restricción,
- N O M B R E R E S T R I C C I O N es el n o m b r e q u e l e d a m o s a l a m i s m a ,
- l u e g o de "references" i n d i c a m o s el n o m b r e d e l a t a b l a referenciada y el c a m p o q u e
ti p e a m o s :
alter table libros
references editoriales(codigo);
C u a n d o a g r e g a m o s c u a l q u i e r restricción a u n a t a b l a q u e c o n t i e n e i n f o r m a c i ó n ,
restricción no se a g r e g a .
contrario a l d e f i n i r el c a m p o ) .
Actúa en e l i m i n a c i o n e s y a c t u a l i z a c i o n e s . S i i n t e n t a m o s e l i m i n a r u n registro o
automáticamente.
D E B E N c o i n c i d i r con l a c a n t i d a d y t i p o de datos de l o s c a m p o s de la c l á u s u l a
"references".
o entre d i s t i n t a s t a b l a s .
u n mensaje de error.
q u e fueron d e f i n i d a s .
tabla
a p r e n d i d o ) o dentro d e l a m i s m a t a b l a .
A l g u n o s a f i l i a d o s i n s c r i b e n a s u s f a m i l i a r e s . La t a b l a c o n t i e n e u n c a m p o q u e hace
referencia a l a f i l i a d o q u e lo incorporó a l a m u t u a l , d e l c u a l d e p e n d e n .
La estructura d e l a t a b l a es l a s i g u i e n t e :
numero number(S),
nombre varchar2(30),
afiliadotitular number(S),
unique (numero)
) ;
La s i n t a x i s es l a m i s m a , excepto q u e la t a b l a se autoreferencia.
mostrará u n m e n s a j e d e error.
(próximo tema).
61 - Restricciones foreign key d e s h a b i l i t a r y
validar
A p r e n d i m o s ( c u a n d o v i m o s l o s otros t i p o s de restricciones) q u e si a g r e g a m o s u n a
n u e v o v a l o r q u e no c u m p l a l a restricción ( o a c t u a l i z a r l o ) , Oracle no lo p e r m i t e .
lo permitirá.
p o d e r i n g r e s a r u n v a l o r q u e infrija l a restricción:
disable validate
constraint FK_libros_codigoeditorial;
Entonces, " e n a b l e " o " d i s a b l e " activa o desactiva la restricción para los nuevos datos
predeterminada si se omite).
ESTADO VALIDACION;
ESTADO VALIDACION
constraint NOMBRERESTRICCION;
6 2 - Restricciones foreign key ( a c c i o n e s )
referenciadas e n l a restricción.
cascada).
references TABLA2(CAMPOCLAVEPRIMARIA)
on delete OPCION;
references editoriales(codigo)
on delete cascade;
S i l u e g o de establecer l a restricción anterior, e l i m i n a m o s u n a e d i t o r i a l de " e d i t o r i a l e s "
l i b r o s de t a l e d i t o r i a l .
references editoriales(codigo)
( c o d i g o ) existe en l a t a b l a p r i n c i p a l ( l i b r o s ) , la acción no se r e a l i z a .
existe en la t a b l a p r i n c i p a l ( l i b r o s ) , l a e l i m i n a c i ó n de l a t a b l a referenciada ( e d i t o r i a l e s )
todos l o s v a l o r e s c o i n c i d e n t e s en l a t a b l a p r i n c i p a l ( l i b r o s ) .
actualizaciones.
restricciones, l a s q u e e s t u d i a m o s son l a s s i g u i e n t e s c o l u m n a s :
- owner: p r o p i e t a r i o d e l a restricción;
- s e a r c h _ c o n d i t i o n : s o l a m e n t e es a p l i c a b l e a restricciones de c o n t r o l ; i n d i c a la
o d e s h a b i l i t a d a (d i s a b l e d )
- v a l i d a t e d : i n d i c a si v a l i d a l o s datos existentes en l a t a b l a ( v a l i d a t e d ) o no ( n o
validate).
64 - Restricciones a l crear la t a b l a
t a m b i é n p u e d e n establecerse a l m o m e n t o de crear u n a t a b l a ( en la i n s t r u c c i ó n
"create t a b l e " ) .
codigo number(S),
titulo varchar2(40),
codigoautor number(4),
codigoeditorial number(3),
constraint PK_libros_codigo
constraint U Q_ l i b r o s _ t i t u l o a u t o r
unique (titulo,codigoautor),
constraint CK_libros_codigoeditorial
references editoriales(codigo)
on delete cascade,
references autores(codigo)
constraint CK_libros_preciononulo
constraint CK_precio_positivo
check (precio>=0)
) ;
E n el e j e m p l o d e f i n i m o s l a s s i g u i e n t e s restricciones:
cascada;
"foreig n key".
65 - Unión
"select" e n u n ú n i c o r e s u l t a d o .
Se u s a n c u a n d o l o s datos q u e se q u i e r e n o b t e n e r p e rt e n e c e n a d i s t i n t a s t a b l a s y no
se p u e d e acceder a e l l o s con u n a s o l a c o n s u l t a .
Es n e c e s a r i o q u e l a s t a b l a s referenciadas t e n g a n t i p o s de datos s i m i l a r e s , la m i s m a
consulta.
"union".
CONSULTAl
u n ion
CONSULTA2;
l o s valores d e b e n ser d e l m i s m o t i p o .
Veamos u n e j e m p l o . U n a a c a d e m i a de e n s e ñ a n z a de i d i o m a s da clases de i n g l é s y
necesitamos r e a l i z a r u n a u n i ó n :
u n ion
mostrando el n o m b r e y d o m i c i l i o d e l o s registros de a m b a s t a b l a s .
union all
c u r s a n d o a m b o s i d i o m a s , aparecerá d o s veces en el r e s u l t a d o .
C o n t i n u a m o s a p r e n d i e n d o l a s o p e r a c i o n e s de c o n j u n t o s . A p r e n d i m o s " u n i o n " y
q u e se q u i e r e n o b t e n e r pertenecen a d i s t i n t a s t a b l a s y no se p u e d e acceder a e l l o s
con u n a s o l a c o n s u l t a .
D e l m i s m o m o d o , l a s t a b l a s referenciadas D E B E N t e n e r t i p o s de datos s i m i l a r e s , l a
m i s m a c a n t i d a d d e c a m p o s y el m i s m o orden de campos en la l i s t a de s e l e c c i ó n de
cada c o n s u l t a q u e i n t e rv e n g a en la i n t e r s e c c i ó n .
común.
Sintaxis:
SENTENCIASELECTl
intersect
SENTENCIASELECT2;
l o s valores d e b e n ser d e l m i s m o t i p o .
U n a a c a d e m i a d e e n s e ñ a n z a de i d i o m a s da c l a s e s de i n g l é s , trances y p o rt u g u e s ;
a p r e n d e n p o rt u g u e s en l a t a b l a " p o rt u g u e s " .
i d i o m a s para e n v i a r l e s u n a tarjeta de d e s c u e n t o .
necesitamos r e a l i z a r u n a i n t r e s e c c i ó n :
intersect
intersect
q u e se q u i e r e n o b t e n e r pertenecen a d i s t i n t a s t a b l a s y no se p u e d e acceder a e l l o s
con u n a s o l a c o n s u l t a . D e l m i s m o m o d o , l a s t a b l a s referenciadas D E B E N t e n e r t i p o s
de datos s i m i l a r e s , l a m i s m a c a n t i d a d d e c a m p o s y el m i s m o o r d e n de campos en la
e n c u e n t r a n en s e g u n d a c o n s u l t a , es decir, a q u e l l o s registros q u e no c o i n c i d e n . Es e l
e q u i v a l e n t e a "except" en S Q L .
Sintaxis:
SENTENCIASELECTl
minus
SENTENCIASELECT2;
N o o l v i d e q u e l a s c o n s u l t a s D E B E N t e n e r el m i s m o n u m e r o de valores retornados y
l o s valores d e b e n ser d e l m i s m o t i p o .
U n a a c a d e m i a d e e n s e ñ a n z a de i d i o m a s da c l a s e s de i n g l é s y frances; a l m a c e n a los
La a c a d e m i a necesita el n o m b r e y d o m i c i l i o de todos l o s a l u m n o s q u e c u r s a n
información:
minus
de l a s e g u n d a c o n s u l t a .
agregar, m o d i f i c a r y e l i m i n a r c a m p o s d e u n a t a b l a .
Para a g r e g a r u n n u e v o c a m p o a u n a t a b l a e m p l e a m o s la s i g u i e n t e s i n t a x i s b á s i c a :
P u e d e verificarse l a a l t e r a c i ó n de l a estructura de l a t a b l a t i p e a n d o :
describe libros;
Para m o d i f i c a r u n c a m p o e m p l e a m o s l a s i g u i e n t e s i n t a x i s :
P u e d e verificarse l a a l t e r a c i ó n de l a estructura de l a t a b l a t i p e a n d o :
describe libros;
P o d e m o s m o d i f i c a r d e u n c a m p o : el t i p o de d a t o , l a escala y/o p r e c i s i ó n , l a l o n g i t u d ,
Se p u e d e n m o d i f i c a r todos l o s atributos o a l g u n o s ; l o s q u e no se e s p e c i f i c a n , no
cambian.
de n u m b e r a caracteres o viceversa.
d ) para m o d i f i c a r u n c a m p o d i s m i n u y e n d o la l o n g i t u d ( p r e c i s i ó n o e s c a l a ) d e l t i p o de
alterar l a l o n g i t u d ( e s c a l a o p r e c i s i ó n ) a u m e n t á n d o l a , no es necesario q u e la t a b l a
esté v a c í a .
vacía o no c o n t e n g a valores n u l o s .
modifica t a l c a m p o a t i p o n u m b e r ( 8 ) , Oracle p e r m i t e el c a m b i o ya q u e a l i n s e rt a r el
c a m p o no se r e a l i z a .
70 - E l i m i n a r c a m p o s ( a l t e r t a b l e - d r o p )
modificando y e l i m i n a n d o campos.
Para e l i m i n a r c a m p o s d e u n a t a b l a l a s i n t a x i s básica es la s i g u i e n t e :
"foreig n key".
S i e l i m i n a m o s u n c a m p o i n d e x a d o , el í n d i c e t a m b i é n se e l i m i n a .
N O p u e d e e l i m i n a r s e u n c a m p o si es e l ú n i c o en la t a b l a .
P u e d e verificarse l a a l t e r a c i ó n de l a estructura de l a t a b l a t i p e a n d o :
describe libros;
71 - Agregar c a m p o s y restricciones (alter
table)
P o d e m o s a g r e g a r u n c a m p o a u n a t a b l a y en el m i s m o m o m e n t o a p l i c a r l e u n a
restricción.
"unique":
constraint U Q_ l i b r o s _ a u t o r unique;
"check":
U n a s u b c o n s u l t a ( s u b q u e r y ) es u n a s e n t e n c i a "select" a n i d a d a e n otra s e n t e n c i a
Las s u b c o n s u l t a s se e m p l e a n c u a n d o u n a c o n s u l t a es m u y c o m p l e j a , entonces se l a
G e n e r a l m e n t e , u n a s u b c o n s u l t a se p u e d e r e e m p l a z a r por c o m b i n a c i o n e s y estas
ú l t i m a s son m á s eficientes.
Las s u b c o n s u l t a s g e n e r a l m e n t e se i n c l u y e n entre p a r é n t e s i s .
P u e d e h a b e r s u b c o n s u l t a s dentro de s u b c o n s u l t a s .
G e n e r a l m e n t e l a s s u b c o n s u l t a s se colocan en l a c l á u s u l a "where".
U n a s u b c o n s u l t a p u e d e retornar:
- u n s o l o valor,
- u n a lista d e v a l o r e s d e u n a s o l a c o l u m n a ,
devuelto por u n a s u b c o n s u l t a ( " i n " , " n o t i n " ) , si es mayor, m e n o r o i g u a l a todos ( " a l l " )
Se p u e d e n e m p l e a r s u b c o n s u l t a s :
- en l u g a r d e u n a e x p r e s i ó n , s i e m p r e q u e d e v u e l v a n u n s o l o v a l o r o u n a l i s t a de
valores.
para obtener el m i s m o r e s u l t a d o q u e u n a c o m b i n a c i ó n (l o i n ) ,
H a y varios t i p o s b á s i c o s de s u b c o n s u l t a s :
c o m p a r a c i ó n o en l u g a r de u n a e x p r e s i ó n .
u n v a l o r e s c a l a r ( o u n a l i s t a de valores de u n c a m p o ) .
c o m p a r a c i ó n o en l u g a r de u n a e x p r e s i ó n :
select CAMPOS
from TABLA
from TABLA;
q u e s o l i c i t a m o s . P o d e m o s c o n s e g u i r l o en u n a sola s e n t e n c i a c o m b i n a n d o dos
consultas:
select titulo,precio,
from libros
where titulo='Uno';
precio d e l l i b r o y el m á x i m o v a l o r d e p r e c i o .
Q u e r e m o s s a b e r el t í t u l o , a u t o r y precio d e l l i b r o m á s costoso:
from libros
where precio=
Para e l i m i n a r registros e m p l e a n d o s u b c o n s u l t a e m p l e a m o s la s i g u i e n t e s i n t a x i s
básica:
28/11 /2017 Descripción : Subconsultas como expresion (Oracle)
where CAMPO=(SUBCONSULTA);
74 - S u b c o n s u l t a s con i n
s u b c o n s u l t a retorna r e s u l t a d o s , la c o n s u l t a exterior l o s u s a .
La s i n t a x i s básica es l a s i g u i e n t e :
Este e j e m p l o muestra l o s n o m b r e s de l a s e d i t o r i a l e s q u e ha p u b l i c a d o l i b r o s de u n
determinado autor:
select nombre
from editoriales
where codigo in
(select codigoeditorial
from libros
La s u b c o n s u l t a ( c o n s u l t a i n t e r n a ) retorna u n a l i s t a de valores de u n s o l o c a m p o
from editoriales e
join libros
on codigoeditorial=e.codigo
m i s m o r e s u l t a d o . S i es p o s i b l e , es a c o n s e j a b l e e m p l e a r c o m b i n a c i o n e s e n l u g a r de
s u b c o n s u l t a s , son m á s eficientes.
retorna u n a s u b c o n s u l t a ; por e j e m p l o , l a s e d i t o r i a l e s q u e no h a n p u b l i c a d o l i b r o s d e
u n a u t o r específico:
select nombre
from editoriales
(select codigoeditorial
from libros
s u b c o n s u l t a se e n c u e n t r a el v a l o r especificado en l a c o n d i c i ó n .
La sintaxis básica e s :
. . . VALORESCALAR OPERADORDECOMPARACION
any (SUBCONSULTA);
Q u e r e m o s s a b e r l o s t í t u l o s d e l o s l i b r o s de "Borges" q u e p e rt e n e c e n a e d i t o r i a l e s q u e
select titulo
from libros
codigoeditorial = any
(select e.codigo
from editoriales e
join libros 1
on codigoeditorial=e.codigo
La c o n s u l t a i n t e r n a ( s u b c o n s u l t a ) retorna u n a l i s t a de valores de u n s o l o c a m p o
d e v o l v i e n d o l o s t í t u l o s de " B o r g e s " q u e c o i n c i d e n .
devuelta por l a c o n s u l t a i n t e r n a .
Sintaxis:
select titulo
from libros
(select e.codigo
from editoriales e
join libros 1
on codigoeditorial=e.codigo
La c o n s u l t a i n t e r n a ( s u b c o n s u l t a ) retorna u n a l i s t a de valores de u n s o l o c a m p o
select titulo,precio
from libros
precio> any
(select precio
from libros
where autor='Bach');
select titulo,precio
from libros
precio> all
(select precio
from libros
where autor='bach');
U n a l m a c é n a l m a c e n a l a i n f o r m a c i ó n d e s u s ventas en u n a t a b l a l l a m a d a "facturas"
en l a c u a l g u a r d a el n ú m e r o de factura, l a fecha y el n o m b r e d e l c l i e n t e y u n a t a b l a
l a c a n t i d a d de a rt í c u l o s c o m p r a d o s y el total:
select f.*,
(select count(d.numeroitem)
from Detalles d
(select sum{d.preciounitario*cantidad)
from Detalles d
from facturas f;
A este t i p o de s u b c o n s u l t a se l a d e n o m i n a c o n s u l t a c o r r e l a c i o n a d a . La c o n s u l t a
l a s u b c o n s u l t a ( f . n u m e r o ) se c o m p a r a con el c a m p o de la t a b l a externa.
i n t e r n a y O r a c l e repite l a e v a l u a c i ó n .
77 - Exists y N o Exists
en u n a l i s t a de valores.
r e s t r i n g i r e l r e s u l t a d o d e u n a c o n s u l t a exterior a l o s registros q u e c u m p l e n l a
u n registro c u m p l e l a c o n d i c i ó n "where" d e l a s u b c o n s u l t a .
La s i n t a x i s b á s i c a es l a s i g u i e n t e :
"lapiz":
select cliente,numero
from facturas f
where exists
where f.numero=d.numerofactura
P u e d e o b t e n e r el m i s m o resultado e m p l e a n d o u n a c o m b i n a c i ó n .
not exists":
select cliente,numero
from facturas f
where f.numero=d.numerofactura
A l g u n a s s e n t e n c i a s en l a s c u a l e s l a c o n s u l t a interna y la externa e m p l e a n la m i s m a
t a b l a p u e d e n reemplazarse por u n a a u t o c o m b i n a c i ó n .
Por e j e m p l o , q u e r e m o s u n a l i s t a de l o s l i b r o s q u e h a n s i d o p u b l i c a d o s por d i s t i n t a s
editoriales.
from libros 11
where 11.titulo in
(select 12.titulo
from libros 12
E n el e j e m p l o a n t e r i o r e m p l e a m o s u n a s u b c o n s u l t a c o r r e l a c i o n a d a y las c o n s u l t a s
i n t e r n a y externa e m p l e a n l a m i s m a t a b l a . La s u b c o n s u l t a devuelve u n a l i s t a d e
C o n el s i g u i e n t e " j o i n " se o b t i e n e el m i s m o r e s u l t a d o :
from libros 11
join libros 12
on 11.titulo=ll.titulo and
ll.autor=l2.autor
where ll.editorial<>l2.editorial;
empleando subconsulta:
select titulo
from libros
precio=
(select precio
from libros
"join".
select 11.titulo,ll.editorial,ll.precio
from libros 11
(select avg{l2.precio)
from libros 12
where codigoeditorial=
(select codigo
from editoriales
where nombre='Emece');
Perez":
where codigoeditorial in
(select e.codigo
from editoriales e
join libros
on codigoeditorial=e.codigo
P o d e m o s i n g r e s a r registros en u n a t a b l a e m p l e a n d o u n s u b s e l e c t .
La sintaxis básica es l a s i g u i e n t e :
select (CAMPOSTABLACONSULTADA)
from TABLACONSULTADA;
"alumnos":
select (documento,nota)
from alumnos;
j u n t o a l n o m b r e de l a t a b l a en la c u a l i n g r e s a r e m o s l o s registros y l o s campos q u e se
La c a n t i d a d de c o l u m n a s d e v u e l t a s en l a c o n s u l t a d e b e ser la m i s m a q u e la cantidad
de c a m p o s a c a r g a r en el " i n s e rt " .
c u a l q u i e r tipo de "join".
81 - Crear tabla a partir de otra (create table-
select)
P o d e m o s crear u n a t a b l a e i n s e rt a r datos en e l l a en u n a s o l a s e n t e n c i a c o n s u l t a n d o
as SUBCONSULTA;
otra t a b l a .
" e d i t o r i a l e s " q u e c o n t e n g a l o s n o m b r e s de l a s e d i t o r i a l e s .
" l i b r o s " y e n el m i s m o m o m e n t o i n s e rt a r l a i n f o r m a c i ó n :
"editorial" de "libros".
a l m a c e n a d o s q u e l o s c a m p o s l i s t a d o s de la t a b l a c o n s u l t a d a ; si se q u i e r e d a r otro
n o m b r e a l o s c a m p o s d e l a n u e v a t a b l a se d e b e n especificar a l i a s .
c o n s u l t a s . T a m b i é n p o d e m o s crear u n a t a b l a q u e c o n t e n g a datos d e 2 o m á s t a b l a s
empleando combinaciones.
8 2 - Vistas (create view)
g u a r d a l a d e f i n i c i ó n d e l a vista y no el resultado de e l l a .
g e n e r a l , se p u e d e d a r u n n o m b r e a c u a l q u i e r c o n s u l t a y a l m a c e n a r l a como u n a vista.
m a n e r a de referenciarlas es l a m i s m a q u e para u n a t a b l a .
Las vistas p e r m i t e n :
- s i m p l i f i c a r l a a d m i n i s t r a c i ó n de los p e r m i s o s d e u s u a r i o : se p u e d e n d a r al u s u a r i o
base de c a m b i o s en su estructura.
a l m a c e n a n d o en u n a vista el r e s u l t a d o de u n a c o n s u l t a c o m p l e j a q u e i n c l u y a
información de varias t a b l a s .
v i s t a , c o m b i n a c i ó n de vistas y t a b l a s .
SUBCONSULTA;
c o m b i n a c i ó n en l a c u a l se m u e s t r a n 4 c a m p o s :
from empleados e
JOln secciones s
on codigo=seccion;
from vista_empleados;
c o n s u l t a d a s en e l l a s .
n o m b r e . Se d e b e c o l o c a r n o m b r e de c a m p o c u a n d o es u n c a m p o c a l c u l a d o o si hay
a l i a s p o r q u e ya h a b í a u n e n c a b e z a d o (el a l i a s de l a c o n c a t e n a c i ó n ) l l a m a d o
Otra s i n t a x i s es l a s i g u i e n t e :
as
SUBCONSULTA;
a l m a c e n a l a c a n t i d a d de e m p l e a d o s por a ñ o :
as
from empleados
a n t e r i o r m e n t e , se e m p l e a n l o s n o m b r e s de l o s c a m p o s o a l i a s ( q u e en este caso
definen e n l a vista.
Las vistas se crean en l a base de datos activa.
n o m b r e c o m i e n c e con l a c a d e n a "VISTA":
que e l i m i n a r l a explícitamente.
8 5 - Vistas ( m o d i f i c a r datos a través de e l l a )
S i se m o d i f i c a n l o s datos d e u n a v i s t a , se modifica l a t a b l a b a s e .
Se p u e d e i n s e rt a r , a c t u a l i z a r o e l i m i n a r datos de u n a t a b l a a través de u n a v i s t a ,
- no p u e d e n afectar a m á s de u n a t a b l a c o n s u l t a d a . P u e d e n modificarse y e l i m i n a r s e
s o l a m e n t e d e b e afectar a u n a s o l a t a b l a .
- no se p u e d e n c a m b i a r l o s c a m p o s resultado de u n c á l c u l o .
Sintaxis:
as SUBCONSULTA
E v i t a m o s q u e Oracle acepte " i n s e rt " , " u p d a t e " o "delete" sobre l a vista si colocamos
Por e j e m p l o , creamos l a s i g u i e n t e v i s t a :
as
from empleados
r e a l i z a d o sobre l a v i s t a .
8 7 - Vistas modificar (create or replace view)
replace".
Sintaxis:
as SUBCONSULTA;
si no existe.
8 8 - Vistas (with c h e c k o p t i o n )
Por e j e m p l o , creamos l a s i g u i e n t e v i s t a :
as
from empleados
where seccion='Administracion'
C o n l a c l á u s u l a "with c h e c k o p t i o n " , no se p e r m i t e n m o d i f i c a c i o n e s en a q u e l l o s
v i s t a ; si p o d e m o s a c t u a l i z a r l o s d e m á s c a m p o s . Por e j e m p l o , si intentamos a c t u a l i z a r
mensaje d e error.
O r a c l e mostrará u n m e n s a j e de error.
Sintaxis básica:
as SUBCONSULTA
crearla:
as SUBCONSULTA;
a l c o n s u l t a r l a vista, D E B E N existir l a s t a b l a s .
t a b l a s y l u e g o l a s vistas n e c e s a r i a s .
v i e w " ; d e b e volver a crear l a vista ( con "create view" o "create or replace v i e w " ) .
90 - Vistas materializadas ( m a t e r i a l i z e d view)
l a d e f i n i c i ó n de l a vista, a l m a c e n a el r e s u l t a d o de la c o n s u l t a , es decir, la m a t e r i a l i z a ,
Sintaxis:
as SUBCONSULTA;
no l a s e s t u d i a r e m o s .
m a t e r i a l i z a d a ( m a t e r i a l i z e d view) es u n a i n s t a n t á n e a ( s n a p s h o t ) , son s i n ó n i m o s .
si es u n a vista m a t e r i a l i z a d a . E j e m p l o :
vistas m a t e r i a l i z a d a s d e l u s u a r i o a c t u a l :
Este d i c c i o n a r i o muestra m u c h a i n f o r m a c i ó n q u e n o e x p l i c a r e m o s en d e t a l l e .
Ejemplo:
U n p r o c e d i m i e n t o a l m a c e n a d o es u n conjunto de i n s t r u c c i o n e s a l a s q u e se l e s da u n
tareas repetitivas.
Ventajas:
y l a s m o d i f i c a c i o n e s d e l o s datos se h a c e n en u n s o l o s i t i o .
t e n g a n acceso directo a l a s t a b l a s .
r e a l i z a n o p e r a c i o n e s e n v i a n d o u n a ú n i c a i n s t r u c c i ó n , lo c u a l d i s m i n u y e el n ú m e r o d e
s o l i c i t u d e s entre el c l i e n t e y el servidor.
almacenado.
9 2 - P r o c e d i m i e n t o s A l m a c e n a d o s (crear
ejecutar)
Al crear u n p r o c e d i m i e n t o a l m a c e n a d o , l a s i n s t r u c c i o n e s q u e c o n t i e n e se a n a l i z a n
situación.
U n p r o c e d i m i e n t o a l m a c e n a d o se invoca l l a m á n d o l o .
E n p r i m e r l u g a r se d e b e n t i p e a r y probar l a s i n s t r u c c i o n e s q u e se i n c l u y e n en el
p r o c e d i m i e n t o a l m a c e n a d o , l u e g o , si se o b t i e n e el resultado e s p e r a d o , se crea el
procedimiento.
f u n c i o n e s d e f i n i d a s p o r el u s u a r i o , a otros p r o c e d i m i e n t o s a l m a c e n a d o s .
i n s t r u c c i o n e s D M L ( d e m a n i p u l a c i ó n d e d a t o s , como i n s e rt , u p d a t e , d e l a t e ) , no
p r o c e d u r e " . La s i n t a x i s b á s i c a p a r c i a l e s :
as
be g i n
INSTRUCCIONES
end;
Para d i f e r e n c i a r l o s p r o c e d i m i e n t o s a l m a c e n a d o s d e l s i s t e m a de l o s p r o c e d i m i e n t o s
el n o m b r e .
C o n l a s s i g u i e n t e s i n s t r u c c i o n e s creamos u n p r o c e d i m i e n t o a l m a c e n a d o l l a m a d o
as
p r o c e d i m i e n t o y s e g u i d o de "as" l a s s e n t e n c i a s q u e d e f i n e n el p r o c e d i m i e n t o .
execute pa_libros_aumentar10;
E l i m i n a m o s el p r o c e d i m i e n t o a l m a c e n a d o l l a m a d o " p a _ l i b r o s _ a u m e n t a r 1 0 " :
i n d i c a n d o tal s i t u a c i ó n .
P o d e m o s e l i m i n a r u n a t a b l a referenciada en u n p r o c e d i m i e n t o a l m a c e n a d o , Oracle lo
p o r q u e l a t a b l a referenciada no existe.
el n u e v o p r o c e d i m i e n t o r e e m p l a z a a l anterior.
94 - Procedimientos almacenados (parámetros de entrada)
Veamos los primeros. Los parámetros de entrada p o s i b i l i t a n pasar información a un procedimiento. Para q u e un
as
begin
INSTRUCCIONES;
end;
Los parámetros se definen l u e g o del nombre del procedimiento. Pueden declararse varios parámetros por procedimiento,
C u a n d o el procedimiento es ejecutado, deben explicitarse valores para cada u n o de los parámetros (en el orden q u e
fueron d e f i n i d o s ) , a menos q u e se haya definido un valor por defecto, en tal caso, pueden omitirse.
Creamos un procedimiento q u e recibe el nombre de u n a editorial como parámetro y l u e g o lo utiliza para aumentar los
as
be g i n
where editorial=aeditorial;
end;
El procedimiento se ejecuta colocando "execute" ( o "exec") s e g u i d o del nombre del procedimiento y un v a l o r para el
parámetro:
execute pa_libros_aumentar10('Planeta');
asume el procedimiento al ser ejecutado si no recibe parámetros. Si no se coloca valor por defecto, un procedimiento
definido con parámetros no puede ejecutarse s i n valores para e l l o s . El v a l o r por defecto puede ser " n u l l " o u n a constante.
Creamos otro procedimiento q u e recibe 2 parámetros, el nombre de u n a editorial y el valor de incremento ( q u e tiene por
as
be g i n
where editorial=aeditorial;
end;
El procedimiento se ejecuta colocando "execute" ( o "exec") s e g u i d o del nombre del procedimiento y los valores para los
execute pa_libros_aumentar('Planeta',30);
Podemos o m i t i r el s e g u n d o parámetro al invocar el procedimiento porque tiene establecido u n valor por defecto:
execute pa_libros_aumentar('Planeta');
En caso q u e u n procedimiento tenga definidos varios parámetros con valores por defecto y al invocarlo colocamos u n o
s o l o , Oracle a s u m e q u e es el primero de e l l o s . si son de tipos de datos diferentes, Oracle los convierte. Por ejemplo,
as
be g i n
end;
Si l u e g o l l a m a m o s al procedimiento e n v i á n d o l e s solamente el p r i m e r y cuarto parámetro correspondientes al título y
precio:
execute pa_libros_insertar('Uno',100);
Uno,100,sin especificar,0;
9 5 - P r o c e d i m i e n t o s a l m a c e n a d o s (variables)
Los p r o c e d i m i e n t o s a l m a c e n a d o s p u e d e n c o n t e n e r en su d e f i n i c i ó n , v a r i a b l e s l o c a l e s ,
q u e existen d u r a n t e el p r o c e d i m i e n t o .
siguiente:
as
NOMBREVARIABLE TIPO;
be g i n
INSTRUCCIONES;
end;
Cr ea m o s u n p r o c e d i m i e n t o q u e recibe el n o m b r e de u n l i b r o , en u n a v a r i a b l e
autor y l o s a l m a c e n a m o s en u n a t a b l a :
as
vautor varchar2;
be g i n
titulo varchar2(40),
precio number(6,2)
) ;
select titulo,precio
from libros
where autor=vautor;
end;
L u e g o de d e f i n i r u n parámetro y su t i p o , o p c i o n a l m e n t e , se p u e d e especificar u n v a l o r
(informacion)
e l l o s p u e d e n consultarse los s i g u i e n t e s d i c c i o n a r i o s :
un procedimiento almacenado.
p r o c e d i m i e n t o s q u e c o m i e n z a n con "PA":
varias d e e l l a s .
Se p u e d e n e m p l e a r l a s f u n c i o n e s d e l sistema e n c u a l q u i e r l u g a r e n el q u e se permita u n a
expresión en u n a s e n t e n c i a "select".
p r o c e d i m i e n t o s , l a s f u n c i o n e s t i e n e n u n a cabecera, u n a sección d e d e c l a r a c i ó n d e v a r i a b l e s y
"return".
error i n d i c a n d o tal s i t u a c i ó n .
La s i n t a x i s básica parcial e s :
return TIPODEDATO is
DECLARACION DE VARIABLES
be g i n
ACCIONES;
return VALOR;
end;
como a r g u m e n t o con el i n c r e m e n t o d e l 1 0 % :
return number
is
be g i n
return avalor+(avalor*0.1);
end;
Podemos e m p l e a r l a s f u n c i o n e s e n c u a l q u i e r l u g a r e n e l q u e se permita u n a e x p r e s i ó n e n u n a
s e n t e n c i a "select", p o r e j e m p l o :
d e v u e l t o por l a f u n c i ó n .
La s i g u i e n t e f u n c i o n recibe 2 parámetros, u n v a l o r a i n c r e m e n t a r y el i n c r e m e n t o y retorna el
argumento:
return number
is
be g i n
return avalor+(avalor*aincremento/100);
end;
d e v u e l t o por la f u n c i ó n .
por e j e m p l o :
a v e r i g u a r si el v a l o r e n v i a d o como argumento es m e n o r o i g u a l a 2 0 , si l o e s , a l m a c e n a m o s en
"val orretornado":
return varchar
is
valorretornado varchar(20);
be g i n
valorretornado:=' ' ;
if avalor<=20 then
valorretornado:='economico';
else valorretornado:='costoso';
end if;
return valorretornado;
end;
un valor siempre.
Para a s i g n a r u n v a l o r a u n a v a r i a b l e , dentro de u n a f u n c i ó n D E B E u s a r s e " : = " (dos puntos e
igual).
Por e j e m p l o :
return number
is
be g i n
return (avalorl+avalor2)/2;
end;
L l a m a m o s a l a f u n c i ó n "f_ p r o m e d i o " :
c o n d i c i o n a l e s . existen 2 : if y c a s e .
c o n t r o l a n l a ejecución de l a s s e n t e n c i a s , l o s b l o q u e s de s e n t e n c i a s y p r o c e d i m i e n t o s
de s e n t e n c i a s diferente.
Sintaxis:
if (CONDICION) then
else
end if;
9 9 - C o n t r o l de f l u j o ( c a s e )
A p r e n d i m o s q u e el "if' se e m p l e a b a c u a n d o t e n í a m o s 2 cursos d e a c c i ó n , es d e c i r , se
e v a l ú a u n a c o n d i c i ó n y se ejecutan diferentes b l o q u e s de s e n t e n c i a s s e g ú n e l
c o n d i c i ó n resulta verdadera y c u a n d o es f a l s a , si q u e r e m o s m á s o p c i o n e s p o d e m o s
usar "case".
Sintaxis:
case VALORACOMPARAR
else SENTENCIAS;
end case;
finalizado.
fecha e n v i a d a como a r g u m e n t o :
return varchar2
is
mes varchar2(20);
be g i n
mes:='enero';
else mes:='diciembre';
end case;
return mes;
end;
S i probamos l a f u n c i ó n a n t e r i o r e n v i á n d o l e la s i g u i e n t e fecha:
trimestre d e l a ñ o :
return varchar2
is
mes varchar2(20);
trimestre number;
begin
trimestre:=4;
case mes
else trimestre:=4;
end case;
return trimestre;
end;
u n error:
case mes
end case;
"begin . . . end".
función anterior:
select nombre,fechanacimiento,
when 1 then 1
when 2 then 1
when 3 then 1
when 4 then 2
when 5 then 2
when 6 then 2
when 7 then 3
when 8 then 3
when 9 then 3
else 4
end as trimestre
from empleados
order by trimestre;
1 0 0 - C o n t r o l de flujo ( l o o p )
c o m b i n a u n a c o n d i c i ó n y la p a l a b r a "exit".
Sintaxis:
loop
SENTENCIAS;
SENTENCIAS;
end loop;
se repite el b u c l e .
La s i n t a x i s anterior es e q u i v a l e n t e a l a s i g u i e n t e :
loop
SENTENCIAS
if CONDICION then
exit;
end if;
SENTENCIAS
end loop;
d e c i r , 6 veces.
declare
resultado number;
multiplicador number:=0;
begin
loop
resultado:=3*multiplicador;
multiplicador:=multiplicador+l;
end loop;
end;
En el s i g u i e n t e e j e m p l o se muestra la t a b l a d e l 4 . Se va i n c r e m e n t a n d o l a v a r i a b l e
v a r i a b l e resultado l l e g a o supera el v a l o r 5 0 .
declare
resultado number;
multiplicador number:=0;
begin
loop
resultado:=4*multiplicador;
multiplicador:=multiplicador+l;
end loop;
end;
loop" f i n a l i z a n d o el b u c l e .
1 O1 - C o n t r o l de flujo (for)
C o n t i n u a m o s con "for".
uno.
Sintaxis:
SENTENCIAS;
end loop;
N O se d e f i n e , se d e f i n e a u t o m á t i c a m e n t e d e t i p o entero al i n i c i a r el b u c l e y se l i b e r a r á
al finalizarlo.
l l e g a a 5 (1 í m i t e s u p e r i o r d e l for), c u a n d o l l e g a a 6 , el b u c l e f i n a l i z a .
be g i n
for f i n 0 . . 5 loop
end loop;
end;
cero:
be g i n
end loop;
end;
be g i n
for f i n 2 . . 3 loop
dbms_output.put_line('tabla del ' 1 lto_char(f));
for g i n 1 . . 9 loop
end;
1 0 2 - C o n t r o l de f l u j o (whi le l o o p )
V i m o s q u e l a s s e n t e n c i a s repetitivas p e r m i t e n ejecutar u n a s e c u e n c i a d e s e n t e n c i a s
varias veces.
i n s t r u c c i o n e s ) s i e m p r e q u e l a c o n d i c i ó n sea verdadera.
Sintaxis básica:
SENTENCIAS
end loop;
s e g u n d o s i e m p r e se ejecuta, a l m e n o s u n a vez, en c a m b i o el p r i m e r o p u e d e no
falsa.
E n el s i g u i e n t e e j e m p l o se muestra l a t a b l a d e l 3 hasta el 5 :
declare
numero number:=0;
resultado number;
begin
resultado:=3*numero;
numero:=numero+l;
end loop;
end;
v a r i a b l e " n u m e r o " en 1 .
H a c e m o s el s e g u i m i e n t o : c u a n d o se i n i c i a el b u c l e , l a v a r i a b l e " n u m e r o " t i e n e el v a l o r
ejecutar l a s s e n t e n c i a s ( r e s u l t a d o a l m a c e n a 3 , se i m p r i m e ( 3 ) , se g u a r d a en n u m e r o
se v u e l v e n a ejecutar l a s s e n t e n c i a s ( r e s u l t a d o a l m a c e n a 6 , se i m p r i m e , se g u a r d a
m e n o r q u e 5 ) , se v u e l v e n a ejecutar l a s s e n t e n c i a s ( r e s u l t a d o a l m a c e n a 9 , se
i m p r i m e , se g u a r d a en n u m e r o e l v a l o r 4 ) , se v u e l v e a e v a l u a r l a c o n d i c i ó n , como
a l m a c e n a 1 2 , se i m p r i m e , se g u a r d a en n u m e r o el v a l o r 5 ) , se vuelve a e v a l u a r l a
s e n t e n c i a s ( r e s u l t a d o a l m a c e n a 1 5 , se i m p r i m e , se g u a r d a en n u m e r o el v a l o r 6 ) , se
s a l e d e l a estructura.
1 0 3 - Disparador (trigger)
u n a t a b l a (o vista) a s o c i a d a al d i s p a r a d o r .
m o d i f i c a d a ; etc.
S i se i n t e n t a m o d i f i c a r (agregar, a c t u a l i z a r o e l i m i n a r ) datos de u n a t a b l a a s o c i a d a a u n
asociada a u n d i s p a r a d o r , el d i s p a r a d o r se ejecuta a u t o m á t i c a m e n t e .
de c o n s u l t a s .
S i n t a x i s g e n e r a l para crear u n d i s p a r a d o r :
on NOMBRETABLA
when CONDICION--opcional
begin
end NOMBREDISPARADOR;
B E F O R E ( a n t e s ) , A F T E R ( d e s p u é s ) o I N S T E A D O F (en l u g a r d e ) . "before" s i g n i f i c a q u e
s e n t e n c i a ( n i antes n i d e s p u é s ) .
" E V E N T O " especifica la operación ( a c c i ó n , t i p o de m o d i f i c a c i ó n ) q u e causa q u e el t r i g g e r
se d i s p a r e (se active), p u e d e ser " i n s e rt " , " u p d a t e " o " d e l e t e " ; D E B E colocarse a l m e n o s
l a s c o n d i c i o n e s q u e d e t e r m i n a n c u a n d o u n i n t e n t o de i n s e r c i ó n , a c t u a l i z a c i ó n o borrado
E n t o n c e s , u n d i s p a r a d o r es u n b l o q u e de c ó d i g o asociado a u n a t a b l a q u e se d i s p a r a
tabla.
d i s p a r a r á , q u é evento lo d e s e n c a d e n a r á ( i n s e r c i ó n , a c t u a l i z a c i ó n o b o r r a d o ) , sobre q u é
t a b l a (o vista) y l a s i n s t r u c c i o n e s q u e se ejecutarán.
sentencia.
s e n t e n c i a s sobre l a t a b l a .
sentencia).
Consideraciones generales:
( i n s e r c i ó n , borrado, a c t u a l i z a c i ó n ) y todas l a s c l á u s u l a s a d i c i o n a l e s .
1 0 4 - Disparador ( i n f o r m a c i ó n )
diccionarios:
- "user_objects": nos muestra todos los objetos d e la base de datos s e l e c c i o n a d a , i n c l u i d o s los triggers.
- "user_triggers": nos muestra todos los triggers de l a base d e datos a c t u a l . Muestra el nombre d e l
sentencia
( i n s e r c i ó n , actualización o borrado).
" i n s e rt t r i g e r " .
q u e se i n t e n t e n i n g r e s a r datos en l a t a b l a :
MOMENTO insert
on NOMBRETABLA
begin
end NOMBREDISPARADOR;
Analizamos la sintaxis:
defecto si no se especifica.
Las s i g u i e n t e s s e n t e n c i a s d i s p a r a n u n t r i g g e r de i n s e r c i ó n :
.
insert into TABLA values . . . ,
befare insert
on libros
begin
end tr_ingresar_libros;
A n a l i z a m o s el t r i g g e r anterior:
La s i g u i e n t e es la s i n t a x i s para crear u n t r i g g e r de i n s e r c i ó n a n i v e l de f i l a , se d i s p a r e u n a
MOMENTO insert
on NOMBRETABLA
be g i n
end NOMBREDISPARADOR;
tabla "ofertas":
befare insert
on ofertas
begin
end tr_ingresar_ofertas;
s e n t e n c i a y de fila)
( i n s e r c i ó n , actualización o borrado).
"delate triger".
vez q u e se e l i m i n e n registros de l a t a b l a :
MOMENTO delete
on NOMBRETABLA
begin
end NOMBREDISPARADOR;
B E F O R E ( a n t e s ) o A F T E R ( d e s p u é s ) . Se especifica el evento q u e c a u s a q u e el
befare delete
on libros
be g i n
end tr_borrar_libros;
1 0 8 - Disparador de a c t u a l i z a c i o n a n i v e l de
s e n t e n c i a (update trigger)
( i n s e r c i ó n , actualización o borrado).
"update triger".
La s i g u i e n t e es l a s i n t a x i s para crear u n t r i g g e r de a c t u a l i z a c i ó n a n i v e l de s e n t e n c i a ,
MOMENTO update
on NOMBRETABLA
statement
begin
end NOMBREDISPARADOR;
"statement" s i g n i f i c a q u e es u n t r i g g e r a n i v e l de s e n t e n c i a , es d e c i r , se d i s p a r a u n a
Las s i g u i e n t e s s e n t e n c i a s d i s p a r a n u n t r i g g e r de i n s e r c i ó n :
befare update
on libros
begin
end tr_actualizar_libros;
fila ( u p d a t e trigger)
asociada.
MOMENTO update
on NOMBRETABLA
begin
end NOMBREDISPARADOR;
befare update
on libros
be g i n
end tr_actualizar_libros;
c a m p o s ( u p d a t e trigger)
E l t r i g g e r d e a c t u a l i z a c i ó n (a n i v e l de s e n t e n c i a o de f i l a ) permite i n c l u i r u n a lista de
c a m p o s . S i se i n c l u y e el n o m b r e d e u n c a m p o ( o v a r i o s ) l u e g o de " u p d a t e " , e l t r i g g e r
se d i s p a r a r á ú n i c a m e n t e c u a n d o a l g u n o de esos c a m p o s ( i n c l u i d o s en la l i s t a ) es
a c t u a l i z a d o . S i se o m i t e l a lista de c a m p o s , el t r i g g e r se d i s p a r a c u a n d o c u a l q u i e r
c a m p o s de l a t a b l a .
La l i s t a de c a m p o s s o l a m e n t e p u e d e especificarse en d i s p a r a d o r e s de a c t u a l i z a c i ó n ,
n u n c a en d i s p a r a d o r e s de i n s e r c i ó n o borrado.
Sintaxis general:
on TABLA
begin
CUERPODEL DISPARADOR;
end NOMBREDISPARADOR;
m o d i f i c a d o s . P u e d e n i n c l u i r s e m á s de u n o , en tal c a s o , se s e p a r a n con c o m a s .
on libros
be g i n
end tr_actualizar_precio_libros;
operación ( i n s e r c i ó n , a c t u a l i z a c i ó n o b o r r a d o ) .
on NOMBRETABLA
be g i n
end NOMBREDISPARADOR;
desencadenador.
"updating" y "deleting".
eventos " i n s e rt " , " u p d a t e " y " d e l e t e " ; c u a n d o se modifican los datos d e " l i b r o s " , se
q u e alteró l a t a b l a :
on libros
begin
if inserting then
end if;
if updating then
end if;
if deleting then
end if;
end tr_cambios_libros;
.
insert into TABLA values . . . ,
":new.CAMPO" y ":old.CAMPO".
la tabla.
p u e d e ser m o d i f i c a d o .
E n e l cuerpo el trigger, los c a m p o s " o l d " y "new" d e b e n estar precedidos p o r " : " (dos p u n t o s ) ,
Veamos u n e j e m p l o .
on libros
be g i n
insert into control values(user,sysdate,:new.codigo,:old.precio,:new.precio);
end tr_actualizar_precio_libros;
C u a n d o el t r i g g e r se d i s p a r e , antes de i n g r e s a r l o s valores a l a t a b l a , a l m a c e n a r á en
valor.
on libros
be g i n
if (:new.precio>50) then
:new.precio:=floor(:new.precio);
end if;
end tr_actualizar_precio_libros;
almacenará "54".
on libros
be g i n
end tr_libros;
Limitaciones de "when":
- no p u e d e c o n t e n e r s u b c o n s u l t a s , f u n c i o n e s a g r e g a d a s n i f u n c i o n e s d e f i n i d a s por el
usuario;
on libros
begin
:new.precio : = round(:new.precio);
end tr_precio_libros;
" l i b r o s " o u n " u p d a t e " sobre "precio" d e " l i b r o s " . Se ejecuta u n a vez por cada f i l a
a "50".
on libros
begin
if :new.precio>50 then
:new.precio := round(:new.precio);
end if;
end tr_precio_libros;
d i s p a r a d o r , el t r i g g e r se d i s p a r a y l u e g o se controla el precio, s i c u m p l e la c o n d i c i ó n ,
se modifica el precio, s i n o n o .
Por e j e m p l o , l a s i g u i e n t e s e n t e n c i a :
E n u n t r i g g e r d e a c t u a l i z a c i ó n a n i v e l d e f i l a , se p u e d e especificar e l n o m b r e d e u n c a m p o e n l a
Sintaxis básica:
MOMENTO update . . .
begin
end if;
end NOMBREDISPARADOR;
a c t u a l i z a r s e c u a l q u i e r otro c a m p o , se a l m a c e n a en l a t a b l a "control" e l n o m b r e d e l u s u a r i o q u e
befare update
on libros
be g i n
else
end if;
end tr_actualizar_libros;
1 1 5 - Disparadores ( h a b i l i t a r y d e s h a b i l i t a r )
U n d i s p a r a d o r p u e d e estar en d o s estados: h a b i l i t a d o ( e n a b l e d ) o d e s h a b i l i t a d o
(disabled).
S i n t a x i s para d e s h a b i l i t a r u n t r i g g e r :
E j e m p l o : D e s h a b i l i t a m o s el t r i g g e r "tr_ingresar_empleados":
Se p u e d e n h a b i l i t a r o d e s h a b i l i t a r todos l o s t r i g g e r e s t a b l e c i d o s sobre u n a t a b l a
e s p e c i f i c a , se e m p l e a l a s i g u i e n t e s e n t e n c i a ;
P o d e m o s s a b e r si u n t r i g g e r está o no h a b i l i t a d o c o s u l t a n d o el d i c c i o n a r i o
Para e l i m i n a r u n t r i g g e r se e m p l e a l a s i g u i e n t e s e n t e n c i a :
Ejemplo:
e m p l e a n d o el p r o c e d i m i e n t o "raise_application_error".
Sintaxis:
raise_application_error (NUMERO,TEXTO);
d e error i n d i c á n d o l o :
befare update
on libros
be g i n
if updating('codigo') then
else
end if;
end;
i n c l u y e los p e r m i s o s q u e d i s p o n d r e m o s d u r a n t e la c o n e x i ó n ; estos p e r m i s o s se
definen a p a rt i r d e u n n o m b r e de u s u a r i o .
l o s u s u a r i o s q u e pertenezcan a tal r o l .
u s u a r i o s de u n g r u p o ) .
de u s u a r i o y de l o s roles a l q u e pertenezca d i c h o u s u a r i o .
de s u s objetos.
( p o r e j e m p l o "system").
están a l m a c e n a d o s dentro de u n t a b l e s p a c e .
usuario.
Ejemplo:
" j u a n c i t o " , se le a s i g n a u n e s p a c i o d e 1 0 0 m b :
i n d i c a n d o tal s i t u a c i ó n .
entre otros.
L u e g o de crear u n u s u a r i o , a ú n no p o d e m o s conectarnos, ya q u e no t e n e m o s
objetos de l a m i s m a .
C o m o m í n i m o , u n u s u a r i o d e b e t e n e r p e r m i s o para conectarse.
E l p e r m i s o "create s e s s i o n " es u n p r i v i l e g i o d e s i s t e m a .
Sintaxis básica:
to USUARIO;
c o n e x i ó n ) con el n o m b r e d e l u s u a r i o ; no se a b r i r á l a n u e v a conexión s i :
a ) el u s u a r i o para q u i e n q u i e r e a b r i r u n a n u e v a s e s i ó n n o existe,
b) l a contraseña es incorrecta o
S i c o n s u l t a m o s el d i c c i o n a r i o "user_sys_privs" o b t e n d r e m o s l a m i s m a i n f o r m a c i ó n
q u e "dba_sys_privs" pero ú n i c a m e n t e d e l u s u a r i o a c t u a l .
P o d e m o s a v e r i g u a r el n o m b r e d e l u s u a r i o conectado con la s i g u i e n t e s e n t e n c i a :
t i p o s : a ) d e l s i s t e m a y b) sobre objetos.
H e m o s a p r e n d i d o a c o n c e d e r u n p r i v i l e g i o de s i s t e m a : "create s e s s i o n " , q u e es
i m p o rt a n t e s l o s p e r m i s o s d e creación d e objetos.
A p r e n d a m o s m á s sobre l o s p r i v i l e g i o s d e s i s t e m a .
de datos.
- create t a b l e : crear t a b l a s ;
- create s e q u e n c e : crear s e c u e n c i a s ;
- create v i e w : crear v i s t a s ;
- create t r i g g e r : crear d i s p a r a d o r e s en su p r o p i o e s q u e m a ;
- create p r o c e d u r e : crear p r o c e d i m i e n t o s y f u n c i o n e s ;
- execute a n y p r o c e d u r e : ejecutar c u a l q u i e r p r o c e d i m i e n t o en c u a l q u i e r e s q u e m a ;
- create r o l e : crear r o l e s ;
- drop u s e r : e l i m i n a r u s u a r i o s .
Sintaxis básica:
grant PERMISODESISTEMA
to USUARIO;
O r a c l e permite c o n c e d e r m ú l t i p l e s p r i v i l e g i o s a m ú l t i p l e s u s u a r i o s en u n a m i s m a
s e n t e n c i a , d e b e m o s separarlos por c o m a s .
y "ana":
to juan, ana;
usuario "ana":
to ana;
E n el s i g u i e n t e e j e m p l o se conceden 2 p e r m i s o s a 2 u s u a r i o s en u n a s o l a s e n t e n c i a :
to juan, ana;
l o s d i s t i n t o s u s u a r i o s ; y c o n s u l t a n d o "user_sys_privs" obtendremos l a m i s m a
información pero ú n i c a m e n t e d e l u s u a r i o a c t u a l .
1 2 2 - Privilegios d e l sistema (with a d m i n
option)
Sintaxis:
grant PERMISODESISTEMA
to USUARIO
t a b l a s a otros u s u a r i o s :
to juan
- g r a n t e e : el n o m b r e d e l u s u a r i o ,
- p r i v i l e g e : el p e r m i s o y
- a d m i n _ o p t i o n : si el p e r m i s o a d q u i r i d o p u e d e ser c e d i d o a otros o n o , Y E S o N O .