Documentos de Académico
Documentos de Profesional
Documentos de Cultura
html Página 1 de 84
Introducción: Tutorial de Oracle
Oracle es uno de los sistemas gestores de bases de datos más potentes del mercado. Es un
sistema comercial con cualidades empresariales, muy usado en todo el mundo.
En este tutorial aprenderas a gestionar bases de datos con Oracle y administrar el sistema
gestor de base de datos, para realizar configuraciones y usos de todo tipo.
No busca ser un manual exahustivo, pues Oracle es uno de los sistemas de bases de datos más
complejos y sería complicado abarcarlo todo, pero al menos sí ofrece una introducción a los
asuntos más importantes, que se abordan en las formaciones de Oracle.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 2 de 84
Autores del manual
Las siguientes personas han participado como autores escribiendo artículos de este manual.
Sara Alvarez
Equipo DesarrolloWeb.com
Agustin Jareño
Claudio
David Masip
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 3 de 84
Qué es Oracle
Es posible lógicamente atacar a la base de datos a través del SQL plus incorporado en el
paquete de programas Oracle para poder realizar consultas, utilizando el lenguaje SQL.
El Developer es una herramienta que nos permite crear formularios en local, es decir,
mediante esta herramienta nosotros podemos crear formularios, compilarlos y ejecutarlos,
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 4 de 84
pero si queremos que los otros trabajen sobre este formulario deberemos copiarlo
regularmente en una carpeta compartida para todos, de modo que, cuando quieran realizar un
cambio, deberán copiarlo de dicha carpeta y luego volverlo a subir a la carpeta. Este sistema
como podemos observar es bastante engorroso y poco fiable pues es bastante normal que las
versiones se pierdan y se machaquen con frecuencia. La principal ventaja de esta herramienta
es que es bastante intuitiva y dispone de un modo que nos permite componer el formulario, tal
y como lo haríamos en Visual Basic o en Visual C, esto es muy de agradecer.
Los problemas anteriores quedan totalmente resueltos con Designer que es una herramienta
que se conecta a la base de datos y por tanto creamos los formularios en ella, de esta manera
todo el mundo se conecta mediante Designer a la aplicación que contiene todos los formularios
y no hay problemas de diferentes versiones, esto es muy útil y perfecto para evitar machacar el
trabajo de otros. Pero el principal y más notable problema es la falta de un entorno visual para
diseñar el formulario, es decir, nos aparece una estructura como de árbol en la cual insertamos
un formulario, a la vez dentro de éste insertamos bloques o módulos que son las estructuras
que contendrán los elementos del formularios, que pueden estar basados en tablas o no.
Por lo tanto si queremos hacer formularios para practicar o para probar qué es esto de Oracle,
os recomiendo que uséis Developer pues es mucho más fácil e intuitivo al principio.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 5 de 84
SQL con Oracle
Empezamos un nuevo curso sobre SQL con Oracle que puede resultar muy interesante para
ampliar los conocimientos de SQL que habíamos adquirido anteriormente.
Introducción:
Antes de empezar me gustaría decir que este curso esta basado en Oracle, es decir los ejemplos
expuestos y material se han utilizado sobre Oracle. Por otro lado decir que pienso que es
interesante saber algo de SQL antes de comenzar con MYSQL, ya que, aunque existen algunos
cambios insignificantes, sabiendo manejar SQL sabes manejar MYSQL.
Algunas caracteristicas:
SQL: Structured query language.
Tipos de datos:
CHAR:
Almacena de 1 a 255.
Si se introduce una cadena de menos longitud que la definida se rellenara con blancos a
la derecha hasta quedar completada.
Si se introduce una cadena de mayor longitud que la fijada nos dará un error.
VARCHAR:
Si se introduce una cadena de menor longitud que la que esta definida, se almacena con
esa longitud y no se rellenara con blancos ni con ningún otro carácter a la derecha hasta
completar la longitud definida.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 6 de 84
Si se introduce una cadena de mayor longitud que la fijada, nos dará un error
NUMBER:
Ejemplo:
X=number (7,2)
X= 155'86 à Bien
LONG:
DATE:
Siglo/Año/Mes/Día/Hora/Minutos/Segundos
RAW:
LONGRAW:
ROWID:
Select:
{[Where condición]
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 7 de 84
Vamos a explicar como leer la consulta anterior y así seguir la pauta para todas las demás.
Cuando ponemos [] significa que debemos la que va dentro debe existir, y si además ponemos |
significa que deberemos elegir un valor de los que ponemos y no mas de uno. En cambio si
ponemos {} significa que lo que va dentro de las llaves puede ir o no, es decir es opcional y se
pondrá según la consulta.
Desc Emple; = Nos da un resumen de la tabla y sus columnas. En este caso de la tabla
Emple.
Not Null= Si aparece en una lista de una columna significa que la columna no puede
tener valores nulos.
Nota: Nótese que cada consulta de SQL que hagamos hemos de terminarla con un punto y
coma ";".
FROM JUGADORES
ORDER BY APELLIDO;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 8 de 84
'Valencia' y se ordenara (order by) apellido. Notemos también que no pone ni 'Distinct' ni 'All'.
Por defecto generara la sentencia con ALL.
SELECT *
FROM JUGADORES
ORDER BY JUGADOR_NO;
Este ejemplo muestra todos los campos de la tabla jugadores donde (Where) la posición sea
igual que 'Delantero' y lo ordena por número de jugador. Al no poner nada se presupone que es
ascendentemente (Asc).
SELECT *
FROM JUGADORES
En este ejemplo selecciona todos los campos de la tabla jugadores donde (Where) el nombre
del equipo sea igual a 'Valencia' y la posición de los jugadores sea igual a 'Delantero'. Por
ultimo los ordena por 'Apellido' descendentemente y por numero de jugador ascendentemente.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 9 de 84
Instalar Oracle Database 10g Express
Pasamos a describir los pasos necesarios para instalar el sistema gestor de base de datos Oracle
Database 10g Express.
Lo primero que tenemos que hacer es descargar los archivos de instalación del sistema gestor
de bases de datos. Para ello accedemos a la página oficial de Oracle y nos descargamos el
archivo Oracle Database 10g Express Edition (Universal) de esta URL. La página de Oracle
solicitará nuestro registro para realizar la descarga, pues tenemos que ser usuarios registrados
para poder bajarlo. En realidad se tarda dos minutos en registrarse.
Una vez descargado, iniciamos la instalación y lo primero que nos pedirá sera introducir una
contraseña para el usuario sys y el system (implementa la misma a los dos usuarios por
defecto). Podemos elegir cualquier clave, además siendo una instalación en local tiene menos
importancia que sea segura. De cualquier modo, lo que sí es importante es que la recodemos,
así que no estará de más el apuntar dicha contraseña en algún lugar, ya que más adelante la
necesitaremos.
Una vez instalado el sistema gestor, podemos acceder a nuestra base de datos online a través
de tu menú inicio / programas / base de datos Oracle. En este menú podemos iniciar los
servicios de Oracle, iniciar el sql *plus, así como dirigirnos a la página de inicio de nuestra base
de datos.
Es importante tener arrancados los servicios relacionados con la base de datos Oracle, ya que
si no lo están, la base de datos no funcionará. Pero cabe comentar por otro lado, que tener los
servicios funcionando come muchos recursos, por lo que os recomiendo que, cuando no estáis
utilizando la base de datos Oracle, paréis los servicios.
La puesta en marcha o parado de los servicios relacionados con la base de datos Oracle se
puede hacer desde el panel de control / herramientas administrativas / servicios. Entonces
tenéis que buscar los servicios que se llaman Oracleservicesxe y OracleXETNSListener y
cambiarlos a manual, para así poderlos arrancar y parar cuando vosotros queráis.
Ahora podemos irnos a la pagina de inicio de nuestra base de datos, la cual accedemos
mediante el menu inico->programas->Base de datos Oracle 10g Express Edition->pagina de
inicio de la base de datos, para ver la forma visual de hacer todas estas cosas.
Cuando abramos la página de incio de nuestra base de datos nos pedirá un usuario y una
contraseña, tendréis que poner como usuario system y la contraseña que le hayáis dado al
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 10 de 84
instalar el sistema. Una vez dentro, tenemos las opciones de administración (todo lo referente
a la seguridad de sistema), explorador de objetos (todo lo referente a las tablas), sql ( para
hacer las cosas por linea de comando) y utilidades diversas para tu base de datos.
Este interfaz visual que nos ofrece la pagina de inicio de nuestra base de datos te facilitará
mucho el trabajo pero no nos valdrá para hacer nada con SQL *Plus ya que solo nos deja
realizar operaciones sql básicas.
Por lo tanto, quizás nos interesará utilizar la opción que tenemos en nuestro escritorio, que se
llama "ejecutar linea de comandos SQL". Con ello nos abre una pantalla de DOS con el editor
de SQL *Plus.
Nota:Quiero recordar que esto es una versión online de tu base de datos, para instalar una
versión completa tendríamos que bajarnos el Oracle Database 10g ( que incluye sistema
cliente, ejemplos, sistema gateway y sistema clusterware para desarrolladores) y
tendríamos muchas más opciones que ya comentaremos más adelante. La diferencia
fundamental es que la version express puede manejar solamente hasta 4 GB de datos y 1 GB
de memoria. Esta versión puede embeberse con otras aplicaciones de terceros y se puede
distribuir gratuitamente.
Con esto instalado ya podemos comenzar a explicar el SQL *Plus y sus múltiples opciones.
Antes de comenzar os comento que necesitaremos una serie de tablas para ir haciendo
ejercicios y os aconsejaría que os creéis algunos usuarios más con distintos privilegios para ir
repasando lo que hemos comentado de la seguridad en Oracle . Esto lo podéis hacer de forma
visual o por linea de comando desde la pagina inicial de tu base de datos.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 11 de 84
Gestión de seguridad en Oracle I
Donde unlimited significa que no hay limite sobre un recurso particular y default significa que
coge el limite del perfil DEFAULT
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 12 de 84
Para borrar un perfil tenemos que ejecutar la siguiente orden:
Es importante saber si este perfil esta asignado a algún usuario ya que, si es así, tendremos que
poner "cascade", para que lo elimine de esos usuarios también.
Donde:
Para modificar un tablespace cambiamos el create por el alter mientras que para borrarlo basta
con hacer drop tablespace nombre_tablespace;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 13 de 84
Fue publicado / actualizado en 08/01/2009
Disponible online en https://desarrolloweb.com/articulos/gestion-seguridad-oracle-
I.html
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 14 de 84
Gestión de seguridad en Oracle II
Continuamos con los conceptos básicos en la gestión de seguridad de una base de datos.
Seguridad de los datos en Oracle.
En el articulo anterior hablábamos de que existían dos tipos de seguridad en un sistema gestor
de base de datos. El primero era el encaminado a la seguridad del sistema (enlace al articulo
anterior) y el segundo el encaminado a la seguridad de los datos, tema que vamos a abarcar en
este segundo articulo.
Lo que hace tener una cierta seguridad en nuestros datos es la utilización de usuarios. Estos
usuarios son nombres que definimos y a los cuales damos una contraseña para acceder a la
base de datos.
En Oracle cada usuario esta asignado a un esquema. Siendo un esquema una colección lógica
de objetos. Por defecto un usuario tiene acceso a todos los objectos de su esquema y podría
acceder a los objetos de otros esquemas como los permisos necesarios.
Para modificar el usuario cambiaremos el create por el alter y para borrarlo tan solo tendremos
que poner drop user nombre_usuario cascade;Cada usuario tiene ciertos privilegios, y dentro
de esos privilegios podemos hablar de:
privilegios de sistema: son los que nos dan derecho a realizar ciertas operaciones sobre
objetos de un tipo especificado.
Roles de usuario
Un rol es un conjunto de permisos que recibe un nombre común y facilita la tarea de dar
permisos a los usuarios. Para crear un rol tan solo tenemos que escribir lo siguiente: create role
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 15 de 84
nombre_role;
Oracle ofrece varios roles o funciones ya creadas que ofrecen ciertos privilegios. Esos roles son
los siguientes:
connect: Todos los permisos necesarios para iniciar una sesión en Oracle
resource: Todos los permisos necesarios para tener recursos para la creación de objetos
dba: posee todos los privilegios del sistema
En ambos caso se utiliza la sentencia revoke para suprimir privilegios, cambiando la sintaxis.
Para los privilegios de sistema:
Con esto podríamos empezar a gestionar una base de datos, siempre y cuando tengamos
algunos conocimientos de pl/sql. Esto lo veremos en sucesivos artículos que iremos
publicando.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 16 de 84
Usuarios en Oracle
DESC DICTIONARY;
Con la orden:
Se visualizan los objetos del diccionario de datos a los que se puede acceder.
Creación deusuarios:
IDENTIFIED BY CLAVE_ACCESO
[PROFILE PERFIL];
DEFAULT TABLESPACE= Asigna a un usuario el tablespace por defecto para almacenar los
objetos que cree. Si no se asigna ninguno, el tablespace por defecto es SYSTEM. TEMPORARY
TABLESPACE= Especifica el nombre del tablespace para trabajar temporales. Si no se
especifica ninguno, el tablespace por defecto es SYSTEM. QUOTA= Asigna un espacio en
megabites o kilobites en el tablespace asignado. Si no se especifica esta cláusula, el usuario no
tiene cuota asignada y no podrá crear objetos en el tablespace. Para tener espacio y acceso
ilimitad a un tablespace es:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 17 de 84
PROFILE= Asigna un perfil a un usuario.
Modificación de usuarios:
[PROFILE PERFIL];
Borrado de usuarios:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 18 de 84
Claves primarias con SQL con Oracle
Rollback:
Permite ir hasta el último COMMIT hecho o en su defecto hasta el comienzo de las órdenes con
lo que estas no se ejecutan.
Commit:
Cuando ejecutamos ordenes estas no son creadas en la tabla hasta que ponemos este orden,
por tanto los cambios realizados se perderán si al salir del programa no realizamos esta acción.
Puede programarse para que lo haga automáticamente.
QUIT
EXIT
CONNECT
DISCONNECT
CREATE TABLE
CREATE VIEW
GRANT
REVOQUE
DROP TABLE
DROP VIEW
ALTER
AUDIT
NO AUDIT
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 19 de 84
Su primer carácter debe ser alfabético y el resto pueden ser letras, números y el carácter
subrayado.
) TABLESPACE ESPACIO_DE_TABLA;
Características:
Los usuarios pueden consultar las tablas creadas por medio de la vista USER_TABLES.
Integridad de datos:
La integridad hace referencia al hecho de que los datos de la base de datos han de ajustarse a
restricciones antes de almacenarse en ella. Una restricción de integridad será: Una regla que
restringe el rango de valores para una o más columnas en la tabla.
Usamos la cláusula CONSTRAINT, que puede restringir una sola columna o un grupo de
columnas de una misma tabla. Hay dos modos de especificar restricciones:
Formato:
(COLUMNA1 TIPO_DE_DATO
{CONSTRAINT NOMBRE_RESTRICCION}
{NOT NULL}
{UNIQUE}
{PRIMARY KEY}
{DEFAULT VALOR}
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 20 de 84
{ON DELETE CASCADE}}
{CHECK CONDICION},
COLUMNA2...
{TABLESPACE ESPACIO_DE_TABLA} ;
(COLUMNA1 TIPO_DATO ,
COLUMNA2 TIPO_DATO,
COLUMNA3 TIPO_DATO,
...
{CONSTRAINT NOMBRERESTRICCION}
{CONSTRAINT NOMBRERESTRICCION}
COLUMNA])
{CONSTRINT NOMBRERESTRICCIONI}
{CHECK (CONDICION)}
)[TABLESPACE ESPACIO_DE_TABLA];
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 21 de 84
Definición de claves para tablas y
restricciones
Vemos claves primarias y claves externas (foreing keys) y aprendemos a aplicar restricciones a
los distintos campos de las tablas.
Es una columna o un conjunto de columnas que identifican unívocamente a cada fila. Debe ser
única, no nula y obligatoria. Como máximo, podemos definir una clave primaria por tabla. Esta
clave se puede referenciar por una columna o columnas. Cuando se crea una clave primaria,
automáticamente se crea un índice que facilita el acceso a la tabla.
COL2 TIPO_DATO
)[TABLESPACE ESPACIO_DE_TABLA];
(COL1 TIPO_DATO,
COL2 TIPO_DATO,
)[TABLESPACE ESPACIO_DE_TABLA];
Esta formada por una o varias columnas que están asociadas a una clave primaria de otra o de
la misma tabla. Se pueden definir tantas claves ajenas como se precise, y pueden estar o no en
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 22 de 84
la misma tabla que la clave primaria. El valor de la columna o columnas que son claves ajenas
debe ser: NULL o igual a un valor de la clave referenciada (regla de integridad referencial).
(COLUMNA1 TIPO_DATO
[CONSTRAINT NOMBRERESTRICCION]
)[TABLESPACE ESPECIO_DE_TABLA];
(COLUMNA1 TIPO_DATO,
COLUMNA2 TIPO_DATO,
[CONTRAINT NOMBRERESTRICCION]
COLUMNA])]
)[TABLESPACE ESPACIO_DE_TABLA];
Notas:
Hay que crear primero una tabla y después aquella que le hace referencia.
Hay que borrar primero la tabla que hace referencia a otra tabla y después la tabla que
no hace referencia.
Borrado en cascada (ON DELETE CASCADE): Si borramos una fila de una tabla
maestra, todas las filas de la tabla detalle cuya clave ajena sea referenciada se borraran
automáticamente. La restricción se declara en la tabla detalle. El mensaje "n filas
borradas" solo indica las filas borradas de la tabla maestra.
NOT NULL: Significa que la columna no puede tener valores nulos. DEFAULT: Le
proporcionamos a una columna un valor por defecto cuando el valor de la columna no se
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 23 de 84
especifica en la cláusula INSERT. En la especificación DEFAULT es posible incluir varias
expresiones: constantes, funciones SQL y variables UID y SYSDATE. Verificación de
restricciones: CHECK: Actúa como una cláusula where. Puede hacer referencia a una o más
columnas, pero no a valores de otras filas. En una cláusula CHECK no se pueden incluir
subconsultas ni las pseudoconsultas SYSDATE, UID y USER.
UNIQUE: Evita valores repetidos en la misma columna. Puede contener una o varias
columnas. Es similar a la restricción PRIMARY KEY, salvo que son posibles varias columnas
UNIQUE definidas en una tabla. Admite valores NULL. Al igual que en PRIMARY KEY,
cuando se define una restricción UNIQUE se crea un índice automáticamente.
CREATE TABLE: permite crear una tabla a partir de la consulta de otra tabla ya existente. La
nueva tabla contendrá los datos obtenidos en la consulta. Se lleva a cabo esta acción con la
cláusula AS colocada al final de la orden CREATE TABLE.
(COLUMNA [,COLUMNA]
)[TABLESPACE ESPACIO_DE_TABLA]
AS CONSULTA;
No es necesario especificar tipos ni tamaño de las consultas, ya que vienen determinadas por
los tipos y los tamaños de las recuperadas en la consulta. La consulta puede tener una
subconsulta, una combinación de tablas o cualquier sentencia select valida. Las restricciones
CON NOMBRE no se crean en una tabla desde la otra, solo se crean aquellas restricciones que
carecen de nombre.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 24 de 84
Supresión y modificación de tablas con SQL
Supresión de tablas:
DROP TABLE: suprime una tabla de la base de datos. Cada usuario puede borrar sus propias
tablas, pero solo el administrador o algún usuario con el privilegio "DROP ANY TABLE" puede
borrar las tablas de otro usuario. Al suprimir una tabla también se suprimen los índices y los
privilegios asociados a ella. Las vistas y los sinónimos creados a partir de esta tabla dejan de
funcionar pero siguen existiendo en la base de datos por tanto deberíamos eliminarlos.
Ejemplo:
TRUNCATE: permite suprimir todas las filas de una tabla y liberar el espacio ocupado para
otros usos sin que reaparezca la definición de la tabla de la base de datos. Una orden
TRUNCATE no se puede anular, como tampoco activa disparadores DELETE.
Modificación de tablas:
Se modifican las tablas de dos formas: Cambiando la definición de una columna (MODIFY) ó
añadiendo una columna a una tabla existente (ADD): Formato:
ADD= Añade una columna o mas al final de una tabla. MODIFY= Modifica una o mas
columnas existentes en la tabla. ADD CONSTRAINT= Añade una restricción a la definición de
la tabla. DROP CONSTRAINT= Elimina una restricción de la tabla.
A la hora de añadir una columna a una tabla hay que tener en cuenta:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 25 de 84
Si la columna no esta definida como NOT NULL se le puede añadir en cualquier
momento.
Si la columna esta definida como NOT NULL se pueden seguir estos pasos:
La opción MODIFY… NOT NULL solo será posible cuando la tabla no contenga ninguna
fila con valor nulo en la columna que se modifica.
Adición de restricciones:
Borrado de restricciones:
La orden ALTER TABLE con la cláusula DROP CONSTRAINT; con la que se borran las
restricciones con nombre y las asignadas por el sistema. Formato:
NOMBRE_RESTRICCION:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 26 de 84
Manipulación de datos con SQL
Utilizando SQL con Oracle aprendemos como hacer Inserciones, actualizaciones y a eliminar
datos.
Insert:
Propiedades:
Los valores que se dan a las columnas deben coincidir con el tipo de dato definido en la
columna.
Los valores constantes de tipo carácter han de ir encerrados entre comillas simples (' ')
(los de tipo fecha también).
Con Select:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 27 de 84
Update:
Actualiza los valores de las columnas para una o varias filas de una tabla:
UPDATE NOMBRETABLA
WHERE CONDICION;
Con Select:
Cuando la subconsulta (orden select) forma parte de SET, debe seleccionar el mismo numero
de columnas, (con tipos de datos adecuados) que los que hay entre paréntesis al lado de SET.
UPDATE NOMBRETABLA
UPDATE NOMBRETABLA
WHERE CONDICION;
Delete:
WHERE CONDICION;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 28 de 84
SQL con Oracle. Operadores
Operadores aritméticos:
= Suma
= Resta
= Multiplicación / = división
!> = Distinto
= = Mayor o igual que <= = Menor o igual que = = Igual que Like = Se utiliza para unir
cadenas de caracteres. Propiedades: % = representa cualquier cadena de caracteres de 0 o
mas caracteres. _= representa un único carácter cualquiera. Not = Negación And = y a and
b Cierto si son ciertas a y b. Or = o a or b Cierto si a o b son ciertas
Obtenemos los datos de los jugadores cuyos apellidos empiecen con una "S":
SELECT APELLIDO
FROM JUGADORES
SELECT APELLIDO
FROM JUGADORES
Obtenemos aquellos apellidos que empiezan por "A" y tiene una "o" en su interior:
SELECT APELLIDO
FROM JUGADORES
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 29 de 84
Comprobación con conjuntos de valores:
Ejemplo:
SELECT APELLIDOS
FROM JUGADORES
Selecciona los apellidos de los jugadores donde el número de jugador (Jugador_num) sea (In)
o 10 o 20
SELECT APELLIDOS
FROM JUGADORES
Selecciona los apellidos de los jugadores donde el salario de estos no este entre (Not Between)
15000000 y 20000000.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 30 de 84
Funciones SQL
Vemos los distintos tipos de funciones y algunos ejemplos de las mismas con SQL para Oracle.
ABS(n)=
CEIL(n)=
FLOOT(n) =
SIGN (valor)=
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 31 de 84
Indica el signo del "valor".
SQRT(n)=
Trunca números para que tengan una cierta cantidad de dígitos de precisión.
VAIRANCE (valor)=
AVG(n)=
COUNT (* | Expresión)=
Cuenta el numero de veces que la expresión evalúa algún dato con valor no nulo. La opción "*"
cuenta todas las filas seleccionadas.
MAX (expresión)=
Calcula el máximo.
MIN (expresión)=
Calcula el mínimo.
SUM (expresión)=
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 32 de 84
LEAST (valor1, valor2…)=
CHR(n) =
LOWER (cad)=
UPPER (cad)=
INITCAP (cad)=
Añade caracteres a la izquierda de la cadena hasta que tiene una cierta longitud.
Añade caracteres a la derecha de la cadena hasta que tiene una cierta longitud.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 33 de 84
Suprime un conjunto de caracteres a la derecha de la cadena.
ASCII(cad)=
Permite una búsqueda de un conjunto de caracteres en una cadena pero no suprime ningún
carácter después.
LENGTH (cad)=
SYSDATE=
LASTDAY (fecha)=
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 34 de 84
Devuelve la fecha del último día del mes que contiene "fecha".
Devuelve la fecha del primer día de la semana indicado por "cad" después de la fecha indicada
por "fecha".
Funciones de conversión:
TO_CHAR=
TO_DATE=
TO_NUMBER=
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 35 de 84
Subconsultas SQL
Subconsultas:
Consulta que se hace sobre los datos que nos da otra consulta. Su formato es:
SELECT______
FROM________
FROM ___________
Ejemplo:
SELECT APELLIDO
FORM EMPLE
FROM EMPLE
Seleccionamos en todos los campos de la tabla Jugadores cuya sede está en Madrid o
Barcelona:
SELECT *
FROM JUGADORES
FROM SEDE
FROM SEDE
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 36 de 84
Este artículo es obra de Agustin Jareño
Fue publicado / actualizado en 29/03/2005
Disponible online en https://desarrolloweb.com/articulos/1897.php
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 37 de 84
Agrupación y combinación de elementos
con SQL
Aprendemos a agrupar elementos y a combinar filas seleccionadas con SQL para Oracle
Para saber cual es el salario medio de cada departamento de la tabla Jugadores sería:
FROM JUGADORES
GROUP BY DEPT_NO;
La sentencia "Select" posibilita agrupar uno o más conjuntos de filas. El agrupamiento se lleva
a cabo mediante la cláusula "GROUP BY" por las columnas especificadas y en el orden
especificado. Formato:
SELECT…
FROM…
HAVING CONDICION
GROUP BY …
Los datos seleccionados en la sentencia "Select" que lleva el "Group By" deben ser:
Una constante.
La cláusula Group By sirve para calcular propiedades de uno o más conjuntos de filas. Si se
selecciona más de un conjunto de filas, Group By controla que las filas de la tabla original sean
agrupadas en un temporal.
La cláusula Having se emplea para controlar cual de los conjuntos de filas se visualiza. Se
evalúa sobre la tabla que devuelve el Group By. No puede existir sin Group By.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 38 de 84
Having es similar al Where, pero trabajo con grupos de filas; pregunta por una característica
de grupo, es decir, pregunta por los resultados de las funciones de grupo, lo cual Where no
pude hacer.
Nos permite seleccionar algunas filas de una tabla aunque estas no tengan correspondencia
con las filas de la otra tabla con la que se combina. Formato:
Esto selecciona todas las filas de la tabla "tabla1" aunque no tengan correspondencia con las
filas de la tabla "tabla2", se utiliza el símbolo +. El resto de columnas de la tabla "tabla2" se
rellena con NULL.
Permite combinar los resultados de varios "Select" para obtener un único resultado. Formato:
OPERADOR_DE_CONJUNTO
SELECT…FROM…WHERE…
UNION=
Combina los resultados de dos consultas. Las filas duplicadas que aparecen se reducen a una
fila única.
UNION ALL=
INTERSEC=
Devuelve las filas que son iguales en ambas consultas. Todas las filas duplicadas serán
eliminadas.
MINUS=
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 39 de 84
Devuelve aquellas filas que están en la primera "Select" y no están en la segunda "Select". Las
filas duplicadas del primer conjunto se reducirán a una fila única antes de que empiece la
comparación con el otro conjunto.
Los nombres de columna de la primera sentencia "Select" no tiene porque ser los
mismos que los nombres de la segunda.
Los tipos de datos deben coincidir, aunque la longitud no tiene que ser la misma.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 40 de 84
Optimizar consultas SQL
Por tanto, muchas veces no basta con especificar una sentencia SQL correcta, sino que además,
hay que indicarle como tiene que hacerlo si queremos que el tiempo de respuesta sea el
mínimo. En este apartado veremos como mejorar el tiempo de respuesta de nuestro interprete
ante unas determinadas situaciones:
Normaliza las tablas, al menos hasta la tercera forma normal, para asegurar que no hay
duplicidad de datos y se aprovecha al máximo el almacenamiento en las tablas. Si hay
que desnormalizar alguna tabla piensa en la ocupación y en el rendimiento antes de
proceder.
Los primeros campos de cada tabla deben ser aquellos campos requeridos y dentro de
los requeridos primero se definen los de longitud fija y después los de longitud variable.
Ajusta al máximo el tamaño de los campos para no desperdiciar espacio.
Es muy habitual dejar un campo de texto para observaciones en las tablas. Si este
campo se va a utilizar con poca frecuencia o si se ha definido con gran tamaño, por si
acaso, es mejor crear una nueva tabla que contenga la clave primaria de la primera y el
campo para observaciones.
Los índices son campos elegidos arbitrariamente por el constructor de la base de datos que
permiten la búsqueda a partir de dicho campo a una velocidad notablemente superior. Sin
embargo, esta ventaja se ve contrarrestada por el hecho de ocupar mucha más memoria (el
doble más o menos) y de requerir para su inserción y actualización un tiempo de proceso
superior.
Evidentemente, no podemos indexar todos los campos de una tabla extensa ya que doblamos
el tamaño de la base de datos. Igualmente, tampoco sirve de mucho el indexar todos los
campos en una tabla pequeña ya que las selecciones pueden efectuarse rápidamente de todos
modos.
Un caso en el que los índices pueden resultar muy útiles es cuando realizamos peticiones
simultáneas sobre varias tablas. En este caso, el proceso de selección puede acelerarse
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 41 de 84
sensiblemente si indexamos los campos que sirven de nexo entre las dos tablas.
Los índices pueden resultar contraproducentes si los introducimos sobre campos triviales a
partir de los cuales no se realiza ningún tipo de petición ya que, además del problema de
memoria ya mencionado, estamos ralentizando otras tareas de la base de datos como son la
edición, inserción y borrado. Es por ello que vale la pena pensárselo dos veces antes de indexar
un campo que no sirve de criterio para búsquedas o que es usado con muy poca frecuencia por
razones de mantenimiento.
Campos a Seleccionar
En la medida de lo posible hay que evitar que las sentencias SQL estén embebidas
dentro del código de la aplicación. Es mucho más eficaz usar vistas o procedimientos
almacenados por que el gestor los guarda compilados. Si se trata de una sentencia
embebida el gestor debe compilarla antes de ejecutarla.
Seleccionar exclusivamente aquellos que se necesiten
No utilizar nunca SELECT * por que el gestor debe leer primero la estructura de la tabla
antes de ejecutar la sentencia
Si utilizas varias tablas en la consulta especifica siempre a que tabla pertenece cada
campo, le ahorras al gestor el tiempo de localizar a que tabla pertenece el campo. En
lugar de SELECT Nombre, Factura FROM Clientes, Facturacion WHERE IdCliente =
IdClienteFacturado, usa: SELECT Clientes.Nombre, Facturacion.Factura WHERE
Clientes.IdCliente = Facturacion.IdClienteFacturado.
Campos de Filtro
Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado con el orden
empleado en la cláusula FROM. Si deseamos saber cuantos alumnos se matricularon en el año
1996 y escribimos: FROM Alumnos, Matriculas WHERE Alumno.IdAlumno =
Matriculas.IdAlumno AND Matriculas.Año = 1996 el gestor recorrerá todos los alumnos para
buscar sus matriculas y devolver las correspondientes. Si escribimos FROM Matriculas,
Alumnos WHERE Matriculas.Año = 1996 AND Matriculas.IdAlumno = Alumnos.IdAlumnos,
el gestor filtra las matrículas y después selecciona los alumnos, de esta forma tiene que
recorrer menos registros.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 42 de 84
Este artículo es obra de Claudio
Fue publicado / actualizado en 28/10/2005
Disponible online en https://desarrolloweb.com/articulos/2230.php
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 43 de 84
Gestión de vistas en SQL
No contienen información por si mismas, sino que están basadas en las que contienen otras
tablas y refleja los datos de estas. Si se suprime una tabla la vista asociada se invalida.
Formato:
[(COLUMNA [,COLUMNA])]
AS CONSULTA;
AS CONSULTA= Determina las columnas y las tablas que aparecerán en la vista. [OR
REPLACE]= Crea de nuevo la vista si ya existía.
| Nota: al borrar las tablas, las vistas de esas tablas no se borran y quedan inutilizadas. |
Borrado de vistas
Se pueden realizar las mismas operaciones que se hacen sobre las tablas. Restricciones:
Actualización Si una vista esta basada en una sola tabla, se pueden modificar las filas de
la vista.
La modificación de la vista cambia la tabla sobre la que esta definida.
Borrado de filas a través de una vista= Para borrar filas de una tabla a través de una
vista, esta se debe crear:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 44 de 84
Con filas de una sola tabla.
Sin utilizar la cláusula GROUP BY ni DISTINCT.
Sin usar funciones de grupo o referencias a pseudocolumnas.
Actualización de filas a través de una vista: Para actualizar filas en una tabla a través de
una vista, esta ha de estar definida según las restricciones anteriores y , además,
ninguna de las columnas que se va a actualizar se habrá definido como una expresión.
Inserción de filas a través de una vista: Para insertar filas en una tabla a través de una
vista se han de tener en cuenta todas las restricciones anteriores y, además, todas las
columnas obligatorias de la tabla asociada deben estar presentes en la vista.
Manejo de expresiones y de funciones en vistas: Se pueden crear vistas usando
funciones, expresiones en columnas y consultas avanzadas pero únicamente se parean
consultar estas vistas. También podemos modificar filas siempre y cuando la columna
que se va a modificar no sea la columna expresad en forma de cálculo o con funciones.
| Nota: No es posible insertar filas si las columnas de la vista contiene cálculos o funciones. |
Cambios de nombre
RENAME cambia el nombre de una tabla, vista o sinónimo. El nuevo nombre no puede ser una
palabra reservada ni el nombre de un objeto que tenga creado el usuario. Las restricciones de
integridad, los índices y los permisos dados al objeto se transfieren automáticamente al nuevo
objeto.
Con esta orden no podemos renombrar columnas de una tabla, estas se renombran mediante
CREATE TABLE AS…
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 45 de 84
Introducción al lenguaje PL/SQL
**Qué es el lenguaje PL/SQL y primeras explicaciones para saber cómo funciona este gestor
PL/SQL.
**
Nos encontramos ante un gestor que va incorporado en Oracle para solventar las grandes
limitaciones que teníamos con los editores SQL, en cuanto al control de las secuencias de
ejecución de instrucciones, el uso de variables, la gestión de posibles errores, etc.
Este lenguaje esta basado en ADA, por lo que incluye todas las características de los lenguajes
de tercera generación. Esto nos permite manejar las variables, tener una estructura modular
(procedimientos y funciones) y controlar las excepciones. Además incorpora un completo
soporte para la programación orientada a objetos (POO).
Los programas creados con PL/SQL los podemos almacenar en nuestra base de datos como
cualquier otro objeto quedando disponibles para los usuarios. El uso del lenguaje PL/SQL es
imprescindible para construir disparadores de bases de datos (triggers).
PL/SQL esta incluido en el servidor y en algunas herramientas de cliente. Soporta todos los
comandos de consulta y manipulación de datos, aportando al lenguaje SQL las estructuras de
control y otros elementos propios de los lenguajes de programación de 3º generación.
Bloques
Con PL/SQL se pueden construir distintos tipos de programas: procedimientos, funciones y
bloques anónimos, paquetes, etc. Todos ellos tienen en común una estructura básica
denominada bloque.
Zona de declaraciones: donde se declaran objectos locales. Suele ir precedida por la cláusula
declare (o is o as en los procedimientos y funciones). Un conjunto de instrucciones precedido
por la cláusula BEGIN Zona de excepciones: es una zona opcional precedida por la cláusula
EXCEPTION, donde se gestionan las excepciones. El formato genérico de un bloque es el
siguiente:
[ DECLARE
<declaraciones>]
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 46 de 84
BEGIN
<instrucciones>
[EXCEPTION
<gestión de excepciones>]
END;
Antes de hacer ningún bloque tenemos que ejecutar el siguiente comando en nuestra ventana
de Sql *PLUS
Aunque ahora no entendáis mucho os dejo un ejemplo de un bloque para que os vayáis
familiarizando con la sintaxis.
DECLARE
v_num_empleados number(2);
BEGIN
insert into depart values(99,'provisional',null);
update emple set dept_no=99 where dept_no=20;
v_num_empleados:=SQL%ROWCOUNT;
delete from depart where dept_no=20
DBMS_OUTPUT.PUT_LINE (v_num_empleados || 'Empleados cambiados a provisional');
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 47 de 84
Características de PL/SQL primera parte
Para poder trabajar con PL/SQL tenemos que tener claros una serie de conceptos y
definiciones sobre todo en lo referente a compatibilidad de datos y estructuras de control.
Para declarar los datos en un bloque tenemos que utilizar una sintaxis como esta:
DECLARE
nombre_variable Tipo dato;
BEGIN
...
DECLARE
precio NUMBER(8,2);
suma NUMBER(2) DEFAULT 0;
prenda CHAR(20) NOT NULL :='Camiseta';
descripción VARCHAR2(15);
BEGIN
....
Una de las ventajas de PL/SQL es que nos permite declarar una variable del mismo tipo que
otra variable o que una columna de una tabla. Esto lo hacemos con el atributo %TYPE.
DECLARE
nombre emple.nombre%TYPE;
Otra ventaja es que nos permite guardar el contenido de una fila entera de una tabla en una
variable. Esto lo hacemos con el atributo %ROWTYPE
DECLARE
mifila emple%ROWTYPE;
Con esto ya podemos trabajar con variables dentro de nuestro bloque. Ahora tenemos que ver
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 48 de 84
las estructuras de control que podemos manejar dentro de nuestros bloques.
Estructuras de control
Las estructuras de control son básicamente las mismas que podemos utilizar en cualquier
lenguaje de programación.
IF <condición> THEN
instrucciones
ELSEIF <condición> THEN
instrucciones
....
ELSE
instrucciones
END IF;
Si queremos que nos vaya contando al revés, es decir de 5 hasta 0 por ejemplo, la sintaxis seria
la siguiente:
LOOP
instrucciones
....
EXIT WHEN <condición>
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 49 de 84
instrucciones
...
END LOOP;
Cursores implicitos
Es importante saber que en nuestros bloques PL/SQL es bastante práctico el uso de cursores.
En este lenguaje el resultado de una consulta no va directamente al terminal del usuario, sino
que se guarda en un área de memoria a la que se accede mediante los nombrados cursores.
Para realizar una consulta en PL/SQL tenemos que guardar el resultado en cursores. Esto es
muy sencillo y basta con meter un INTO en las consultas. Un ejemplo seria este:
La variable que sigue al INTO recibe el valor de la columna. Por este motivo es importante que
el tipo de dato de la variable coincida con el tipo de dato de la columna.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 50 de 84
Características de PL/SQL segunda parte
Es importante controlar los posibles errores y además distinguir los distintos tipos de
programas que podemos crear con PL/SQL.
Gestión de excepciones
Las excepciones sirven para tratar los errores y mensajes. Oracle tiene una serie de
excepciones que son las más frecuentes y con las que la mayoría de la gente trabaja.
Unas de las más usadas son: NO_DATA_FOUND (cuando una orden tipo select no ha
devuelto ningún valor) TOO_MANY_ROWS (cuando una orden tipo select ha devuelto mas de
una fila) OTHERS THEN RAISE_APPLICATION_ERROR (para cualquier otro tipo de error
desconocido)
DECLARE
vapellido varchar(10);
voficio varchar(20);
BEGIN
select apellido,oficio INTO vape,voficio from emple where emp=15;
DBMS_OUTPUT.PUT_LINE (vape||: - || voficio);
EXCEPTION
WHEN NO_DATA_FOUND THEN insert into temp values('No hay datos');
WHEN TOO_MANY_ROWS THEN insert into temp values ('Demasiados datos');
WHEN OTHER THEN RAISE_APPLICATION_ERROR(-2000,'Error en aplicación');
END;
Estructura modular
En PL/SQL podemos distinguir 3 tipos de programas o bloques.Bloques anónimos: Son los que
no tienen nombre y comienzan con el DECLARE, es decir los que hemos ido viendo hasta
ahora.Procedimientos: Se trata del programa más utilizado en PL/SQL y su formato es el
siguiente:
PROCEDURE <nombre_procedimiento>
[(<lista de parámetros>)]
IS
[<declaraciones>]
BEGIN
<instrucciones>;
[EXCEPTIONS
<excepciones>;]
END;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 51 de 84
En el formato distinguimos dos partes claramente, la cabecera donde esta el nombre del
procedimiento y los parámetros y el cuerpo donde se situá un bloque anónimo.
Funciones: similares a los procedimientos pero con la función añadida de que pueden devolver
valores.
Si subís varias lineas y veis el ejemplo de control de excepciones, podéis ver que hemos
utilizado un atributo como DBMS_OUTPUT. Bien pues esto lo que nos permite es visualizar en
pantalla los resultados, tanto excepciones como mensajes. Lo utilizamos porque PL/SQL no
dispone de ordenes o sentencias que capturen datos introducidos por teclado, ni tampoco para
visualizar datos en pantalla.
Si queremos que un bloque nos pida algún dato tenemos que anteponer el símbolo & delante
de la variable, de esta forma cuando el bloque llegue a ese punto nos pedirá por pantalla el
valor.
Otra sentencia importante es la que nos permite visualizar los errores que hemos podido tener
al crear el bloque o procedimiento. Esta sentencia es: show errors
También podemos guardar los bloques anónimos en ficheros para poderlos ejecutar
posteriormente. Para ello ejecutamos la siguiente sentencia:
save nombrefichero
Y para ejecutarlo primero tenemos que cargar el fichero en el buffer y para ello tenemos que
ejecutar la siguiente sentencia:
get nombrefichero
Una vez cargado el fichero ejecutamos el bloque con la sentencia run nombrefichero. O
podemos hacer los dos pasos con una sola sentencia: start nombrefichero
Sin embargo para los procedimientos es totalmente distinto ya que al tener nombre se
almacena automáticamente en la base de datos y para ejecutarlo tan solo tenemos que realizar
la siguiente operación:
execute nombre_procedimiento(parámetros);
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 52 de 84
En el siguiente capitulo revisaremos todo lo que hemos visto en la introducción del PL/SQL,
pero de una forma mas exhaustiva.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 53 de 84
Bloques anónimos y procedimientos
PL/SQL
En este artículo vamos a ver el uso y ejemplos de los bloques anónimos en PL/SQL y los
procedimientos.
Para continuar las explicaciones sobre PL/SQL que estamos publicando en el Tutorial de
Oraclede Desarrolloweb.com, veamos a continuación dos importantes elementos de esta
plataforma.
Todo bloque debe acabar en . para que sea almacenado en el buffer SQL. Una vez guardado lo
podemos ejecutar con la orden “run”. También podemos guardarlo en un fichero con la
siguiente orden:
Para cargar y ejecutar este bloque anónimo guardado en fichero ejecutaremos la siguiente
orden:
start nombrefichero
Pero también podemos cargarlo sin ejecutarlo con la orden “get” y luego ejecutarlo
posteriormente con la orden “run”
Un ejemplo muy sencillo de bloque seria el que nos muestra en pantalla un nombre.
BEGIN
DBMS_OUTPUT.PUT_LINE('nombre');
END;
.
Además en los bloques PL/SQL se pueden utilizar lo que llamamos variables de sustitución,
que nos pedirán datos por pantalla antes de ejecutar el bloque. Estas variables tienen que ir
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 54 de 84
antepuestas del & para que funcionen.
Un ejemplo seria un bloque que nos pide el DNI de un usuario y nos muestra su nombre.
DECLARE
Vnom clientes.nombre%TYPE;
BEGIN
select nombre into Vnom from clientes where NIF= '&V_nif';
DBMS_OUTPUT.PUT_LINE (Vnom);
END;
.
Como veis es bastante sencillo, pero no tienen tanta funcionalidad como los procedimientos o
funciones.
Nota: Al quedar los bloques anónimos almacenados en el buffer, a no ser que se guardasen
en ficheros, se perderían al limpiar el buffer, cosa que no ocurre con los procedimientos y
funciones, que se almacenan en la propia base de datos.
Otra cosa que nos diferencia los bloques anónimos de los procedimientos o funciones es que en
los procedimientos o funciones no se pueden utilizar variables de sustitución.
Si el compilador detecta errores nos saldrá un mensaje como este: “Procedimiento creado con
errores de compilación”. Para ver estos errores tenemos la orden SHOW ERRORS.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 55 de 84
Al tener almacenado el procedimiento en la base de datos, este puede ser llamado por
cualquier usuario que tenga los permisos oportunos. Para invocar un procedimiento utilizamos
la orden EXECUTE
Para invocar al procedimiento que hemos creado antes tendríamos que ejecutar la siguiente
orden:
EXECUTE ver_usuario('Luis');
BEGIN
ver_usuario('Luis');
END;
.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 56 de 84
Fundamentos del lenguaje PL/SQL
En este artículo estudiaremos los fundamentos de PL/SQL y algunos de los elementos que
constituyen este lenguaje.
Tipos de datos
Este lenguaje dispone de los mismo tipos de datos que podemos encontrar en SQL, pero
además se han incorporado algunos nuevos:
Además es importante señalar que el programador puede definir sus propios tipos de datos a
partir de los ya definidos.
Identificadores
Se utilizan para nombrar los objetos que intervienen en los programas PL/SQL como son las
variables, constantes, cursores, excepciones, procedimientos, etc.
Pueden tener como máximo 30 caracteres empezando siempre por una letra, que puede ir
seguida por otras letras, numeros, $, # ó _. Es importante destacar que PL/SQL no diferencia
entre mayúsculas y minúsculas. También debemos señalar que no pueden contener espacios ni
signos de puntuación.
Variables
Como doy por sentado que todos sabemos lo que son las variables, pasaremos directamente a
comentar como se declara una variable en PL/SQL.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 57 de 84
<nombreVariable> <tipo> [NOT NULL] [{:= | DEFAULT } <valor>]
No podemos indicar una lista de variables del mismo tipo y luego declarar el tipo, tenemos que
hacerlo una a una.
DECLARE
importe NUMBER (8,2);
contador NUMBER(2'0);
nombre char(5) NOT NULL :="Sara";
...
%TYPE: declara una variable del mismo tipo que otra, o que una columna de una tabla
%ROWTYPE : crea una variable registro cuyos campos se corresponden con las columnas de
una tabla o vista.
Por ejemplo si tenemos una variable definida previamente llamada cantidad podemos definir
otra de la siguiente forma:
total cantidad%TYPE;
De esta forma la variable total tendrá las mismas características que la variable cantidad. Otro
ejemplo seria declarar una variable que fuera del mismo tipo que la columna nombre de la
tabla profesor.
nombre_alta nombre%ROWTYPE;
La variable será local para el bloque en el que ha sido declarada y global para los bloque hijos
de éste, mientras que las variables declaradas en los bloque hijos no son globales a los bloques
padre.
Constantes
Cómo en la mayoría de los lenguajes, en este también podemos declaras constantes, de la
siguiente forma:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 58 de 84
Operadores
| Asignación | := | | Lógicos | AND OR NOT | | Concatenación | || | | Comparación | Is null =
!= <> <
<=
Funciones predefinidas
En PL/SQL tenemos las mismas funciones predefinidas que en SQL (AVG, MIN, MAX,
COUNT, SUM, etc), pero tenemos que tener dos cosas muy claras a la hora de utilizarlas y son:
Etiquetas
Podemos utilizar etiquetas para poder irnos a cualquier parte del programa utilizando la
sentencia GOTO siempre y cuando se cumplan las siguientes reglas: No pueden haber
etiquetas con los mismos nombres en un mismo programa. La etiqueta debe preceder a un
bloque o a un conjunto de ordenes ejecutables la etiqueta no puede estar dentro de estructuras
de control (IF, LOOP)
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 59 de 84
Subprogramas PL/SQL
Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.
Podemos distinguir entre dos tipos de subprogramas, como ya hemos comentado en artículos
anteriores:
Procedimientos
Los procedimientos ya los hemos visto en el articulo “Bloques anónimos y procedimientos
PL/SQL ” por lo que pasamos directamente a las funciones.
Funciones
Las funciones son muy similares a los procedimiento con la diferencia que éstas siempre
devolverán un valor. Su estructura es la siguiente:
La cláusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la
función.
Parámetros
Todos los subprogramas utilizan parámetros para pasar y recibir información. Dentro de los
parámetros podemos distinguir dos tipos:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 60 de 84
Además podemos hacer el paso de parámetros de un tipo a otro. Generalmente si los tipos son
compatibles PL/SQL lo hace automáticamente. En cualquier caso, podemos hacerlo de forma
manual utilizando las siguientes notaciones:
Para que esto quede más claro pasamos a escribir un ejemplo de paso de parámetros y
conversión de tipos.
PROCEDURE departamento(
n_departamento INTEGER,
localidad VARCHAR2
IS...
DECLARE
num_departamento INTEGER;
aula VARCHAR(30)
BEGIN
...
- - posicional departamento(num_departamento, aula);
- - nominal departamento(num_departamento => n_departamento, aula =>localidad);
...
END;
Esto nos pasaría los parámetros num_departamento al mismo tipo que n_departamento y
localidad al mismo tipo que aula.
Los parámetros que soporta PL/SQL pueden ser de entrada, salida o entrada/salida
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 61 de 84
Además es importante recordar que al especificar parámetros debemos indicar el tipo, pero no
el tamaño.
Para volver a compilar un subprograma almacenado utilizaremos la orden ALTER en vez del
CREATE y su formato es el siguiente:
Para ver el código de un subprograma almacenado podemos ejecutar una sentencia como esta;
Nota: PL/SQL implementa la recursividad en los subprogramas, esto quiere decir, que un
programa puede llamarse a si mismo.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 62 de 84
Cursores en PL/SQL primera parte
Comenzamos a explicar los cursores de PL/SQL. Veremos los cursores explícitos, sus atributos
y las variables de acoplamiento .
En los anteriores capítulos hemos visto los fundamentos del lenguaje PL/SQL, bien pues, a
partir de ahora pasaremos a estudiar el manejo de este lenguaje para trabar con el gestor de
Oracle. Empezaremos con la utilización de cursores.
Hasta ahora hemos utilizado cursores implícitos, cuando devolvíamos el resultado de una
select mediante la clausula into a una variable. Pero esto es un problema cuando el resultado
de una subconsulta nos devolvía varias filas, porque esto nos daria un error al ejecutar la
consulta
Para que no nos salte un error en estos casos debemos utilizar los cursores explícitos.
Cursores explícitos
Los cursores explícitos los utilizamos cuando tenemos consultas que nos devuelven más de una
fila. Tenemos 4 operaciones básicas para trabajar con un cursor explícito.
OPEN <nombrecursor>;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 63 de 84
Si tenemos una única variable que recoge los datos de todas las columnas, el formato de
la variable seria el siguiente:
<variable> <nombrecursor>%ROWTYPE;
CLOSE <nombrecursor>;
DECLARE
CURSOR C1 IS SELECT nombre, apellido FROM arbitro;
Vnom VARCHAR2(12);
Vape VARCHAR2(20);
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO Vnom, Vape;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vapen);
END LOOP;
CLOSE C1;
END;
Si nos fijamos, en la declaración de los cursores explícitos no utilizamos la cláusula INTO, que
sí se utilizaba en los cursores implícitos.
Ademas podéis ver que después del FETCH hemos comprobado si nos devuelve valores con la
linea del EXIT. Es algo importante ya que si no nos devuelve nada el LOOP se interrumpirá.
DECLARE
CURSOR C1 IS SELECT nombre from futbolista WHERE Cod='e1';
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 64 de 84
Vnom VARCHAR2(15);
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO Vnom;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (C1%ROWCOUNT || Vnom);
END LOOP;
CLOSE C1;
END;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 65 de 84
Cursores PL/SQL segunda parte
Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y
cursores con parámetros.
Variables de acoplamiento
Si os fijáis en el siguiente ejemplo veréis que en la cláusula where se incluye una variable que
se deberá declarar previamente. Este tipo de variables recibe el nombre de variables de
acoplamiento. El programa la sustituirá por su valor en el momento en que se abre el cursor, y
se seleccionarán las filas según dicho valor.
Para resumir todas esas tareas, tenemos una estructura cursor FOR...LOOP que hace todas
estas cosas de forma implícita, todas menos la declaración del cursor.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 66 de 84
2. Se presenta el cursor utilizando el siguiente formato: FOR nombreVarReg IN
nombreCursor LOOP …. END LOOP; Al entrar en el bucle se abre el cursor de manera
automática, se declara implícitamente la variable nombreVarReg de tipo
nombrecursor%ROWTYPE y se ejecuta el primer fetch cuyo resultado quedarán en
nombreVarReg. A continuación se realizaran las acciones que correspondas hasta llegar
al END LOOP.
DECLARE
cursor c2 is select nombre, peso, estatura from jugador where salario>1200;
BEGIN
FOR vreg IN c2 LOOP
DBMS_OUTPUT.PUT_LINE (vreg.nombre || '-' ||vreg.peso || '-' || vreg.estatura);
END LOOP;
END;
CURSOR nombrecursor [(parámetros)] IS SELECT <sentencia select en la que intervendrán los parámetros>;
Los parámetros formales indicados después del nombre del cursor tienen la siguiente sintaxis:
Todos los parámetros formales de un cursor son parámetros de entrada y su ámbito es local al
cursor por eso sólo pueden ser referenciados dentro de la consulta.
DECLARE
...
CURSOR C1 (vpeso number, vestatura number DEFAULT 170) is select nficha, nombre FROM emple WHERE estatura=vestatura AND peso=vpeso;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 67 de 84
Cursores PL/SQL tercera parte
Continuamos con los cursores, esta vez vamos a ver atributos con cursores explícitos y uso de
cursores para actualizar filas.
Si se trata de un select into tenemos que tener en cuenta que solo puede devolver una única fila
de lo contrario nos levantará automáticamente una de estas dos excepciones:
Esto indica que las filas seleccionadas por el cursor van a ser actualizadas o borradas.
Una vez declarado un cursor FOR UPDATE, se incluirá el especificador CURRENT OF
nombre_cursor en la cláusula WHERE para actualizar o borrar la última fila
recuperada mediante la orden FETCH.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 68 de 84
{UPDATE|DELETE}... WHERE CURRENT OF nombre_cursor.
También podemos usar ROWID en lugar de FOR UPDATE. ROWID nos indicará la fila
que se va a actualizar. Para ello, al declarar el cursor en la cláusula SELECT
indicaremos que seleccione también el identificador de fila:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 69 de 84
Con este artículo damos por terminado todo lo referente a cursores y empezamos a
tratar las excepciones en el siguiente artículo.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 70 de 84
Excepciones en Oracle y PL/SQL
Las excepciones en el sistema gestor Oracle y el lenguaje PL/SQL, nos ayudan a detectar y
tratar errores en tiempo de ejecución.
En este artículo del Manual de PL/SQL de Oracle vamos a ver lo que son las excepciones, para
qué sirven y cómo utilizarlas. Daremos un repaso también a los tipos de excepciones, las
excepciones definidas por el usuario y la sintaxis con la que tenemos que especificarlas.
Por último, de paso que vemos cosas acerca del tratamiento de errores en PL/SQL,
explicaremos el RAISE_APPLICATION_ERROR, un componente del sistema gestor de base
de datos Oracle que ayuda a gestionar errores y sus mensajes de error.
BEGIN
.........
......
......
EXCEPTION
WHEN <nombre_excepción> THEN
<instrucciones>;
......
[WHEN OTHERS THEN <instrucciones>;]
END;
Excepciones predefinidas
Son aquellas que se disparan automáticamente al producirse determinados errores. Estas son
las más comunes:
too_many_rows: Se produce cuando select … into devuelve más de una fila. no_data_found:
se produce cuando un select …. into no devuelve ninguna fila. login_denied: error cuando
intentamos conectarnos a Oracle con un login y clave no validos. not_logged_on: se produce
cuando intentamos acceder a la base de datos sin estar conectados. program_error: se produce
cuando hay un problema interno en la ejecución del programa. value_error: se produce cuando
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 71 de 84
hay un error aritmético o de conversión. zero_divide: se puede cuando hay una división entre
0. dupval_on_index: se crea cuando se intenta almacenar un valor que crearía duplicados en la
clave primaria o en una columna con restricción UNIQUE. invalid_number: se produce
cuando se intenta convertir una cadena a un valor numérico.
Hay alguna más pero estas son las más utilizadas y tenemos que tener en cuenta que no es
necesario declararlas en la sección DECLARE.
DECLARE
...
Importe_mal EXCEPTION;
...
BEGIN
...
IF precio NOT BETWEEN mínimo and máximo THEN
RAISE importe_mal;
END IF;
...
EXCEPTION
WHEN importe_mal THEN DBMS_OUTPUT.PUT_LINE("Importe incorrecto");
...
END;
Otras excepciones
Existen otros errores internos de Oracle que no tienen asignada una excepción, sino un código
de error y un mensaje, a los que se accede mediante funciones SQLCODE y SQLERRM.
Cuando se produce un error de estos se trasfiere directamente el control a la sección
EXCEPTION donde se tratara el error en la clausula WHEN OTHERS de la siguiente forma:
Utilización de RAISE_APPLICATION_ERROR
En el paquete DBMS_STANDARD se incluye un procedimiento llamado
RAISE_APPLICATION_ERROR que nos sirve para levantar errores y definir mensajes de
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 72 de 84
error. Su formato es el siguiente:
RAISE_APPLICATION_ERROR(numero_error,mensaje_error);
Es importante saber que el numero de error esta comprendido entre -20000 y -20999 y el
mensaje es una cadena de caracteres de hasta 512 bytes. Este procedimiento crea una
excepción que solo puede ser tratada en WHEN OTHERS.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 73 de 84
Control de transacciones
Un ejemplo:
BEGIN
....
...
EXCEPTION
WHEN OTHERS THEN
rollback work;
END;
Rollback Este comando da por concluida la transacción actual y deshace los cambios que se
pudiesen haber producido en la misma, liberando las filas bloqueadas. Se utiliza especialmente
cuando no se puede concluir una transacción porque se han levantado excepciones.
savepoint numero;
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 74 de 84
Rollback implicito Este comando se ejecuta cuando un programa almacenado (procedimiento
o función) falla y no se controla la excepción que produjo el fallo. Pero si en el programa
tenemos un commit estos cambios no serán deshechos.
Rollback to Deshace el trabajo realizado después del punto indicado. Pero no se confirma el
trabajo hecho hasta el savepoint. La transacción no finaliza hasta que se ejecuta un comando
de control de transacciones o hasta que finaliza la sesión.
Con este artículo terminamos la parte básica sobre oracle, PL/SQL y pasamos a lo que
podemos denominar programación avanzada de sql. Empezaremos con triggers en el siguiente
artículo.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 75 de 84
Triggers a tablas en PL/SQL
Explicamos que son los triggers o disparadores de base de datos en PL/SQL de Oracle.
En el presente artículo vamos a estudiar acerca de los triggers, donde veremos qué son y como
se construyen, comenzando con los trigger de tablas y más tarde veremos los trigger de
sustitución y los de sistema. Para ello lo primero que tenemos que ver es su definición.
Trigger a tablas
Un trigger es un bloque de código PL/SQL que se almacenan en la base de datos. Los bloques
de código de los triggers están asociados a una tabla y se ejecutan automáticamente cuando se
producen ciertos eventos asociados a la tabla.
Se suelen utilizar para prevenir transacciones erróneas y nos sirven también para implementar
restricciones de integridad o seguridad.
Elementos de un trigger
before / after: elemento que dispara el trigger nombre: nombre del trigger que tiene que ser
único. for each: nivel del disparo del trigger que por defecto es statement que significa que se
dispara una sola vez por cada operación independientemente del número de filas afectadas. for
each row: salta por cada fila afectada.
Variables posibles para update: la primera es :old que hace referencia a los valores anteriores y
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 76 de 84
:new que hace referencia a los nuevos valores de actualización de la fila. Tenemos que tener en
cuanta unos cuantos aspectos:
Cuando el evento que dispara el trigger es un delete haremos referencia al valor :old
porque el valor :new es nulo
Cuando el evento que dispara el trigger es un insert haremos referencia al valor :new
porque el :old es nulo.
Cuando el evento es un update tiene sentido hacer referencia a los dos valores.
Sólo se pueden utilizar cuando el trigger es a nivel de fila (for each row).
1. Antes de comenzar a ejecutar la orden que provoca el disparo se ejecutaran los triggers
del tipo before.... for each statement
2. Para cada fila afectada por la orden: a) se ejecutan los triggers del tipo before … for each
row b) se ejecuta la actualización de la fila c) se ejecutan los triggers after... for each row
3. Una vez realizada la operación se ejecuta el after … for each statement
Cuanndo se dispara un trigger este forma parte de la operación que lo disparó de manera que
si el trigger falla, Oracle dará por fallida la operación completa. Aunque el fallo sea a nivel de
fila se hará rollback a toda la operación.
Ejemplo:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 77 de 84
En el siguiente articulo veremos los triggers de sustitución y los del sistema.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 78 de 84
Triggers de sustitución y de sistema
Disparadores de sustitución
Podemos crear triggers que no se ejecutan antes ni después de una instrucción sino en lugar de
(instead of). Solo podemos utilizar estos triggers si están asociados a vistas, además actúan
siempre a nivel de fila.
Sobre una vista podemos hacer un select pero si hacemos un insert, delete o update puede
darnos problemas y no dejar ejecutarse la orden correctamente. Los trigger sobre vistas vas a
sustituir a estas operaciones por las correspondientes en las tablas que forman la vista.
Disparadores de sistema
Estos trigger se disparan cuando se arranca o para la base de datos, entra o sale un usuario,
cuando se crea, modifica o elimina un objeto, etc.
En Oracle para crear este tipo de trigger tenemos que tener privilegios de Administer database
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 79 de 84
trigger.
Donde la lista de eventos de definición puede tener uno o más eventos DDL separados por or y
la lista de eventos del sistema igualmente separados por or.
Oracle tiene algunas funciones que permiten acceder a los atributos del evento del disparo
ORA_YSEVENT, ORA_LOGIN, etc. Estas funciones pueden usarse en la clausula WHEN o en
el cuerpo del disparador. En el manual de Oracle podéis encontrar el listado de todas estas
funciones.
Un ejemplo seria un trigger que nos guarda los datos de un usuario al hacer login en la base de
datos:
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 80 de 84
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 81 de 84
Paquetes en Oracle
Vamos a ver que son los paquetes en el sistema gestor de base de datos Oracle, explicando
estructura y funcionamiento.
En este artículo que pertenece al tutorial de Oracle trateremos el tema de los paquetes de
forma detenida.
Los paquetes en Oracle se utilizan para guardar subprogramas y otros objetos de la base de
datos.
/* Cabecera */
create or replace package busar_emple as
TYPE t_reg_emple is RECORD
(num_empleado emple.emp_no%TYPE,
apellido emple.apellido%TYPE,
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 82 de 84
salario emple.salario%TYPE,
departamento emple.dept_no%TYPE);
procedure ver_por_numero(v_cod emple.emp_no%TYPE);
procedure ver_por_apellido(v_ape emple.apellido%TYPE);
function datos (v_cod emple.emp_no%TYPE)
return t_reg_emple;
end buscar_emple;
/* Cuerpo */
Como podéis ver este paquete nos permite buscar un empleado de tres formas distintas y
visualizar sus datos.
Desde el mismo paquete: esto quiere decir que cualquier objeto puede ser utilizado
dentro del paquete por otro objeto declarado en el mismo. Para utilizar un objeto dentro
del paquete tan sólo tendríamos que llamarlo. La llamada sería algo así: v_emple
:=buscar_emple.datos(v_n_ape); (como veis no utilizamos el execute ya que nos
encontramos dentro del paquete).
Desde fuera del paquete: Podemos utilizar los objetos de un paquete siempre y cuando
haya sido declarado en la especificación del mismo. Para llamar a un objeto o
procedimiento desde fuera del paquete utilizaríamos la siguiente notación: execute
nombre_paquete.nombre_procedimiento(lista de parametros);
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 83 de 84
CREATE or REPLACE PACKAGE empleados AS
.....
CURSOR a RETURN empleado%ROWTYPE;
...
END empleados;
NOTA: sql dinámico significa que el programa es capaz de ejecutar órdenes de definición y
manipulación sobre objetos que sólo se conocen al ejecutar el paquete. Un ejemplo de la
utilización de dbms_sql es el siguiente:
BEGIN
......
id_cursor := DBMS_SQL.OPEN_CURSOR;
DMBS_SQL.PARSE(id_cursor, instrucción,DMBS_SQL.V3);
v_dum :=DMBS_SQL.EXECUTE(id_cursor);
DMBS_SQL.CLOSE_CURSOR(id_cursor);
......
Lo que hacemos es abrir el cursor y nos devuelve el id del mismo para poder trabajar con él.
Después tenemos el DMBS_SQL.PARSE que analiza la instrucción que se va a ejecutar. Ya
en la siguiente linea ejecutamos la sentencia y por último cerramos el cursor.
http://desarrolloweb.com/manuales/tutorial-oracle.html Página 84 de 84