( OCA )
Examen 1
Introducción a SQL
El texto cubre la mayor parte de la materia ( la referida a SQL de Oracle, que supone un 85% del
contenido del primer examen ) incluida en dicho primer examen.
La exposición se ha ido realizando primando criterios de practicidad sobre retórica, sin perder por ello
un ápice de rigurosidad, y de este modo incrementando el carácter útil que siempre ha guiado el
desarrollo del documento.
Todos los comandos incluidos en el mismo no presentan una sintaxis completa, sino las opciones más
utilizadas en cada uno de los mismos. Para conocer todas y cada una de las opciones de cada
comando es necesario consultar el Manual de Referencia editado por el propietario del producto
( Oracle Corporation).
ALL: Es el valor por defecto. Devuelve todas las filas recuperadas, incluidas las repetidas ( esta
cláusula está en desuso).
HAVING : Se usa para restringir qué grupos de filas obtenidas por el GROUP BY son devueltas por la
consulta.
DISTINCT : Permite obtener una sola copia de el/los valor/es duplicado/s de columna/s.
Ejemplo:
JOB
---------
ANALYST
CLERK
MANAGER
SQL> SELECT DISTINCT JOB,MGR FROM emp; No son necesarios los paréntesis
JOB MGR
--------- -----
ANALYST 7566 Se puede repetir el JOB, pero no la combinación JOB+MGR
ANALYST
CLERK 7698
CLERK 7782
CLERK 7788
CLERK 7902
MANAGER 7839
GROUP BY: Sirve para agrupar filas. La ordenación de los grupos es, por defecto, ascendente.
ORDER BY: Sirve para ordenar las filas recuperadas por la SELECT. La ordenación es, por defecto,
ascendente.
Nota3: Si los valores incluidos en el conjunto IN son fechas, éstas son convertidas implícitamente de
cadenas de caracteres ( CHAR, VARCHAR2 ) a tipo DATE.
Ejemplo:
Nota4: Si los valores incluidos en el conjunto IN son literales carácter que representan números
( todos sus caracteres son dígitos numéricos ) y el campo con el que se está comparado es numérico,
se realizarán una conversión implícita de CHAR / VARCHAR2 a NUMBER.
Ejemplo:
Nota6: Las sentencias de tipo ‘campo1 NOT IN (x1,x2,...,xN )’ se transforman internamente en:
Campo1<> x1 AND campo1 <> x2.....AND campo1 <> xN.
Ejemplo:
SQL> SELECT * FROM emp ORDER BY SAL+COMM DESC; Se ordena por una expresión
Los primeros registros que aparecen son los que poseen COMM = NULL, puesto que
para ellos la expresión SAL+COMM evalúa a NULL y como la ordenación es DESCENDENTE,
los nulos se muestran primero.
Nota7: Se puede colocar un ORDER BY en una sentencia SELECT que incluya la cláusula DISTINCT.
Ejemplo:
JOB MGR
--------- -----
ANALYST 7566
ANALYST
CLERK 7698
CLERK 7902
MANAGER 7839
Ejemplo:
Para que el patrón de búsqueda pueda contener los caracteres ‘_’ y ‘%’ se usa la cláusula ESCAPE
Si además, se quiere buscar el caracteres Escape dentro del patrón, se debe escribir dos veces.
Ejemplo:
Si el carácter ESCAPE es ‘/’ , para buscar la cadena ‘Cliente/Servidor’ se puede especificar un patrón
del tipo ‘%Cliente//Servidor%’
Operador Descripción
NOT columna1 = No es igual a
NOT columna1 > No es mayor que
Usando Pseudocolumnas
Una pseudocolumna se comporta como una columna de la tabla, pero no está almacenada en ninguna
tabla. Sobre una pseudocolumna sólo se puede realizar operación de SELECT.
ROWID: Por cada fila recuperada, la pseudocolumna ROWID devuelve la dirección física de la fila. Los
índices contienen ROWIDs .
Ejemplos:
SQL> SELECT * FROM emp WHERE ROWNUM<2; devuelve sólo la primera fila
No devuelve ninguna fila, puesto que la primera fila devuelta tiene un ROWNUM=1 y
no cumple la condición, la segunda, vuelve a ser la posible primera, con lo que
ROWNUM=1 y tampoco cumple la condición y así sucesivamente.
Expresiones aritméticas
Una expresión aritmética puede contener:
a) Nombres de columnas
b) Constantes numéricas
c) Operadores aritméticos ( + , - , * , / )
Ejemplo:
SELECT ename,sal,sal*0.1
FROM emp
Si una expresión aritmética contiene más de un operador, ésta se evaluará según la prioridad de éstos.
• *, / ( más prioridad )
• +, - ( menos prioridad )
Ejemplo:
Cualquier operación que se haga con un valor NULL devuelve un NULL. Así, por ejemplo, si se intenta
realizar una división por cero se obtiene un error ( excepción ZERO_DIVIDE ), pero si se intenta dividir
por NULL, el resultado es NULL ( no se produce error ).
Ejemplo:
NOMBRE SUELDO
---------- ----------
SMITH El cálculo devuelve NULL
ALLEN 19500
Función NVL
Convierte un valor nulo (NULL) en otro valor.
Ejemplos:
Aunque generalmente los tipos de datos del “valor si NULL” (expr2) y expr1 deben coincidir, ORACLE
ejecuta muchas conversiones implícitas de tipos sobre expr2.
Ejemplo:
Dado que la columna COMM está definida de tipo NUMBER, Oracle realiza una
conversión implícita de CHAR a NUMBER ( de ‘0’ (CHAR) a 0 (NUMBER)).
Los alias de columna pueden ser utilizados, después del FROM, únicamente en una cláusula ORDER
BY (ni en GROUP BY, ni en condiciones del WHERE, ni en HAVING, etc...). Sin embargo, los alias de
tabla se pueden utilizar en cualquier cláusula posterior y anterior al FROM.
Ejemplo:
NOMBRE
----------
SMITH
ALLEN
Las constantes de tipo fecha y de tipo carácter deben estar encerradas entre comillas simples (Eje:
‘Hola’,’12-FEB-02’,..). Sin embargo, las constantes numéricas no necesitan ir entre comillas (Eje: 3.25,
4,..).
Oracle realiza conversiones implícitas de tipo ( para pasar todas las columnas implicadas a tipo
carácter).
Ejemplo:
SQL> SELECT ename||' '||sal||' '|| (1+2)||' '|| hiredate AS "Chorizo" FROM emp;
Chorizo
--------------------------------------------------------------
SMITH 800 3 17/12/80 La expres.(1+2) se evalúa y después se concatena
ALLEN 1600 3 20/02/81 Se convierte de tipo Date y Number a Char
.....
JOIN
Se utilizan para recuperar datos de más de una tabla. El enlace entre tablas se realiza en base a
valores comunes de columnas de las distintas tablas.
Cuando se escriban sentencias SELECT que enlazan tablas, es conveniente preceder cada columna
de la tabla con el nombre de la misma ó con el alias definido correspondiente, para mejorar el
rendimiento de la BD.
Nota1: Para enlazar “n” tablas se necesita un mínimo de “n-1” condiciones de join ( para claves
compuestas de más de una columna, el número de condiciones se incrementa considerablemente).
OUTER JOIN (+): Visualiza filas que no cumplen la condición de join debido a que no existe
correspondencia en una tabla ( existen valores NULL ) para algunos valores de la otra tabla.
El operador se coloca en la columna de la tabla dónde no hay valor para enlazar. El operador (+)
puede ser colocado en cualquier lado de la igualdad, pero no en los dos.
En una condición que incluya un OUTER-JOIN no se puede usar el operador IN ,ni ser enlazada a otra
condición con el operador OR. Sí se puede utilizar el operador AND.
Ejemplo:
Nota2: Si dos tablas son enlazadas por múltiples condiciones de JOIN, se debe usar en todas el
operador (+).
Nota3: Una condición no puede comparar una columna marcada con el operador (+) con una
subconsulta.
Ejemplo:
Funciones de fila:
Los diferentes tipos de funciones de fila se agrupan en los siguientes conjuntos:
a) Funciones de CARÁCTER.
b) Funciones de NÚMERO.
c) Funciones de FECHA.
d) Funciones de CONVERSIÓN.
e) Funciones GENERALES.
Funciones de CARÁCTER
Funciones de NÚMERO
ROUND(colum1|expr1,n): Redonde a ‘n’ decimales. Si ‘n’ es omitido, quita los decimales, redondeando
previamente. Si ‘n’ es negativo, redondea la parte entera (si ‘n’=-1 redondea a la decena más próxima,
si ‘n’ =-2 redondea a la centena más próxima ). Si ‘n’ es negativo y su valor es mayor ó igual que el
número de dígitos de la parte entera, el resultado será cero.
TRUNC(colum1|expr1,n): Trunca a ‘n’ decimales. Si ‘n’ es omitido, quita los decimales. Si ‘n’ es
negativo, trunca la parte entera.
Fechas en Oracle
Oracle almacena las fechas en un formato numérico interno, representando el siglo,el año, el mes,el
día, la hora, los minutos y los segundos. El formato de visualización y entrada de datos, por defecto, es
‘DD-MON-YY’ ( este formato por defecto puede ser cambiado, tanto a nivel de la Base de Datos, cómo
a nivel de Sesión ).
SYSDATE es una función que devuelve la fecha y la hora actual. Esta función se puede usar como
cualquier otra columna. No es necesario usar la tabla DUAL para recuperar la fecha y hora actual.
Ejemplo:
EMPNO SYSDATE
----- -----------
7369 14/05/02 19:37:52
7499 14/05/02 19:37:52
SYSDATE
-----------
14/05/02 19:38:14
Nota1: La tabla DUAL pertenece al usuario SYS y puede ser usada por todos los usuarios. Contiene
una sola columna, DUMMY, y una sola fila con el valor X. La tabla DUAL es útil cuando quieres
obtener un valor único ( una expresión que no implica ninguna columna de una tabla, una fecha, etc...).
Ejemplo:
DUMMY
-----
X
Ejemplo:
Funciones de Fecha:
Función Descripción
MONTHS_BETWEEN(fecha1,fecha2) Calcula el número de meses ( con parte
entera y decimal ) entre dos fechas. El
resultado puede ser negativo ó positivo. Si
fecha1 es posterior a fecha2 el resultado
será positivo.
ADD_MONTHS(fecha, n) Añade ‘n’ ( debe ser entero ) meses a la
fecha. ‘n’ puede ser positivo ó negativo.
NEXT_DAY(fecha,’día_de_la_semana’|posic) Devuelve la fecha del próximo día de la
semana especificado como segundo
parámetro ( el nombre del día depende del
idioma configurado en la BD), siguiente a la
fecha pasada como primer parámetro.
También se puede indicar, en lugar del día
de la semana, un número representado el
día de la semana (1 Lunes, 2
Martes,...).
LAST_DAY(fecha) Devuelve la fecha del último día del mes
correspondiente al mes de la fecha que se
pasa como parámetro
ROUND(fecha[,’formato’]) Devuelve la fecha redondeada a la unidad
especificada en el formato. Si se omite el
formato, la fecha se redondea al día más
próximo
Ejemplos:
SYSDATE
-----------
15/05/02 12:02:41
NEXT_DAY(SYSDATE,1)
-------------------
20/05/02 12:02:55 Será la fecha del próximo Lunes ( 1er día de la semana )
LAST_DAY(SYSDATE)
-----------------
31/05/02 12:03:08
ROUND(SYSDATE,'MONTH')
----------------------
01/05/02
ROUND(SYSDATE,'YEAR')
---------------------
01/01/02
TRUNC(SYSDATE,'MONTH')
----------------------
01/05/02
TRUNC(SYSDATE,'YEAR')
---------------------
01/01/02
Como vemos, las funciones TRUNC y ROUND puede ser utilizadas para números y fechas. Cuando se
utilizan con fechas, éstas se truncan ó redondean según el formato pasado como parámetro.
Conversiones implícitas:
Desde A
VARCHAR2 ó CHAR (*) NUMBER
VARCHAR2 ó CHAR (*) DATE
NUMBER VARCHAR2
DATE VARCHAR2
Ejemplos:
SUMA
----------
3
SALU
-------------
HOLA5
'DÍA:'||'12-OCT-74'
-------------------
DÍA: 12-OCT-74
Conversiones explícitas:
Función Objetivo
TO_CHAR(numero|fecha [, ‘formato’]) Convierte un número ó una fecha a una
cadena de caracteres VARCHAR2 usando
el formato pasado como parámetro
TO_NUMBER(cadena) Convierte una cadena de caracteres que
contiene dígitos numéricos a un NUMBER
TO_DATE(cadena [, ‘formato’] Convierte una cadena de caracteres
TO_CHAR:
Por defecto, todas las fechas se visualizan utilizando el formato por defecto especificado en la
configuración de la BD (normalmente, ‘DD-MON-YY). El usuario puede cambiar la forma en que se
visualizan las fechas, haciendo uso de la función TO_CHAR y especificando un formato concreto.
Nota1:
- El formato debe ser especificado entre comillas simples y es sensible a mayúsculas.
- Para eliminar espacios en blanco ó ceros a la izquierda se puede utilizar el elemento de formato
‘fm’
Ejemplo:
TO_CHAR(SYSDATE,'DD-MON-YYYY')
------------------------------
15-MAY-2002
TO_CHAR(SYSDATE,'DD-MON-YYYY')
------------------------------
15-may-2002 El formato de conversión es sensible a Mayúsculas
Elemento Descripción
SCC ó CC Siglo, ‘S’ prefija fechas BC ( antes de cristo) con ’-‘
YYYY ó SYYYY Año, ‘S’ prefija fechas BC ( antes de cristo) con ’-‘
YYY,ó YY ó Y Los 3,2 y 1 últimos dígitos del año
Y,YYY Año con una coma en la posición indicada
IYYY,IYY,IY,I Los 4,3,2 y 1 últimos dígitos del año en estándar ISO
SYEAR ó YEAR Año en letras. ‘S’ prefija fechas BC ( antes de cristo) con un ‘-‘
BC ó AD Añade a la fecha el indicador de si es Después de Cristo ó Antes de Cristo
Q Cuarto de año ( número de trimestre )
MM Mes, con dos dígitos
MONTH Mes en letras
Elemento Descripción
AM ó PM Antes del mediodía ó después
A.M. ó P.M. Antes del mediodía ó después, con puntos
HH ó HH12 ó HH24 Hora del día
MI Minutos
SS Segundos
SSSS Segundos transcurridos desde las 00:00
/.,: Signos de puntuación incluidos en la fecha
“cadena” La cadena es reproducida tal cual
TH Número ordinal ( ej: ‘DDTH’ para ‘4th’)
SP Número en letras (ej: ‘DDSP’ para ‘Cuatro’)
SPTH ó THSP Número ordinal en letras (ej:’DDSPTH’ para ‘Cuarto’)
La conversión de NUMBER a VARCHAR2 haciendo uso del TO_CHAR se suele utilizar cuando se
quiere concatenar un valor numérico en un formato determinado con una cadena de caracteres
Elemento Descripción
9 Posiciones numéricas (anchura del resultado). Si el número a visualizar posee
menos dígitos que el número de dígitos del formato (número de 9 consecutivos ) se
rellena con blancos
0 Visualiza ceros por la izquierda hasta completar la longitud del formato especificado
$ Antepone el signo de dólar al número
L Coloca en la posición dónde se incluya, el símbolo de la moneda local ( configurada
en la BD mediante el parámetro NSL_CURRENCY)
. Coloca un punto decimal en la posición indicada
, Coloca una coma en la posición indicada
MI Coloca un signo menos a la derecha del número (si éste es negativo)
PR Coloca los números negativos entre ‘<’ y ‘>’
EEEE Especifica un número en notación científica
V Devuelve un valor multiplicado por 10n dónde ’n’ es el número de 9s después de la V
B Devuelve blancos para la parte entera de un número de punto fijo cuando la parte
entera es 0 ( independientemente de los 0’s que existan en el formato especificado )
TO_NUMBER:
TO_NUMBER(cadena): Convierte una cadena de caracteres en un número
Ejemplo:
TO_NUMBER('34434')
------------------
34434 Se ha convertido de tipo CHAR ó VARCHAR2 a tipo NUMBER
TO_DATE:
Ejemplo:
TO_DATE('20020522','YYYYMMDD')
------------------------------
22/05/02 Se ha convertido de tipo CHAR ó VARCHAR2 a tipo DATE
Nota1:
El elemento de formato ‘RR’ para fechas es similar al ‘YY’ pero permite especificar siglos diferentes.
Se puede usar ‘RR’ en lugar de ‘YY’ cuando el siglo del valor que se quiere convertir difiera del siglo
actual del sistema. ‘YY’ siempre asume el siglo actual.
El comportamiento de ‘RR’ se rige por la siguiente tabla:
Si se omite el valor por defecto (valor_default) se devolverá un NULL cuando la expresión no encaje
con ninguno de los patrones especificados.
Oracle convierte cada patrón, y la expresión que se están buscando, al tipo de dato del primer patrón.
Además, convierte el resultado devuelto al tipo de dato del primer resultado especificado (resultado 1).
Nota1:
En un DECODE, Oracle considera a los nulos iguales. Es decir, si columna ó expresión es NULL ,
Oracle devuelve el primer resultado asociado a un patrón que sea también NULL ( es decir, en este
caso NULL = NULL!!!! ).
En las operaciones de conjuntos, el número de columnas y tipos seleccionados en las dos consultas
deben ser iguales ( los nombres de las columnas no tienen por qué coincidir).
Operador Resultado
INTERSECT Combina los resultados de dos consultas y devuelve aquellas filas de la
primera que existen al menos una vez en la segunda
UNION Devuelve todas las filas seleccionadas por ambas consultas. Las filas
duplicadas sólo aparecen una vez (sólo se chequea la duplicidad de las
columnas seleccionadas).
El operador IN tiene mayor precedencia que el UNION.
El resultado se ordena, por defecto, en orden ASCendentemente.
UNION ALL Devuelve todas las filas seleccionadas por ambas consultas, incluyendo
todas las filas duplicadas.
El resultado, por defecto, no se ordena.
El operador DISTINCT no puede ser utilizado
MINUS Combina los resultados de dos consultas y devuelve aquellas filas de la
primera que no existen en la segunda
Todos los operadores de conjunto tienen igual precedencia. Por tanto, si existen varios operadores en
la misma sentencia, se evalúan de izquierda a derecha, siempre y cuando no aparezca paréntesis que
cambien el orden de manera explícita.
Ejemplos:
ENAME EMPNO
-------------- ----------
SMITH 7369
ALLEN 7499
WARD 7521
JONES 7566
ENAME EMPNO
-------------- ----------
ENAME EMPNO
-------------- ----------
ADAMS 7876
ALFREDO 8000
ALLEN 7499
BLAKE 7698
.....
- Si ambas consultas seleccionan valores de tipo CHAR, el resultado devuelto es de tipo CHAR.
- Si una consulta selecciona un tipo CHAR y la otra un tipo VARCHAR2, el resultado devuelto es de
tipo VARCHAR2.
- La cláusula ORDER BY puede aparecer sólo al final de la sentencia y aceptará un nombre de la
columna, un alias ó notación posicional. Si un nombre de columna ó alias es usado en un ORDER
BY deben ser de la primera SELECT.
- Los operadores de conjunto pueden ser usados en subconsultas.
- Los encabezados de columnas del resultado de la operación de conjunto son los nombres de las
columnas de la primera SELECT.
Nota1: Como la lista de expresiones que aparecen en las SELECT deben coincidir en número y tipo,
se pueden usar columnas ficticias y funciones de conversión de tipos para cumplir dicha regla.
Ejemplo:
La consulta interna (ó subconsulta ) devuelve valores que son usados por la sentencia externa.
SELECT expr1,expr2,....
FROM tabla1
WHERE expr3 operador ( SELECT expr11,expr12…
FROM tabla2);
Los operadores de enlace entre las consultas son del tipo: ‘>’ ,’=’ ,IN ,...
Operadores de Comparación:
Operador Significado
= Igual a
> Mayor que
>= Mayor ó igual que
< Menor que
<= Menor ó igual que
<> Distinto de
IN (*) Compara un valor con cada valor devuelto por la subconsulta
ANY (*)/ Compara un valor con cada valor devuelto por la subconsulta y evalúa a
SOME (*) TRUE si la condición se cumple para alguno de los valores devueltos.
ALL (*) Compara un valor con cada valor devuelto por la subconsulta y evalúa a
TRUE si la condición se cumple para todos los valores devueltos
Nota1:
Si una subconsulta devuelve un valor NULL y se está utilizando un operador NOT IN , provocará que la
consulta principal no devuelva ninguna fila.
Ejemplo:
SQL>
Al utilizarse el NOT IN ( que implícitamente son comm <> valor1 AND comm <>
valor2 ... ,son AND, por lo que si una condición es FALSE ( comm <> NULL => FALSE )
provoca que toda la condición sea FALSE )
Ejemplos:
ENAME
----------
SCOTT
KING
FORD
Se puede utilizar una subconsulta en la cláusula FROM de una SELECT ( se creará una especie de
almacenamiento temporal de datos )
Ejemplo:
6 rows selected
6 rows SELECTed
Subconsultas Sincronizadas:
Las subconsultas sincronizadas son aquellas que son evaluadas una vez por cada fila procesada de la
sentencia padre ( SELECT,UPDATE,DELETE). Oracle ejecuta una subconsulta sincronizada cuando
en la subconsulta se referencia a una columna de una tabla de la consulta padre.
Subconsulta anidada:
Subconsulta sincronizada:
Ejemplo:
6 rows Selected
UPDATE sincronizado
Ejemplo:
DELETE sincronizado
Borra las filas de una tabla que también existe en otra tabla
Ejemplo:
• Tablas
• Vistas
• Secuencias
• Índices
• Sinónimos
¿ Qué es un esquema ?
Un esquema es una colección de objetos. Los objetos de un esquema incluyen tablas, vistas,
sinónimos, secuencias, procedimientos almacenados, índices, clusters y DB links. El esquema es
propiedad de un usuario y posee el mismo nombre que el usuario.
1. Los nombres de las tablas, vistas,...etc, y de las columnas deben comenzar por una letra y
tener un tamaño máximo de 30 caracteres.
2. Los nombres deben contener caracteres del conjunto (A-Z, a-z, 0-9, ’_’, ’$’, ’#’).
3. Los nombres asignados a un objeto no deben ser idénticos a objetos ya existentes propiedad
del usuario.
4. Oracle permite introducir nombres tanto en minúsculas como en mayúsculas ( no los distingue,
no es sensible a mayúsculas ). Para distinguirlos, sería necesario introducir los nombres entre
comillas dobles. Oracle soporte nombres entre comillas dobles, permitiendo utilizar nombres
que son palabras reservadas, que son sensibles a mayúsculas ó que contienen espacios.
Ejemplo:
TABLE CREATED
TABLE CREATED
Para poder crear una tabla, el usuario tiene que tener el privilegio de sistema “CREATE TABLE” y
existir espacio libre en disco para poder crear el objeto.
La cláusula DEFAULT permite especificar un valor por defecto si éste se omite en una sentencia
INSERT. El valor por defecto puede ser un literal (numérico ó carácter), una expresión ó una función
SQL del tipo SYSDATE ó USER, pero el valor no puede ser el nombre de otra columna ó de una
pseudocolumna (NEXTVAL,CURRVAL,..).
La cláusula CONSTRAINT de la sentencia CREATE TABLE soporta opciones adicionales, tales como:
ON DELETE CASCADE, ENABLE, DISABLE, etc.
Las constraints NOT NULL y UNIQUE son implícitamente creadas cuando se crea una constraint
PRIMARY KEY en una tabla.
Las CONSTRAINTs se pueden crear tanto a nivel de tabla como a nivel de columna.
Las constraints pueden ser añadidas a la tabla después de la creación de ésta y además, también
pueden ser temporalmente deshabilitadas.
.......
Columna1 .....[CONSTRAINT nombre_constraint ] tipo_constraint,
.......
Las constraints a nivel de columna referencian una sola columna y son definidas dentro de la propia
definición de la columna.
Las constraints a nivel de tabla referencian una ó mas columnas y son definidas después de la
definición de las columnas de la tabla. En este nivel se puede definir cualquier tipo de constraints salvo
NOT NULL que tiene que ser definida a nivel de columna.
Ejemplo:
TABLE CREATED
Constraint CHECK
Esta constraint define una condición que cada fila de la tabla debe satisfacer. La condición puede usar
los mismos constructores que los utilizados en condiciones de consultas, con las siguientes
salvedades:
- No se pueden referenciar las pseudocolumnas: CURRVAL, NEXTVAL, ROWNUM ( al igual que la
cláusula DEFAULT para columnas).
- No se pueden invocar a las funciones SYSDATE y USER ( al contrario que la cláusula DEFAULT
para columnas ).
La condición de la check constraint puede incluir cualquier columna de la tabla ( se tendría que definir
la constraint a nivel de tabla y no a nivel de columna ), pero no se puede referir a columnas de otras
tablas.
Ejemplo:
TABLE CREATED
La constraint PRIMARY KEY es una columna ó conjunto de columnas que identifican unívocamente a
cada fila de la tabla.
Ninguna columna que forme parte de la PRIMARY KEY puede contener valores nulos (Todas las
columnas son NOT NULL y UNIQUE).
Un índice único (UNIQUE) es creado implícitamente cuando se crea una PRIMARY KEY sobre una
tabla.
Ejemplo:
TABLE CREATED
Constraint UNIQUE
Una constraint UNIQUE sirve para mantener la unicidad de una columna ó conjunto de columnas.
Las constraints UNIQUE permiten introducir valores NULL a menos que se definan en las columnas
correspondientes la constraint NOT NULL.
El servidor Oracle crea un índice único ( UNIQUE ) de manera implícita cuando se crea una constraint
de tipo UNIQUE.
Ejemplo:
TABLE CREATED
Los valores de la FOREIGN KEY deben existir en la tabla relacionada ó ser nulos ( la relación se hace
a nivel de datos, no físicamente con punteros).
Las tablas referenciadas en este tipo de constraint deben existir en la misma BD. Si la tabla no
pertenece al usuario que está creando la constraint, se debe preceder el nombre de la tabla con el
nombre del propietario de la misma.
La constraint FOREING KEY puede ampliarse con una serie de cláusulas adicionales:
a) FOREIGN KEY: Se usa para definir la/s columna/s en la tabla hija en la definición de la constraint a
nivel de tabla.
c) ON DELETE CASCADE: Indica que cuando un fila en la tabla padre sea borrada, las filas
dependientes en las tabla hijas también serán borradas. Sin esta opción, las filas en la tabla padre no
pueden ser borradas si existen filas en las tabla hija que las referencien.
Ejemplos:
TABLE CREATED
TABLE CREATED
TABLE CREATED
La definición de las columnas puede contener únicamente el nombre de la columna,su valor por
defecto y constraint de integridad .No puede contener el tipo de dato ni constraint de integridad
referencial( FOREIGN KEY ).
Ejemplo:
Si la tabla a la que se va añadir una nueva columna contiene filas, la nueva columna contendrá valores
nulos para todas las filas de la tabla.
Una columna que va ser añadida a una tabla, no puede ser definida como NOT NULL, a menos que la
tabla esté vacía.
Ejemplo:
TABLE altered
Ejemplo:
TABLE altered
La modificación de una columna puede incluir cambios en el tipo de dato (la tabla debe estar vacía ó la
columna contener valores nulos), en el tamaño (si se decrementa, la tabla debe estar vacía ó la
columna contiene valores nulos ), en el valor por defecto (afecta a los nuevos valores insertados en la
tabla ) y en la constraint NOT NULL (la tabla debe estar vacía).
Nota1:
Se puede cambiar una columna de tipo CHAR a VARCHAR2 si la columna contiene valores nulos ó
está vacía, y además no cambias el tamaño de la columna.
Ejemplo:
TABLE altered
Ejemplo:
TABLE altered
La opción CASCADE causa que cualquier constraint dependiente de la que se está borrando, sea
borrada también.
Se puede deshabilitar una constraint sin borrarla y crearla de nuevo, usando la cláusula DISABLE de
la sentencia ALTER TABLE.
La cláusula DISABLE se puede utilizar tanto en un ALTER TABLE como en un CREATE TABLE.
Ejemplo:
TABLE altered
Se puede habilitar una constraint sin borrarla y crearla de nuevo usando la cláusula ENABLE de la
sentencia ALTER TABLE.
La cláusula ENABLE se puede utilizar tanto en un ALTER TABLE como en un CREATE TABLE.
Si se habilita una constraint, esa validación se aplica a todos los datos de la tabla ( todas las filas
deben cumplir la condición impuesta por la constraint ).
Si tu habilitas una constraint de tipo UNIQUE ó PRIMARY KEY, un índice único es creado
automáticamente.
Ejemplo:
TABLE altered
Para poder renombrar un objeto, el usuario debe ser el propietario del objeto.
Ejemplo:
TABLE renamed
Esta operación elimina todas las filas de la tabla y libera el espacio ocupado por la misma.
Para poder realizar un TRUNCATE el usuario debe ser el propietario de la tabla ó tener el privilegio del
sistema DELETE TABLE
Ejemplo:
TABLE truncated
Esta operación elimina todas las filas de la tabla y los índices. Con la opción CASCADE
CONSTRAINTS también se eliminará cualquier constraint de integridad referencial que haga
referencia a alguna de las columnas de la tabla borrada.
Cuando se ejecuta esta sentencia, cualquier vista ó sinónimo que haga referencia a la tabla borrada
resultará inválido ( pero seguirá existiendo).
Sólo el propietario de la tabla ó un usuario con el privilegio del sistema DROP ANY TABLE puede
borrar una tabla.
Ejemplo:
TABLE dropped
Ejemplo:
Comment CREATED
Ejemplo:
Comment dropped
Nota1: Para borrar un comentario de la base de datos basta con asignar una cadena vacía en el texto
posterior al IS ( ... IS ‘ ‘)
Vistas
Una vista no es más que una sentencia SELECT almacenada en el Diccionario de Datos.
Las vista son utilizadas para imponer una seguridad en los datos, visualizando un porción SELECTiva
de información.
Una vista puede estar basada en un tabla ó conjunto de tablas, ó en otra vista.
Se puede utilizar la cláusula OR REPLACE para cambiar la definición de la vista sin borrarla y tenerla
que crear de nuevo y sin tener que volver a conceder todos los privilegios sobre la vista.
Cuando la subconsulta retorna alguna función ó expresión, es obligatorio especificar los nombres de
las columnas de la vista ( alias de la vista ).
Ejemplo:
View CREATED
Ejemplo:
SQL>
Ejemplo:
View CREATED
SQL>
DELETE:
Tampoco se pueden eliminar filas a través de una vista si la definición de la vista no contiene todas las
columnas de la tabla base definidas como NOT NULL.
UPDATE:
No se pueden actualizar filas a través de una vista si cumple alguna de las condiciones anteriores ó si
contiene:
a) Expresiones
b) La pseudocolumna ROWNUM
INSERT:
No se pueden insertar filas a través de una vista si se cumple alguna de las condiciones anteriores ó
si:
a) La tabla contiene una columna NOT NULL, sin un valor por defecto, y dicha columna no es
seleccionada por la vista.
View CREATED
SQL>
El comando ALTER VIEW sirve para recompilar una definición de vista existente ( Este tipo de
sentencias se ejecutarán cuándo se realicen cambios en la definición de la tabla base sobre la que
está creada la vista ).
Sólo el propietario de la vista ó un usuario con el privilegio del sistema ‘DROP ANY TABLE’ puede
borrar una vista.
Ejemplo:
View dropped.
SQL>
Secuencias
Ejemplo:
Sequence CREATED
SQL>
Se debe invocar a NEXTVAL antes de hacer uso de CURRVAL en cada sesión de usuario.
Ejemplo:
Sequence CREATED
NEXTVAL
----------
3
CURRVAL
----------
3
Si se realiza un rollback de una sentencia que contiene una secuencia, el número generado por la
secuencia se pierde y la próxima vez que se invoque a ésta generará el siguiente ( aparecerán
huecos ). Otra accción que puede causar la aparición de huecos es la caída del sistema. Si la
secuencia tenía valores en caché, entonces todos esos valores se perderán.
Sólo el creador ó un usuario con el permiso ALTER SEQUENCE puede modificar la secuencia.
No se puede modificar el número de inicio de la secuencia ( START WITH.).
Cuando se modifica una secuencia se realizan algunas validaciones ( por ejemplo, el nuevo
MAXVALUE no puede ser menor que el valor actual de la secuencia ).
Índices
El objetivo de un índice es reducir la I/O a disco utilizando un acceso directo a los datos.
Cuando se borra una tabla, todos sus índices asociados también son borrados.
Se pueden utilizar índices para forzar unicidad en una columna ó conjunto de columnas.
Eliminando un índice
Para poder borrar un índice debe ser el creador ó un usuario con el privilegio DROP ANY INDEX.
Para referirse a una tabla de otro usuario es necesario prefijar el nombre de la tabla con el nombre del
usuario que la creó. Creando un sinónimo se elimina la necesidad de cualificar el nombre del objeto
con el esquema y proporciona un nombre alternativo para la tabla, vista, secuencia, procedimiento,etc..
El DBA puede crear sinónimos públicos accesibles por todos los usuarios. Para que un usuario pueda
crear un sinónimo público, éste debe poseer el privilegio del sistema “CREATE PUBLIC SYNONYM“.
Borrando Sinónimos
Una transacción comienza cuando se ejecuta la primera sentencia SQL posterior a la finalización de la
anterior transacción y finaliza cuando:
Tipos de transacciones
Tipo de transacción Descripción
DML No realizan COMMIT implícito. Es necesario realizar un
COMMIT explícito para que los cambios realizados surtan
efecto.
DDL Realizan COMMIT implícito de la actual transacción antes y
después de cada sentencia DDL.
DCL Realizan COMMIT implícito
Si una sentencia DDL no se ejecuta correctamente , no puedes echar atrás los cambios previos puesto
que un COMMIT implícito se ejecuta ANTES y DESPUÉS de ejecutar una sentencia DDL.
Hasta que no se realiza un COMMIT, sólo el usuario que está realizando las modificaciones podrá ver
el efecto que están surtiendo sobre las tablas afectadas, el resto de los usuarios verán la información
antigua ( la existente en el segmento de Rollback ).
Las filas afectadas por las operaciones de un usuario ( INSERT,UPDATE,DELETE ) son bloqueadas.
Otros usuarios no pueden acceder a dichas filas hasta que no finalice la transacción.
ROLLBACK:
Una sentencia ROLLBAC ( al igual que un COMMIT ) puede ser usado en un subprograma PL / SQL.
Esto ofrece una gran ventaja cuando se usan estructuras lógicas del tipo if-then-else, puesto que
permiten modificar y borrar información de forma condicional en base a condiciones en tiempo de
ejecución.
Nota1: Si se crea un segundo SAVEPOINT con el mismo nombre que uno anterior, el primero ( el más
antiguo ) se elimina.
Nota2: Si una sentencia DML falla al ejecutarse, sólo se realiza rollback de dicha sentencia ( rollback
implícito ), pero los cambios realizados anteriormente a la ejecución de la sentencia que ha producido
el error no serán desechos.
Consistencia en Lectura
El propósito de la consistencia en lectura es asegurar que cada usuario ve la información cómo estaba
después del último COMMIT realizado.
Modos de bloqueo
Modo de bloqueo Descripción
Exclusivo Bloquea un recurso de manera exclusivo. Solo esa transacción
puede alterar el recurso. Se realiza en sentencias del tipo
INSERT,UPDATE,DELETE
Compartido Varias transacciones pueden adquirir bloqueos compartidos del
mismo recurso
Todos los bloqueos adquiridos por una sentencia dentro de una transacción son mantenidos hasta el
final de la transacción.
Los bloqueos adquiridos después de un SAVEPOINT son liberados cuando se hace ROLLBACK hasta
ese punto.
Bloqueos explícitos
SELECT FOR UPDATE: Ejecuta la consulta identificando las filas que serán actualizadas ó borradas y
bloqueando, por tanto, las filas seleccionadas.
NOWAIT: Finaliza la sentencia si alguna de las filas que se quiere modificar está bloqueada por otra
transacción ( No espera indefinidamente ).
LOCK TABLE: Bloquea una tabla. Cuando se usa con vistas, bloque la tabla base de la vista.
Ejemplo:
SQL>
a) A nivel de Sistema: Cubre usos y accesos a nivel de sistema, tales como control de
usuarios y password, espacio en disco alocado por los usuarios, operaciones del sistema
permitidas por los usuarios.
b) A nivel de la Base de Datos: Cubre usos y accesos a nivel de objetos de la BD, y determina
qué acciones pueden realizar los usuarios sobre los objetos de la BD.
El DBA es un usuario de “alto nivel” que tiene la posibilidad de conceder acceso a los usuarios a la
Base de Datos y a sus objetos. Los usuarios necesitan privilegios del sistema para poder acceder a
la BD y privilegios de objeto para poder manipular el contenido de los objetos de la BD.
Existe la posibilidad que un usuario pueda conceder permisos (privilegios) a otros usuarios ó a Roles
(conjunto de privilegios relacionados).
Creando usuarios
Ejemplo:
User CREATED
SQL>
Una vez que el DBA ha creado un usuario, éste no posee ningún privilegio. Así, el DBA debe
comenzar a conceder los privilegios necesarios al nuevo usuario creado para que éste pueda ser
operativo.
Cada usuario puede cambiar su password haciendo uso de la sentencia ALTER USER. Para cambiar
la password no se necesita tener el permiso ALTER USER, aunque sí para cambiar otras
características relacionadas con el usuario.
Ejemplo:
User CREATED
SQL>
Ejemplo:
Grant succeeded.
SQL>
Un GRANT sobre un sinónimo es convertido a un GRANT sobre la tabla base referenciada por el
sinónimo.
Un usuario automáticamente tiene todos los privilegios sobre los objetos de su esquema.
PUBLIC: Concede el privilegio de objeto a todos los usuarios. Para poder conceder este permiso, el
usuario debe ser el propietario del objeto ó haber recibido el privilegio con la cláusula WITH GRANT
OPTION
WITH GRANT OPTION: Permite al usuario que recibe el permiso poder concedérselo a otros usuarios.
Para poder conceder permisos sobre un objeto tú debes ser el propietario ó haber recibido el permiso
sobre el objeto con la opción WITH GRANT OPTION
Privilegios concedidos con la opción WITH GRANT OPTION son revocados cuando se revoca el
privilegio al usuario que nos ha concedido el permiso.
En primer lugar, el DBA debe crear el rol. Después conceder privilegios al rol creado y finalmente
conceder el rol creado a los usuarios.
Ejemplo:
User CREATED
Role CREATED
Grant succeeded
Grant succeeded
SQL>
Eliminando permisos
Cuando se usa la sentencia REVOKE, se elimina el privilegio que se especifica sobre el usuario que
se indica y sobre otros usuarios que recibieron el permiso del usuario al cual le estamos eliminando el
privilegio.
En general:
ALL_xxx: Las vistas del diccionario de datos prefijadas con ‘ALL’ visualizan nombres de objetos en los
cuales el usuario tiene acceso. Estas vistas incluyen toda la información existente en las vistas del tipo
USER_xxx: Las vistas del diccionario de datos prefijadas con ‘USER’ visualizan información de
objetos propiedad del usuario.
DBA_xxx: Las vistas del diccionario de datos prefijadas con ‘DBA’ visualizan información de todos los
objetos de la BD independientemente del propietario.
V$_xxx: Las vistas del diccionario de datos que comienzan por ‘V$’, visualizan información del
rendimiento de los objetos de la BD.
- Características:
DESC[RIBE] <tabla/vista> : Visualiza la estructura de una tabla ó vista ( visualiza los nombres de las
columnas, sus tipos y la obligatoriedad de ser informadas ).
El comando SET permite establecer ciertos valores a parámetros que controlan el entorno en el cual
está SQL*Plus operando (sobre nuestra sesión actual).
SET VERIFY ON/OFF: Ejecutando el comando SET VERIFY ON se fuerza a SQL*Plus a visualizar el
texto del comando antes y después de remplazar las variables de sustitución con los valores
introducidos.
SET AUTOCOMMIT ON/OFF: Si se establece a ON, cada sentencia que se ejecuta realizará un
COMMIT implícito. Si se establece a OFF, es necesario realizar un COMMIT explícito
( para las sentencias DML )
Ejemplo:
Se pueden definir / declarar variables antes de ejecutar sentencias SELECT. SQL*Plus proporciona 2
comandos para definir variables de usuario: ACCEPT y DEFINE.
Comando Descripción
ACCEPT Almacena en una variable un dato introducido por el usuario
DEFINE variable = valor Crea una variable de tipo CHAR y le asigna un valor
DEFINE variable Visualiza la variable, su valor y su tipo de dato
DEFINE Visualiza todas las variables de usuario junto con sus valores y tipos
de dato
DEFINE: Se puede usar el comando DEFINE para crear una variable de tipo CHAR. Una variable
permanece definida hasta que usas el comando UNDEFINE ( UNDEFINE nombre_variable ) ó sales
de SQL*Plus.
Ejemplo:
DEFINE _EDITOR=”edit.exe”
Ejemplo:
SQL>
Una vez definida una variable SQL*Plus permanece mientras dure la sesión ó hasta el que usuario
realiza un UNDEFINE de la variable.
En SQL*Plus puedes utilizar variables de sustitución (& ó &&) para almacenar temporalmente valores.
Cuando las variables de sustitución contengan valores fecha ó caracteres deben ser encerradas entre
comillas simples.
Ejemplo:
......
WHERE job = ‘&job_title’
Comandos de edición:
SAV[E] nombre_fichero[.ext] [REP[LACE APP[END]]: Guarda el contenido actual del SQL Buffer en
un fichero. Se puede usar APPEND para anexar a un fichero ya existente. Se usará REPLACE para
sobrescribir un fichero existente. La extensión de los ficheros es, por defecto, ‘.sql’
ED[IT]: Invoca al editor y salva el contenido del SQL Buffer en un fichero llamado “afiedt.buf”.
Notas:
- El comando DEFINE se utilizará para actualizar los valores de las variables de entorno.
- Si presionas la tecla ENTER, antes de completar una sentencia, SQL*Plus te mostrará el siguiente
número de línea. Esto es lo que se conoce como SQL Buffer.