Introducción A Sistemas ORACLE
Introducción A Sistemas ORACLE
Introducción A Sistemas ORACLE
Este curso pretende ser una introducción al SQL, y en particular a la versión que utiliza
el SGBD Oracle (7.3) llamado SQL*Plus. No se pretende realizar un estudio exhaustivo
de todas las opciones, comandos y aspectos de almacenamiento y administración que se
pueden considerar en SQL. Sólo se ha pretendido introducir y explicar los comandos
más utilizados con sus opciones más útiles, dejando los detalles más específicos a los
manuales de referencia.
Las razones que me han movido a construirlo en HTML y facilitar su acceso mediante
Web son las posibilidades de interacción con el texto y de mayor difusión. Por ahora las
tablas de ejemplo son estáticas y se encuentran en el texto mismo, pero mi intención es
que se pueda interactuar con una base de datos en tiempo real. ¿Quizás más adelante?.
Abril de 1998.
Jesús Vegas
Dpto. Informática
Universidad de Valladolid
[email protected]
Índice
1. Terminología
2. Tipos de sentencias SQL
3. SQL*Plus
o Conexión
o Posibilidades de Edición
o Utilización de Ficheros
4. Creación
o Tipos de Columnas
o Restricciones
o Comando DESCRIBE
5. Modificación
6. Inserción, Actualización y Borrado
o Inserción
o Actualización
o Borrado
7. Selección
o Selección de Columnas
o Cláusula FROM
o Cláusula WHERE
o Cláusula ORDER BY
o Cláusula DISTINCT
o Funciones
o Cláusula GROUP BY
o Expresiones con Sentencias SELECT
o Combinaciones
o Subconsultas
8. Eliminación
9. Vistas
10. Jugando con los Nombres
o Sinónimos
o El Comando RENAME
11. Lo Mas SQL*Plus
o Ficheros de Comandos
o Generación de Informes
1 Terminología
SQL
Structured Query Language o Lenguaje de Consultas Estructurado. Es el
lenguaje que permite la comunicación con el Sistema Gestor de Bases de Datos
(Oracle en nuestro caso).
El SQL es un lenguaje unificado
Lo utilizan todo tipo de usuarios, desde el administrador de la base de datos,
DBA, hasta el usuario final.
El SQL es un lenguaje no procedimental.
El usuario especifica Qué quiere, no Cómo ni Dónde conseguirlo.
El SQL es relacionalmente completo.
Permite la realización de cualquier consulta de datos.
SQL= DDL + DML
Las sentencias del SQL se clasifican como parte del DDL o del DML.
Lenguaje de Definición de Datos, DDL
sentencias del SQL que permiten definir los objetos de la Base de Datos
(create, revoke, grant, alter, etc.). Cuando se definen dichos objetos se
almacenan en el diccionario de datos.
Lenguaje de Manipulación de Datos, DML
sentencias del SQL que se utilizan para manejar los datos de la base de datos
(select, insert, update, delete, etc).
commit/rollback
cada vez que se realiza alguna operación en la base de datos se realiza no sobre
la tabla en sí, sino sobre una copia local de la misma. Así, si queremos que los
resultados de la modificación se trasladen a la base de datos y perduren en el
tiempo hay que confirmar dicha operación con el comando commit. También se
puede impedir que los últimos cambios lleguen a efectuarse con rollback,
aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden
volver atrás.
Diccionario de la Base de Datos
Guarda la definición de todos los objetos almacenados en la base de datos; sus
características, restricciones, privilegios, relaciones entre ellos, etc.
2 Tipos de Sentencias
A continuación se presenta una tabla con las sentencias SQL más comunes, clasificadas
según el lenguaje al que pertenecen.
Sentencia
Objetivo
DDL
Alter
Recompilar un procedimiento almacenado.
procedure
Añadir o redefinir una columna, modificar la asignación de
Alter Table
almacenamiento.
Recoger estadísticas de rendimiento sobre los objetos de la BD
Analyze
para utilizarlas en el optimizador basado en costes.
Create Table Crear una tabla.
Create Index Crear un índice.
Drop Table Eliminar una tabla.
Drop Index Eliminar un índice.
Grant Conceder privilegios o papeles, roles, a un usuario o a otro rol.
Truncate Eliminar todas las filas de una tabla.
Revoke Retirar los privilegios de un usuario o rol de la base de datos.
Sentencia
Objetivo
DML
Insert Añadir filas de datos a una tabla.
Delete Eliminar filas de datos de una tabla.
Update Modificar los datos de una tabla.
Select Recuperar datos de una tabla.
Commit Confirmar como permamentes las modificaciones realizadas.
Deshacer todas las modificaciones realizadas desde la última
Rollback
confirmación.
3 SQL*Plus
La herramienta que nos proporciona ORACLE para interactuar con la base de datos se
llama SQL*Plus. Básicamente, es un intérprete SQL con algunas opciones de edición y
formateo de resultados.
Usuario/Clave
Para poder acceder a una base de datos gestionada por ORACLE debemos ser un
usuario autorizado de la misma y conocer la palabra clave, password, asociada al
usuario.
Variable de ambiente ORACLE_SID
Indica la base de datos con la que vamos a trabajar.
3.1 Conexión
Para entar en SQL*Plus se debe ejecutar el comando
$ sqlplus usuario/passwd
donde le indicamos al SGBD Oracle quién somos y nuestra palabra clave.
$ sqlplus usuario/passwd@servicio
Otra circunstancia que hay que tener en cuenta a la hora de conectarnos a SQL*Plus es
el modo establecido por el DBA para la autentificación del usuario de la base de datos.
La primera posibilidad es que recaiga sobre el SGBD Oracle la autentificación de los
usuarios, por lo que tendremos que darle nuestro nombre de usuario y la palabra de
paso. Pero existe la posibilidad de que el SGBD Oracle deje en manos del Sistema
Operativo esta responsabilidad. Así, no será necesario demostrarle al SGBD Oracle
quién somos ya que el SO se ha encargado previamente de comprobar que todo es
correcto. En este segundo caso, el comando de conexión con SQL*Plus debe omitir el
nombre de usuario y la palabra clave, pero manteniendo el resto de esta manera:
$ sqlplus /@servicio
Una vez que hemos conseguido entrar en SQL*Plus nos presenta el prompt y espera la
insercción de sentencias SQL. Todas las sentencias deben acabar con un ';'. Una
sentencia puede continuar en varias líneas, que SQL*Plus va numerando. Si queremos
anular la sentencia actual podemos hacerlo colocando un '.' como único carácter en una
línea. Si queremos volver a ejecutar la última sentencia se puede hacer con el comando
'/'. Si queremos ejecutar las sentencias que almacena un fichero .sql podemos hacerlo
anteponiendo el símbolo '@' al nombre del fichero.
La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los
comandos:
Comando AbreviaturaDescripción
APPEND texto A texto Añade texto al final de la línea.
Cambia el contenido 'fuente' por el
CHANGE/fuente/destino C/fuente/destino
'destino'
CHANGE/texto C/texto Quita 'texto' de una línea.
CLEAR BUFFER CL BUFF Borra el buffer
DEL DEL Borra una línea.
INPUT I Inserta una o más líneas.
INPUT texto I texto Inserta una línea con 'texto'.
LIST L Lista las líneas del buffer
LIST n Lnón Lista la línea n-ésima.
LIST * L* Lista la línea actual.
LIST LAST L LAST Lista la última línea.
Lista las líneas desde la m-ésima a la
LIST m n Lmn
n-ésima.
Al contenido del buffer también se puede acceder desde el editor del Sistema Operativo.
Así, el buffer podrá ser manipulado con las posibilidades del editor con el que estemos
acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para
conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable
DEFINE_EDITOR y luego llamar al editor.
SQL> define_editor=vi
SQL> edit
SPOOL fichero
Manda el resultado de las consultas al fichero.
SPOOL OUT
Manda el resultado de las consultas a la impresora.
SPOOL OFF
Cierra el fichero de spool.
EXIT
Al salir de SQL*Plus se cierran los ficheros de spool.
Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado,
almacenado y/o ejecutado; y tienen por defecto la extensión .sql :
4 Creación
La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya
que antes de poder almacenar información debemos definir los objetos básicos donde
agrupar la información. Los objetos básicos con que trabaja SQL son las tablas. Una
tabla es un conjunto de celdas agrupadas en filas y columnas donde se almacenan
elementos de información.
Antes de llevar a cabo la creación de una tabla conviene planificar:
• nombre de la tabla,
• nombre de cada columna,
• tipo y tamaño de los datos almacenados en cada columna,
• información adicional, restricciones, etc.
Hay que tener en cuenta también ciertas restricciones en la formación de los nombres de
las tablas: longitud máxima de 30 caracteres, no puede haber nombres de tabla
duplicados, deben comenzar con un carácter alfabético, permitir caracteres
alfanuméricos y el guión bajo '_', y Oracle no distingue entre mayúsculas y minúsculas.
4.2 Restricciones
Las restricciones de los datos se imponen para asegurarnos que los datos cumplen con
una serie de condiciones predefinidas para cada tabla. Estas restricciones ayudan a
conseguir la integridad de referencia: todas las referencias dentro de una BD son válidas
y todas las restricciones se han cumplido.
NOT NULL
Establece la obligatoriedad de que esta columna tenga un valor no nulo. Se debe
especificar junto a la columna a la que afecta. Los valores nulos no ocupan
espacio, y son distintos a 0 y al espacio en blanco. Hay que tener cuidado con
los valores nulos en las operaciones, ya que 1 * NULL es igual a NULL.
UNIQUE
Evita valores repetidos en una columna, admitiendo valores nulos. Oracle crea
un índice automáticamente cuando se habilita esta restricción y lo borra al
deshabilitarse.
DEFAULT
Establece un valor por defecto para esa columna, si no se le asigna ninguno.
CHECK
Comprueba que se cumpla una condición determinada al rellenar esa columna.
Esta condición sólo debe estar construida con columnas de esta misma tabla.
PRIMARY KEY
Establece el conjunto de columnas que forman la clave primaria de esa tabla. Se
comporta como única y obligatoria sin necesidad de explicitarlo. Sólo puede
existir una clave primaria por tabla. Puede ser referenciada como clave ajena por
otras tablas. Crea un índice automáticamente cuando se habilita o se crea esta
restricción. En Oracle, los índices son construidos sobre árboles B+.
FOREIGN KEY
Establece que el contenido de esta columna será uno de los valores contenidos
en una columna de otra tabla maestra. Esta columna marcada como clave ajena
puede ser NULL. No hay límite en el número de claves ajenas. La clave ajena
puede ser otra columna de la misma tabla. Se puede forzar que cuando una fila
de la tabla maestra sea borrada, todas las filas de la tabla detalle cuya clave ajena
coincida con la clave borrada se borren también. Esto se consigue añadiendo la
coletilla ON DELETE CASCADE en la definición de la clave ajena.
REM
REM tabla empleado con un código de empleado, un nombre,
un oficio, un
REM jefe, una fecha de alta en la empresa, un salario
mensual, una
REM comisión y el código del departamento donde trabaja.
REM
create table emp (
cod_emp number(3),
nombre varchar2(10) not null,
oficio varchar2(11),
jefe number(3),
fecha_alta date,
salario number(10),
comision number(10),
cod_dep number(3),
constraint emp_pk primary key (cod_emp),
constraint emp_fk foreign key (cod_dep) references
dep(cod_dep)
on delete cascade,
constraint emp_ck check (salario > 0)
);
DESCRIBE tabla
5 Modificación
Después de crear una tabla, a veces nos encontramos con que se necesita añadir una
columna adicional o modificar la definición de una columna existente. Esta operación se
puede realizar con el comando ALTER TABLE.
Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este
lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o
borrando el contenido de las tablas. Hay que recordar que estas sentencias no son
'autoconfirmadas' y requieren de la sentencia COMMIT para que sus efectos perduren en el
tiempo, o de la sentencia ROLLBACK para deshacer los cambios efectuados.
6.1 Inserción
El comando que permite insertar filas en las tablas es el siguiente.
6.2 Actualización
Otra de las operaciones más comunes es la modificación de la información almacenada
en las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a
continuación.
UPDATE tabla SET {columna = expresión,}+ [WHERE
condición];
Se especificará en la cláusula SET las columnas que se actualizarán y con qué valores.
La cláusula WHERE indica las filas con las que se va a trabajar. Si se omite la
actualización afectará a todas las filas de la tabla.
6.3 Borrado
Con insertar y modificar, la otra operación que completa el trio es la de borrado de filas.
La sintaxis es la que sigue:
Borrará todas las filas que cumplan la condición especificada en la cláusula WHERE. Si
esta cláusula no se fija, se borrarán todas las filas de la tabla. Aquí cabe decir que
aunque con DELETE borremos todas las filas de una tabla, no borramos la definición de
la tabla del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una
diferencia con la sentencia DROP TABLE, que produce la eliminación tanto del contenido
de la tabla como de la definición de la misma.
7 Selección
La recuperación de los datos en el lenguaje SQL se realiza mediante la sentencia
SELECT, seleccionar. Esta sentencia permite indicar al SGBD la información que se
quiere recuperar. Esta es la sentencia SQL, con diferencia, más habitual. La sentencia
SELECT consta de cuatro partes básicas:
SELECT {* | {columna,}+}
FROM {tabla,}+
[WHERE condición]
[ORDER BY {expresiónColumna [ASC | DESC],}+];
Como una primera utilización de la sentencia SELECT podemos utilizarla para ver todas
las tablas que tenemos en la base de datos.
TABLE_NAME
------------------------------
DEP
EMP
Un breve análisis de la sentencia anterior nos permite observar que hemos consultado
sobre la columna llamada table_name almacenada en la tabla user_tables, que es la
tabla que guarda la información sobre todas las tablas de cada usuario.
Cuando se consulta una base de datos, los nombres de las columnas se usan como
cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede
cambiarse con la misma sentencia SQL de consulta, creando un alias de columna.
Departamento Esta en
--------------- ----------
Administracion Valladolid
I+D Boecillo
Produccion Cigales
Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma
usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y
otro. Oracle siempre considera como prefijo el nombre del propietario de las tablas,
aunque no se lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que
se llamen igual sin que surjan conflictos. Si quisiéramos acceder a las filas de la tabla
dep del usuario jperez, (ademas de tener privilegios de lectura sobre esa tabla)
deberíamos escribir la siguiente sentencia SQL:
SQL> select * from jperez.dep;
También se puede asociar un alias a las tablas para abreviar los nombres de las tablas.
Un ejemplo se puede ver en la sentencia SQL siguiente:
Operadores de Comparación
Operadores de Aritméticos
Operador Operación Ejemplo
select nombre, salario+comision from emp where
+ Suma oficio='VENDEDOR';
select nombre from emp where sysdate-
- Resta fecha_alta > 365;
* Producto select nombre, salario*12 from emp;
/ División select nombre, salario/31 from emp;
NOMBRE SALARIO
---------- ----------
Cano 450000
Perez 350000
Roncal 350000
Yuste 350000
Recio 300000
Sastre 300000
Martin 235000
Garcia 225000
Garcia 210000
Mateo 200000
Santana 200000
Rueda 175000
Lopez 150000
Sanz 150000
14 rows selected.
7.5 Cláusula DISTINCT
Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias
columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave
principal, obtengamos filas repetidas en la respuesta.
Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los
distintos oficios de nuestros empleados.
OFICIO
-----------
Presidente
Director
Secretario
Contable
Comercial
Comercial
Director
Analista
Programador
Programador
Director
Analista
Programador
Programador
14 rows selected.
Pero si incluimos la cláusula DISTINCT la respuesta varía para adecuarse más a nuestras
espectativas.
OFICIO
-----------
Analista
Comercial
Contable
Director
Presidente
Programador
Secretario
7 rows selected.
7.6 Funciones
Existen en SQL muchas funciones que pueden complementar el manejo de los datos en
las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las
columnas, variables o constantes.
Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones
para cada tipo de datos:
• aritméticas,
• de cadenas de caracteres,
• de manejo de fechas,
• de conversión,
• otras,
• de grupo.
Funciones Aritméticas
Calcula el signo de n,
select sign(-12)
SIGN(n) devolviendo -1 si n<0, 0 si from dual; -1
n=0 y 1 si n>0.
Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la
presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha
y el resultado que generan.
Máscaras de Formato Numéricas
Otras Funciones
SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar
funciones sobre esos conjuntos de filas.
La sintaxis es la siguiente:
SELECT {* | {columna,}+}
FROM {tabla,}+
WHERE condición
GROUP BY {columna ,}+
HAVING condición
ORDER BY {expresiónColumna [ASC | DESC],}+;
En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la
cláusula HAVING se especifica la condición que han de cumplir los grupos para pasar al
resultado.
Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas
en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de
agrupamiento. En otras palabras, la columna nombre debe tener una función de
agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser así,
deberá llevar dicha columna a la cláusula GROUP BY.
COUNT(NOMBRE) OFICIO
------------- -----------
2 Analista
2 Comercial
1 Contable
3 Director
1 Presidente
4 Programador
1 Secretario
7 rows selected.
Funciones de Agrupamiento
Hay que tener en cuenta que los valores nulos no participan en el cálculo de las
funciones de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y
ALL. También se pueden utilizar aunque no realicemos agrupación alguna en la consulta,
considerando a toda la tabla como un grupo.
COUNT(*)
----------
14
Unión, UNION
Combina todas las filas del primer conjunto con todas las filas del segundo.
Cualquier fila duplicada se reducirá a una sóla.
Intersección, INTERSECT
Examinará las filas de los conjuntos de entrada y devolverá aquellas que
aparezcan en ambos. Todas las filas duplicadas serán eliminadas antes de la
generación del conjunto resultante.
Diferencia, MINUS
Devuelve aquellas filas que están en el primer conjunto pero no en el segundo.
Las filas duplicadas del primer conjunto se reducirán a una fila única antes de
empezar la comparación con el segundo conjunto.
Como ejemplo podemos consultar sobre todos los nombres de empleado que trabajan
para los departamentos 100 o 300. Esto se consigue restando a todos los nombres de
empleados, aquellos que están en el departamento 200.
NOMBRE
----------
Cano
Lopez
Martin
Recio
Roncal
Rueda
Santana
Sanz
Yuste
9 rows selected.
7.9 Combinaciones
Hasta ahora hemos construido consultas con una única tabla, pero esto no debe ser
siempre así.
Supongamos que queremos conseguir una lista con los empleados y los departamentos
para los que trabajan. Esta información está repartida en las dos tablas que tenemos, emp
y dep. Así, podríamos intentar una consulta que seleccionara el campo nombre de la
tabla emp y el nombre del departamento. Y aquí surge el primer problema, ¿cómo
distinguimos entre dos columnas que llamándose igual, pertenecen a tablas distintas?
Para eso se utiliza como prefijo o el nombre de la tabla (dep.nombre) o un alias de
tabla, un nombre que se asocia a cada tabla y se coloca como prefijo a la columna
(d.nombre).
NOMBRE NOMBRE
---------- ---------------
Cano Administracion
Roncal Administracion
Rueda Administracion
Martin Administracion
Sanz Administracion
Lopez Administracion
Perez Administracion
Sastre Administracion
Garcia Administracion
Mateo Administracion
Yuste Administracion
Recio Administracion
Garcia Administracion
Santana Administracion
Cano I+D
Roncal I+D
Rueda I+D
...
42 rows selected.
Para conseguir lo que queremos tenemos que forzar que se asocie a un empleado con el
nombre del departamento para el que trabaja. Y esto se puede hacer si añadimos la
condición de que el cod_dep tenga el mismo valor en la fila de la tabla emp que en la
fila escogida de la tabla dep:
NOMBRE NOMBRE
---------- ---------------
Cano Administracion
Roncal Administracion
Rueda Administracion
Martin Administracion
Sanz Administracion
Lopez Administracion
Perez I+D
Sastre I+D
Garcia I+D
Mateo I+D
Yuste Produccion
Recio Produccion
Garcia Produccion
Santana Produccion
14 rows selected.
Reglas de Combinación:
NOMBRE NOMBRE
---------- ---------------
Cano Administracion
Roncal Administracion
Rueda Administracion
Martin Administracion
Sanz Administracion
Lopez Administracion
Perez I+D
Sastre I+D
Garcia I+D
Mateo I+D
Yuste Produccion
Recio Produccion
Garcia Produccion
Santana Produccion
Distribucion
15 rows selected.
7.10 Subconsultas
A veces se han de utilizar en una consulta los resultados de otra consulta, llamada
subconsulta.
Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados
cuyo salario está por encima de la media:
NOMBRE
----------
Cano
Roncal
Perez
Sastre
Yuste
Recio
6 rows selected.
La consulta más interna calcula el salario medio, y la consulta más externa lo utiliza
para seleccionar los nombres que ganan más que la media.
Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la
creación de la misma con la cláusula AS. Si quisieramos crear una tabla con los datos de
los empleados del departamento 200 lo podríamos hacer de la siguiente manera:
Table created.
8 Eliminación
Cuando una tabla ya no es útil y no vamos a volver a necesitarla debe ser borrada. Esta
operación se puede realizar con el comando DROP TABLE.
Puede que si alguna columna de esta tabla a borrar sirva como clave ajena de alguna
tabla detalle, impida la eliminación de la tabla, ya que existe una restricción que
requiere de la existencia de la tabla maestra. Esto se puede areglar colocando la coletilla
CASCADE CONSTRAINTS. Esto produce que las restricciones de la tabla detalle se borren
antes de borrar la tabla maestra.
Table dropped.
9 Vistas
Una vista es como una ventana a través de la cual se puede consultar o cambiar
información de la tabla a la que está asociada.
Las vistas tienen la misma estructura que una tabla: filas y columnas. La única
diferencia es que sólo se almacena de ellas la definición, no los datos. Los datos que se
recuperan mediante una consulta a una vista se presentarán igual que los de una tabla.
De hecho, si no se sabe que se está trabajando con una vista, nada hace suponer que es
así. Al igual que sucede con una tabla, se pueden insertar, actualizar, borrar y
seleccionar datos en una vista. Aunque siempre es posible seleccionar datos de una
vista, en algunas condiciones existen restricciones para realizar el resto de las
operaciones sobre vistas.
La vista se crea con las columnas que devuelve una consulta. Si no nos importa que las
columnas de la vista hereden los nombres de las columnas recuperadas en la consulta no
tenemos que especificarlos.
La consultas sobre las vistas se tratan de igual modo que sobre las tablas.
Actualizaciones
La información puede ser actualizada en las vistas directamente o a través de las tablas
sobre las que se definen.
Podemos querer ver todos los datos de los empleados del departamento Administración.
6 rows selected.
10.1 Sinónimos
SQL permite crear un sinónimo para una tabla o vista. Esto supone que pueden
utilizarse dos nombres diferentes para un mismo objeto.
Creación de un Sinónimo
Borrado de un Sinónimo
Otra utilidad es la posibilidad de que un usuario acceda a las tablas de otro usuario
como si fueran suyas, siempre que tenga permiso para hacerlo, si al definir el sinónimo
incluye el nombre del usuario en la denominación de la tabla. Así si el usuarioA tiene
permiso para leer el contenido de la tabla emp del usuarioB, entonces desde la ejecución
de la sentencia CREATE SYNONYM plantilla FOR usuarioB.emp verá la tabla
usuarioB.emp como plantilla.
La sintásis es la siguiente
11 Lo Más SQL*Plus
En este apartado vamos a profundizar un poco en las otras posibilidades que nos brinda
SQL*Plus en los:
• ficheros de comandos, y
• generación de informes,
• líneas de comentarios,
• líneas de ejecución,
• líneas de comandos SQL, y
• líneas de comandos SQL*Plus.
Líneas de Comentarios
Líneas de Ejecución
SQL*Plus aporta una serie de posibilidades al lenguaje SQL que le acerca un poco mas
a lo que entendemos como un lenguaje de programación.
Variables de Usuario
Variables de Sustitución
Las variables de sustitución son un nombre de variable de usuario con el símbolo &
delante. Cuando SQL*Plus detecta una variable de sustitución en un comando, ejecuta
el comando tomando el valor de la variable.
Esto se puede ver en el ejemplo, donde preguntamos por los empleados que son
analistas:
NOMBRE OFICIO
---------- -----------
Sastre Analista
Recio Analista
Captura de Datos desde el Terminal
En muchas ocasiones es necesario recoger datos desde un terminal, que luego serán
utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las
variables de sustitución o los parámetros en la línea de comandos.
Cuando SQL*Plus reconoce una variable de sustitución sin valor asignado se lo pide al
usuario:
Si se desea que SQL*Plus pregunte por el valor de la variable al usuario sólo la primera
vez que se encuentra con ella, se colocará "&&" delante de la variable de usuario.
En el archivo de comandos nos referiremos a los parámetros con las variables &1, &2, ...
,&9 que se corresponden posicionalmente con ellos.
Pero de todo esto sólo vamos a ver el modo de realizar las operaciones más comunes y
sencillas.
Básicamente, el formato con el que se van a presentar los resultados de las cosultas
dependen de unos parámetros y de unos comandos.
Parámetros
• SET LINESIZE: pone el número máximo de caracteres por línea. Por defecto
vale 80 y el máximo es 999.
• SET PAGESIZE: pone el número de filas de la salida antes de empezar una
nueva página. Por defecto es 25. Incluye el título y las líneas de pausa.
• SET HEADING [ON | OFF]: Activa/desactiva la utilización de encabezados de
columnas. Por defecto está activado.
• SET NULL texto: Indica la cadena de caracteres que hay que colocar en
sustitución de los valores NULL. Por defecto es "".
• SET ECHO [ON | OFF]: Activa/desactiva la visualización de los comandos que
SQL*Plus ejecuta según van siendo tratados. Por defecto está desactivada.
• SET FEEDBACK [ n | ON | OFF]: Muestra el número de registros recuperados
en cada consulta cuando se recuperan n o más registros. ON se pueden
considerar como n=1, y OFF como n=0.
• SET VERIFY [ON | OFF]: Controla la salida de confirmación para los valores
de las variables de sustitución. Por defecto está activado.
Comandos
Sesiones SQL*Plus
Para hacer la conexión a SQL*Plus, es necesario conectarse via telnet a altair.usb.ve.
Una vez indicado el login (de la forma ci3391xx) y el correspondiente password, se
debe entrar al manejador PL/SQL, tecleando:
$ sqlplus loginname
SQL>
$ sqlplus loginname/password
¿Cómo cambiar el password?
Una vez que se está trabajando con el manejador, es posible cambiar el password, con el
comando:
Salir de SQL*Plus
Para salir de SQL*Plus basta con teclear en la linea de comandos de ORACLE:
SQL> quit;
Creación de esquemas
En SQL*Plus es posible usar todos los comandos básicos de SQL con algunas
restricciones de sintaxis. Para crear una tabla, debe teclearse en la linea de comandos:
Note además que los comandos en SQL no son case sensitive, por lo cual no habra
diferencia entre una tabla empleado y una tabla EMPLEADO.
La sentencia anterior crea una relación empleado, con las siguientes características:
Tipos de datos
Tipo Descripción
CHAR(n) Cadena de caracteres de longitud n. Una vez que se declara, se reserva
espacio para n caracteres, aun cuando no se usen todos.
VARCHAR2(n) Cadena de caracteres de longitud n. Se define un máximo de n
caracteres, pero solo se usa el espacio correspondiente a los caracteres ocupados
VARCHAR(n) Exactamente lo mismo que VARCHAR2(n)
NUMBER(p,s) Número en punto flotante, de p dígitos, de los cuales s son decimales. El
parámetro s puede ser omitido, con lo cual se considerará que su valor es 0. El valor por
defecto para p es 38.
DATE Fecha comprendida entre Enero 1, 4712 aC y Diciembre 31, 4712 dC.
Inserción de tuplas
Para insertar tuplas en una relación se usa la instrucción INSERT de SQL:
Por ejemplo, para insertar una nueva tupla en la relación empleado, basta con escribir:
A continuación se presenta una tabla con algunos de los formatos mas usados:
Formato Descripción
HH, HH12 Hora en el formato tradicional 1-12
HH24 Hora en el formato de 24 horas (0-23)
MI Minutos (0-59)
DD Dia del mes (1-31 con restricciones)
D Dia de la semana (0=domingo)
MM Mes en formato numerico (1-12)
MON Nombre del mes abreviado a tres caracteres, en inglés (JAN=Enero)
MONTH Nombre del mes en inglés. En caso de ser un nombre corto, se rellena con
espacios en blanco hasta nueve caracteres (MARCH=marzo, JANUARY=enero, . . .)
YY Año en formato de dos dígitos (se asume 19xx)
YYYY Año en formato de 4 dígitos.
Eliminando tablas
Para eliminar una tabla determinada, se usa la instrucción DROP TABLE, de la
siguiente manera:
Un caso especial se presenta si la relación a ser eliminada está referenciada por claves
foráneas en otra(s) relación(es). En este caso, se debe hacer la llamada de la siguiente
manera:
De esta manera se eliminarán todas las tuplas en otras relaciones que referencien a la
clave primaria de la relación a ser eliminada. Si no se incluye el parámetro CASCADE
CONSTRAINTS y existe alguna referencia a una tupla que se eliminará, ORACLE
retornará un mensaje de error y no eliminará la relación.
creacion de scripts en oracle
Un script no es mas que un archivo de texto, con instrucciones de SQL separadas por
punto y coma. Dichos archivos deben tener permiso de lectura para el usuario (100), y
para ejecutar su contenido se debe usar la instrucción START, de la siguiente manera:
LOAD DATA
INFILE *
INTO TABLE test
FIELDS TERMINATED BY ','
(num,name)
BEGINDATA
1,foo
2, bar
3,baz
4,glorp
5,snarf
El proposito de este archivo es cargar datos en una relación llamada test, la cual tiene
dos atributos: num y name,de tipo NUMBER y CHAR(10), respectivamente. El
significado de cada una de las líneas (en el orden que aparecen) es:
Notese que en las segunda tupla insertada aparece un espacio en blanco entre la coma y
el nombre bar. Esto producirá como resultado que se almacene la tupla (2, ' bar') en
lugar de la tupla (2, 'bar'), por locual, al hacer una consulta donde nombre='bar', nunca
se obtendría dicha tupla.
LOAD DATA
INFILE 'test.txt'
APPEND INTO TABLE test
FIELDS TERMINATED BY ','
(num,name)
Representación de fechas
El tipo de datos DATE es representado en un formato que brinda considerable
flexibilidad. Primero, debe declararse la tabla con un atributo de tipo DATE. He aquí un
ejemplo sencillo:
CREATE TABLE Foo (
i NUMBER,
d DATE
);
Ahora, en el archivo de control, al describir los atributos de la tabla a ser cargada, puede
acompañarse cada nombre de atributo con su tipo. Aún cuando esto puede hacerse para
todos los atributos, en el siguiente ejemplo se hará solo para el atributo de fecha (d).
En el ejemplo tenemos, seguido del indicador de tipo DATE, una máscara de fecha que
describe el formato que va a tener la fecha en los datos de entrada. La máscara de fecha
es una cadena de caracteres, encerrada con comillas dobles, que debe seguir las
siguientes convenciones:
Las secuencias de letras que comiencen con d, m o y, denotan campos en los datos que
deben ser interpretados como dias, meses y años, respectivamente. Como casi todo en
SQL, se permiten letras mayúsculas.
Todos los demás caracteres son tratados literalmente, y deben aparecer en los datos, si
fueron colocados en la máscara.
Los campos usados representan longitud maxima para los valores correspondientes.
He aquí un ejemplo de un archivo de carga:
LOAD DATA
INFILE *
INTO TABLE Foo
FIELDS TERMINATED BY ','
(i,d DATE "dd-mm-yyyy")
BEGINDATA
1,01-02-1234
2,3-4-1997
(12234765,'Freedy Arias',30-10-1997,120000.00)
(14236879,'Jose Montenegro',12-08-1997,75535.00)
(12234765,'Pedro Perez',NULL,100000,00)
(12234765,'Carolina Rodriguez',30-10-1997,98000.00)
LOAD DATA
INFILE *
INTO TABLE empleado
FIELDS TERMINATED BY ','
(ci,nombre,ult_vacaciones DATE "dd-mm-yyyy",sueldo)
BEGINDATA
12234765,Freedy Arias,30-10-1997,120000.00
14236879,Jose Montenegro,12-08-1997,75535.00
12234765,Pedro Perez,,100000,00)
12234765,Carolina Rodriguez,30-10-1997,98000.00
A continuación debe indicarse el nombre del archivo de control. Por último se debe
indicar el nombre de otro archivo, el archivo de log, en el cual sqlload coloca cierta
información de utilidad acerca de lo que hizo, incluyendo una descripción de los erores
que hubieran ocurrido durante la ejecución. Por ejemplo, si el usuario CURSO00, con
password prof%01 quisiera cargar los datos que se indican en carga.ctrl y obtener el
resultado en carga.log, debería usar:
Una vista es una tabla logica, que muestra una parte de la base de datos. Las vistas
permiten "almacenar" de manera logica los resultados de los queries.
Esta vista mostrará el salario anual de todos los empleados del departamento de
Computer Science.
Si se modifica la información de alguna de las tablas base referenciadas por la vista, y
luego se ejecuta un query sobre la misma, la información que se obtendrá será la nueva.
Es decir, la información no se almacena en la vista, sino que se carga dinamicamente al
momento de efectuar alguna consulta.
DECLARE
BEGIN
EXCEPTION
END;
Solo se requiere que aparezca la sección ejecutable. Lo demas es opcional. Las unicas
instrucciones SQL permitidas en un bloque PL/SQL son INSERT, UPDATE, DELETE y
SELECT, ademas de algunas instrucciones para manipulación de datos, e instrucciones
para control de transacciones. Otras instrucciones de SQL como DROP, CREATE o
ALTER no son permitidas. Se permite el uso de comentarios estilo C (/* . . .*/). PL/SQL
no es case sensitive por lo que no hay distinción entre nombres con mayusculas y
minusculas.
En la sección de declaraciones, se indican las variables que serán usadas dentro del
bloque y sus tipos. Por ejemplo:
DECLARE
myBeer VARCHAR(20);
price NUMBER(6,2);
En algunos casos, es posible que se desee que el tipo de una variable coincida con el
tipo usado para una columna de una tabla determinada, en esos casos se puede usar la
construcción:
DECLARE
myBeer Beers.name%TYPE;
Con lo cual se logra que la variable myBeer tenga el mismo tipo que la columna name
de la tabla Beers.
Tambien es posible inicializar las variables, mediante el operador :=. Ademas, mediante
el uso del mismo operador es posible hacer asignaciones en el cuerpo del programa. Por
ejemplo:
DECLARE
price NUMBER := 300;
BEGIN
price := price + 150;
END;
.
run
IF (condicion)
THEN (lista de acciones)
ELSE (lista de acciones)
END IF;
Si se desea, se puede hacer el uso de varios casos de condición, mediante el uso de:
IF . . . THEN . . .
ELSIF . . . THEN . . .
ELSIF . . . THEN . . .
.
.
.
ELSE . . .
END IF;
LOOP
lista_de_instrucciones
END LOOP;
De esta manera, el lazo terminará cuando la condición sea verdadera. Además es posible
utilizar la instrucción:
En este caso i es una variable de uso local, por lo que no es necesario que sea declarada,
y puede ser usada dentro del lazo, mientras que a y b son constantes.
Procedimientos almacenados
Este procedimiento actualizará la(s) tupla(s) con numero de cuenta igual al parámetro
acc_no con un incremento de amount en el balance de dicha cuenta.
Funciones en oracle
Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta cuando una
determinada instrucción en SQL se va a ejecutar sobre dicha tabla.
El modificador FOR EACH ROW indica que el trigger se disparará cada vez que se
desee hacer operaciones sobre una fila de la tabla. Si se acompaña del modificador
WHEN, se establece una restricción; el trigger solo actuará, sobre las filas que
satisfagan la restricción.