Oracle y SQL*Plus

Anuncio
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
',6(f2'(%$6(6'('$726<6(*85,'$'(1/$,1)250$&,Ï1
&8562
$3817(63$5$/$635È&7,&$6HU&8$75,0(675(
Para cualquier consulta a la sintaxis de las órdenes SQL o SQL*PLUS puede
consultarse cualquier libro de ORACLE, o los manuales gratuitos en pdf o en línea
accesibles a partir de la página de la asignatura (en http://kybele.escet.urjc.es/).
Para las prácticas voluntarias del primer parcial se utilizará el servidor relacional de
ORACLE. El programa cliente que se utilizará será SQL*PLUS. SQL*PLUS admite las
sentencias SQL propias de ORACLE más otras propias para el formateo de la salida,
etc. Fundamentalmente se utilizarán los siguientes comandos de SQL*PLUS:
• 3$66:25': Para cambiar el password del usuario (también puede cambiarse
mediante ALTER USER).
• /: ejecuta el comando SQL o PL/SQL almacenado en el buffer.
• RUN: lista y ejecuta el comando SQL o PL/SQL almacenado en el buffer.
• HOST comando: ejecuta un comando del SO.
• LIST: lista el contenido del buffer.
• @ o 67$57 fichero: ejecuta un fichero
• EDIT [fichero]: edita el fichero, o bien la sentencia almacenada en el buffer. Para
poder utilizar esta opción en el laboratorio el fichero auxiliar utilizado por
SQL*PLUS debe estar en un directorio en el que el usuario tenga permiso de
escritura. Puede cambiar el directorio por defecto en Opciones/Editfile.
• DEFINE [variable[=valor]]: define o muestra el valor de variables
• SPOOL [fichero|OFF]: manda la salida a fichero o deja de hacerlo.
• '(6&5,%( objeto: describe una tabla, vista o sinónimo.
Existen otras instrucciones útiles de edición y carga de ficheros como APPEND,
CHANGE, GET, SAVE.
La forma de trabajar será utilizar un editor de texto para guardar las instrucciones en un
VFULSW(creación de las tablas, inserción de datos, consultas, etc.).
Es conveniente incluir en el VFULSW antes de cada creación de tabla un borrado de la
misma mediante la instrucción DROP TABLE tabla [CASCADE CONSTRAINTS]. De
esta forma nos aseguramos que la tabla no existe, evitando errores. Mediante la opción
CASCADE CONSTRAINTS nos aseguramos que la tabla se borra aunque existan
dependencias entre tablas que impedirían su borrado.
Aunque el lenguaje SQL admitido por ORACLE es muy similar al estándar visto en
clase (SQL:1999), existen algunas diferencias que se irán descubriendo en el desarrollo
de las prácticas. Las más importantes son los tipos de datos, las opciones de borrado y
modificación de claves ajenas, y la creación de dominios (ORACLE no admite
dominios, los cuales deberán simularse mediante CHECKs o tablas auxiliares).
ORACLE admite una gran variedad de tipos de datos. Los más importantes, que serán
los que fundamentalmente se utilicen en las prácticas son:
• CHAR (tamaño): cadenas de caracteres de longitud fija.
• VARCHAR2 (tamaño): cadenas de caracteres de longitud variable, hasta un
máximo “tamaño”.
• NUMBER (l,d): número de un máximo de “l” dígitos, “d” de los cuales son
decimales.
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 1
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
• DATE: fecha.
Probablemente sea necesario utilizar funciones de formateo de tipos, tales como to_date
o to_char (véase más adelante en este mismo documento).
Aunque en los manuales podrá consultarse la sintaxis completa del SQL, la sintaxis
básica de la instrucción de creación de tablas es la siguiente:
CREATE TABLE nombre (
columna1 tipodatos [DEFAULT valorpordefecto] [restricciones de columna1],
...
columnaN tipodatos [DEFAULT valorpordefecto] [restricciones de columnaN],
[restricción de tabla],
...
[restricción de tabla]);
Las restricciones de columna son:
[CONSTRAINT nombrerestricción] ->
[NOT] NULL
UNIQUE/PRIMARY KEY
REFERENCES tabla [(columna)] [ON DELETE CASCADE/SET NULL]
CHECK (condición)
[CONSTRAINT nombrerestricción] ->
UNIQUE/PRIMARY KEY (columnas)
FOREIGN KEY (columnas) REFERENCES tabla [(columnas)] [ON DELETE
CASCADE/SET NULL]
CHECK (condición)
Como vemos en la sintaxis, no es obligatorio darle un nombre a las restricciones,
aunque puede resultar conveniente para poder identificar posibles errores en el caso de
las inserciones rechazadas por ORACLE.
ORACLE sólo admite opciones en el caso de borrado de claves ajenas (a diferencia del
estándar). Las únicas opciones admitidas son borrado en cascada, con puesta a nulos y
restringido (que es la opción por defecto en el caso de no poner nada). Evidentemente,
cuando una clave ajena tiene como opción de borrado la puesta a nulos, las columnas
asociadas deberán admitir este valor.
ORACLE, como todo SGBD, mantiene un catálogo que almacena datos acerca de los
usuarios, tablas, privilegios, etc. Podemos acceder al catálogo por medio de vistas que
pueden consultarse. Realizando una consulta a la vista ALL_CATALOG vemos todos
los objetos (tablas, vistas, sinónimos) visibles por el usuario. Algunas vistas útiles son
USER_TABLES, USER_VIEWS, etc.
Instrucciones ALTER TABLE, INSERT, DELETE y UPDATE.
La sintaxis básica es la siguiente:
ALTER TABLE tabla ->
ADD (columnas, restricciones de columnas y/o restricciones de tabla)
MODIFY (columnas y restricciones de columnas)
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 2
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
DROP PRIMARY KEY|UNIQUE(columnas)
DROP CONSTRAINT restricción
DROP COLUMN columna
(columnas)
[DISABLE UNIQUE (columnas)/PRIMARY
restricción [CASCADE];]
[ENABLE UNIQUE (columnas)/PRIMARY
restricción;]
KEY/CONSTRAINT
KEY/CONSTRAINT
Para la inserción de datos usaremos la instrucción INSERT. Si no indicamos las
columnas, el sistema supondrá que estamos insertando valores en todas ellas.
INSERT INTO tabla/vista [(columnas)] subconsulta/VALUES (expresiones);
Para el borrado usaremos la siguiente sintaxis. Si no incluimos la cláusula WHERE, se
borrarán todas las filas.
DELETE [FROM] tabla/vista [WHERE condición];
Para la modificación de valores se utilizará la siguiente sintaxis. Análogamente al caso
anterior, si no usamos la cláusula WHERE se modificarán todas las filas.
UPDATE tabla/vista SET
columna=expresión|subconsulta
(columnas)=subconsulta
WHERE [condición];
Hay que tener en cuenta que en el caso de las vistas deberán cumplirse determinadas
condiciones para permitir las inserciones, borrado y actualizaciones de las tablas base.
La sintaxis básica de la orden SELECT es la siguiente:
SELECT [ALL | DISTINCT] <lista-de selecciones>
FROM <nombre de tabla> [alias de tabla] [,...]
[WHERE <condición>]
[GROUP BY <lista-de columnas> [HAVING <condición>] ]
[ORDER BY <nombre de columna> [ASC | DESC] [,...] ]
DISTINCT: Elimina las filas duplicadas en el resultado de la consulta.
<alias de tabla>:Es un sinónimo activo sólo en el ámbito de la sentencia SELECT.
Las condiciones pueden incluir operadores lógicos (AND, OR, NOT). En las condiciones
podemos utilizar, entre otras, las siguientes expresiones:
•
< expresión1> [NOT] BETWEEN <expresión2> AND <expresión2>
•
<expresión> [NOT] IN (<lista-de valores>)
•
<nombre de columna> [NOT] LIKE ‘<string>’ [ESCAPE ‘<carácter de escape>’]
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 3
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
•
<nombre de columna> IS [NOT] NULL
•
Expresiones con subconsulta, que permiten comparar el valor de una expresión con los
resultados de una sentencia SELECT (subconsulta). De esta forma se pueden producir
encadenamientos de sentencias SELECT.
ORDER BY <nombre de columna> [ASC | DESC] [,...]
Permite ordenar el resultado de la consulta.
COMPOSICIÓN DE TABLAS. La composición (join) de tablas se produce cuando se
combinan datos de dos o más tablas. Para poder realizar la composición deben existir
columnas comunes a las tablas, de forma que al componer dos tablas A y B con las
columnas comunes X e Y se satisface una condición del tipo A.X=B.Y o similar
(utilizando otros operadores, como >, <, etc). Estas condiciones se incluyen en la
condición de la claúsula WHERE. Esto puede generalizarse a más de dos tablas, por
ejemplo (A.X = B.Y1) AND (B.Y2 = C.Z). En el caso de realizar una composición de una
tabla consigo misma, obligatoriamente hay que emplear alias dentro de la orden SELECT
que eviten los problemas de ambigüedad.
Algunas de las funciones aplicables a datos de tipo carácter son:
LQLWFDSFKDU Æ pone en mayúscula el primer carácter de cada cadena de caracteres.
ORZHUFKDU Æ pone en minúsucla la cadena de caracteres completa
UHSODFHFKDU VWU VWU Æ En la cadena de caracteres char, cada ocurrencia de str1 se
reemplaza por str2
VXEVWUFKDUPQ Æ Extrae n caracteres de la cadena de caracteres char, a partir de la
posición m.
OHQJWKFKDU Æ Longitud de char
Entre las funciones específicas para fechas tenemos:
V\VGDWH Æ Fecha y hora actual
ODVWBGD\ Æ último día del mes actual
DGGBPRQWKVGQ Æ suma o resta n meses a partir de la fecha d
PRQWKVBEHWZHHQIV Æ diferencia en meses entre la fecha f y la fecha s
QH[WBGD\GGD\ Æ Fecha del día especificado (lunes, martes, ...en inglés)de la semana
siguiente a d
Otras funciones útiles para el tratamiento de fechas son WRBFKDU y WRBGDWH, que devuelven,
respectivamente, un dato en formato carácter o fecha. El uso básico es el siguiente:
WRBFKDU (expresión, plantilla)
WRBGDWH (cadena, plantilla)
Entre los posibles códigos a usar en la plantilla tenemos los siguientes:
< Æ devuelve el último dígito del año
<< Æ devuelve los dos últimos dígitos del año
<<< Æ devuelve los tres últimos dígitos del año
<<<< Æ devuelve los cuatro últimos dígitos del año
6<($5<($5 Æ año, utilizando signo para las fechas a.C.
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 4
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
4 Æ trimestre del año
00 Æ mes
50 Æ mes en números romanos
0RQWK Æ Nombre del mes (9 caracteres)
:: Æ semana del año
: Æ semana del mes
''' Æ día del año
'' Æ día del mes
' Æ día de la semana
'< Æ Abreviatura del nombre del día
++R++ Æ Hora del día
++ Æ hora del día utilizando las 24
0, Æ minutos
66 Æ segundos
Para una consulta más detallada tanto de las funciones anteriores como de otras muchas,
pueden consultarse los manuales de ORACLE accesibles desde la página de la asignatura.
Por último hay que resaltar el hecho de que es posible sumar a las fechas valores de la
forma: fecha+n. En este caso Oracle suma n días a la fecha, teniendo en cuenta posibles
desbordamientos de meses o años.
La cláusula GROUP BY se utiliza cuando se quieren realizar consultas agrupadas. Así, se
puede pensar en estos conjuntos de filas como grupos, utilizándose las siguientes funciones
(que también pueden ser utilizadas sin GROUP BY):
•
•
•
•
avg(nombre_columna) Æ Valor medio de todos los valores de nombre_columna
count(*) Æ Número de filas de la tabla
max(nombre_columna) Æ Valor máximo almacenado en nombre_columna
min(nombre_columna) Æ Valor mínimo almacenado en nombre_columna
Ejemplo: select ciudad, avg(ventas) from clientes group by ciudad;
Hay que tener en cuenta que hay que agrupar todas las columnas que no aparezcan
mencionadas en la cláusula group_by.
La cláusula HAVING se utiliza para especificar una condición de búsqueda de un grupo de
filas. Por ejemplo: select ciudad, avg(ventas) from clientes group by ciudad having
ciudad>’ t’ ;
SUBCONSULTAS. Una subconsulta forma parte de una condición de búsqueda en la
cláusual WHERE o HAVING.
Además de las vistas en la práctica anterior, también se pueden aplicar las siguientes
condiciones de búsqueda en subconsultas:
ƒ Test de comparación subconsulta. Compara el valor de una expresión con el valor
producido por una subconsulta y devuelve un valor true si la comparación es cierta.
Operadores: >, <>, <, <=, >, >=
Ejemplo:
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 5
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
SELECT nombre FROM tabla
WHERE columna ! (SELECT col FROM tabla2 WHERE ...);
ƒ
Test de pertenencia a conjunto subconsulta. Compara un único valor de datos con una
columna de valores producida por una subconsulta y devuelve un resultado true si el
valor coincide con uno de los valores de la columna.
Operador: IN
Ejemplo:
SELECT nombre FROM tabla
WHERE col ,1 (SELECT col FROM tabla2 WHERE...);
ƒ
Test de existencia. Comprueba si una subconsulta produce alguna fila de resultados.
Sólo se utiliza en subconsultas.
Operador: EXISTS
Ejemplo. Listar las oficinas donde haya ventas por encima de 100
SELECT nombre FROM oficina
WHERE
(;,676
(SELECT
*
FROM
ventas
ventas.oficina=oficina.id AND cant_ventas>100)
ƒ
WHERE
Test de comparación cuantificada. Se utilizan cuando una subconsulta devuelve más de
un valor. Compara un valor de dato con la columna de valores producidos por una
subconsulta.
SOME y ANY son equivalentes y se utilizan para aplicar a la consulta cada resultado
de una subconsulta. ALL se utiliza para comparar el valor del test con todos los
resultados de una subconsulta, si todos devuelven TRUE, entonces se ejecutará la
consulta.
Operadores: SOME, ANY, ALL
Ejemplo.
SELECT nombre FROM tabla
WHERE ciudad = ANY (SELECT nombre FROM tabla2 WHERE codigo<3);
Aunque las subconsultas suelen encontrarse tras la cláusula WHERE, también pueden
ir tras la cláusula HAVING.
Ejemplo.
SELECT nombre, avg(importe) FROM ventas, pedidos
WHERE ventas.idemp=pedidos.idemp AND fabrica=’ lafabrica’
GROUP BY nombre
HAVING avg(impventas)> (SELECT avg(imppedidos) FROM pedidos));
VISTAS
Una vista es una representación lógica de subconjuntos de datos de una o más tablas.
Pueden presentarse conjuntos lógicos de combinaciones de datos creando vistas de tablas.
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 6
Diseño de Bases de Datos y Seguridad en la Información
Apuntes Oracle y SQL*Plus
Las vistas es una tabla lógica (no física) que se basa en una tabla o en otra vista. Una vista
no contiene datos en si misma, es como una ventana a través de la cual pueden verse y
cambiarse datos de tablas. Las tablas sobre las que se define una vista se llaman tablas
base. La vista se almacena como una sentencia SELECT en el diccionario de datos.
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nombre_vista [(alias...)]
AS subconsulta
[WITH READ ONLY]
Donde:
OR REPLACE. Se utiliza por si la vista ya estuviera creada anteriormente. De esta
forma una vista podrá ser modificada.
FORCE. Crea la vista independientemente de si la tabla base existe.
NOFORCE. Crea la vista sólo si la tabla base existe. Está opción es la que está por
defecto.
Subconsulta. Es una sentencia SELECT
WITH READ ONLY. Asegura que no podrán ejecutarse operaciones DML sobre la
vista.
Algunas reglas para utilizar instrucciones DML en una vista
ƒ
ƒ
ƒ
No puede borrarse una fila si la vista contiene:
¾ Funciones de agrupamiento
¾ Una cláusula GROUP BY
¾ La cláusula DISTINCT
No pueden modificarse datos de una vista si:
¾ Se cumple alguna de las condiciones del borrado
¾ Las columnas están definidas mediante expresiones
No se pueden añadir datos a una vista si:
¾ Se cumple cualquiera de las condiciones del borrado
¾ Hay columnas NOT NULL en la tabla base que no están seleccionadas en la vista
Para borrar una vista:
DROP VIEW nombre_vista;
Grupo Kybele, http://kybele.escet.urjc.es/
Pág. 7
Descargar