You are on page 1of 60

*Qu es Oracle

Oracle es una potente herramienta cliente/servidor para la gestin de Bases de Datos.


Explicamos la herramienta y las ayudas que ofrece al
desarrollador.
Oracle es bsicamente una herramienta cliente/servidor para la
gestin de Bases de Datos. Es un producto vendido a nivel
mundial, aunque la gran potencia que tiene y su elevado precio
hace que slo se vea en empresas muy grandes y
multinacionales, por norma general. En el desarrollo de pginas
web pasa lo mismo: como es un sistema muy caro no est tan extendido como otras bases de
datos, por ejemplo, Access, MySQL, SQL Server, etc.
Vamos ahora en centrarnos en que es Oracle exactamente y como funciona la programacin sobre
ste. Oracle como antes he mencionado se basa en la tecnologa cliente/servidor, pues bien, para
su utilizacin primero sera necesario la instalacin de la herramienta servidor (Oracle 8i) y
posteriormente podramos atacar a la base de datos desde otros equipos con herramientas de
desarrollo como Oracle Designer y Oracle Developer, que son las herramientas bsicas de
programacin sobre Oracle.
Para desarrollar en Oracle utilizamos PL/SQL un lenguaje de 5 generacin, bastante potente para
tratar y gestionar la base de datos, tambin por norma general se suele utilizar SQL al crear un
formulario.
Referencia: Podemos aprender qu es el lenguaje SQL en un artculo de
DesarrolloWeb.com. Adems, existe un manual de SQL para el que desee profundizar.
Es posible lgicamente atacar a la base de datos a travs 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, 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, debern
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 haramos
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 aplicacin 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 ms notable problema es la falta de un entorno visual para disear 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 mdulos que son las estructuras que
contendrn 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 usis Developer pues es mucho ms fcil e intuitivo al principio
*sql con Oracle
Empezamos un nuevo curso sobre SQL con Oracle que puede resultar muy interesante para
ampliar los conocimientos de SQL que habamos adquirido anteriormente.
Introduccin:
Antes de empezar me gustara 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.

Permite la comunicacin con el sistema gestor de base de datos.

En su uso se puede especificar que quiere el usuario.

Permite hacer consulta de datos.

Tipos de datos:
CHAR:

Tienen una longitud fija.

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:

Almacena cadenas de longitud variable.

La longitud mxima es de 2000 caracteres.

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 ningn otro carcter a la derecha hasta
completar la longitud definida.

Si se introduce una cadena de mayor longitud que la fijada, nos dar un error

NUMBER:

Se almacenan tanto enteros como decimales.

Number (precisin, escala)

Ejemplo:

X=number (7,2)
X=155'862 Error ya que solo puede tomar 2 decimales
X= 155'86 Bien
Nota: El rango mximo va de 1 a 38.
LONG:

No almacena nmeros de gran tamao, sino cadenas de caracteres de hasta 2 GB

DATE:

Almacena la fecha. Se almacena de la siguiente forma:

Siglo/Ao/Mes/Da/Hora/Minutos/Segundos
RAW:

Almacena cadenas de Bytes (grficos, sonidos)

LONGRAW:

Como el anterior pero con mayor capacidad.

ROWID:

Posicin interna de cada una de las columnas de las tablas.

Sentencias de consultas de datos

Select:
Select [ALL | Distinct] [expresin_columna1, expresin_columna2, ., | *]
From [nombre1, nombre_tabla1, , nombre_tablan]

{[Where condicin]
[Order By expresin_columna [Desc | Asc]]};
Vamos a explicar como leer la consulta anterior y as seguir la pauta para todas las dems. Cuando
ponemos [] significa que debemos la que va dentro debe existir, y si adems 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 segn la
consulta.
Nota: En el select el valor por defecto entre ALL y DISTINCT es ALL.

Alias = El nuevo nombre que se le da a una tabla. Se pondr entre comillas

Order By = Ordena ascendentemente (Asc) (valor por defecto) o descendentemente


(Desc).

All = Recupera todas las filas de la tabla aunque estn repetidas.

Distinct = Solo recupera las filas que son distintas.

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.

Null= Si est nulo.

Nota: Ntese que cada consulta de SQL que hagamos hemos de terminarla con un punto y coma
";".
Varios ejemplos para verlo mas claro:
SELECT JUGADOR_NO, APELLIDO, POSICION, EQUIPO
FROM JUGADORES
WHERE EQUIPO_NO = 'VALENCIA'
ORDER BY APELLIDO;
Este ejemplo mostrar el nmero de jugador (jugador_no) el apellido (Apellido), la posicin en la
que juega (Posicin), y el equipo (Equipo) al que pertenece.
Seleccionara todos los datos de la tabla jugadores donde (Where) el nombre de equipo
(Equipo_No) sea igual que la palabra 'Valencia' y se ordenara (order by) apellido. Notemos
tambin que no pone ni 'Distinct' ni 'All'. Por defecto generara la sentencia con ALL.
SELECT *
FROM JUGADORES
WHERE POSICION = 'DELANTERO'
ORDER BY JUGADOR_NO;

Este ejemplo muestra todos los campos de la tabla jugadores donde (Where) la posicin sea igual
que 'Delantero' y lo ordena por nmero de jugador. Al no poner nada se presupone que es
ascendentemente (Asc).
SELECT *
FROM JUGADORES
WHERE EQUIPO_NO = 'VALENCIA' AND POSICION = 'DELANTERO'
ORDER BY APELLIDO DESC, JUGADOR_NO ASC;
En este ejemplo selecciona todos los campos de la tabla jugadores donde (Where) el nombre del
equipo sea igual a 'Valencia' y la posicin de los jugadores sea igual a 'Delantero'. Por ultimo los
ordena por 'Apellido' descendentemente y por numero de jugador ascendentemente.
*Instalar Oracle Database 10g Express
Pasamos a describir los pasos necesarios para instalar el sistema gestor de base de datos Oracle
Database 10g Express.
Vamos a guiar a los lectores de DesarrolloWeb.com a travs de la instalacin de Oracle Database
10g Express, para que podis tener el sistema gestor de base de datos y realizar pruebas desde un
navegador antes de instalarlo en un servidor en produccin.
Lo primero que tenemos que hacer es descargar los archivos de instalacin del sistema gestor de
bases de datos. Para ello accedemos a la pgina oficial de Oracle y nos descargamos el archivo
Oracle Database 10g Express Edition (Universal) de esta URL. La pgina 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 instalacin y lo primero que nos pedir sera introducir una
contrasea para el usuario sys y el system (implementa la misma a los dos usuarios por defecto).
Podemos elegir cualquier clave, adems siendo una instalacin 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 ms el apuntar dicha contrasea en algn lugar, ya que ms adelante la necesitaremos.
Una vez instalado el sistema gestor, podemos acceder a nuestra base de datos online a travs 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 pgina 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 estn, 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 estis utilizando la
base de datos Oracle, paris 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 tenis que
buscar los servicios que se llaman Oracleservicesxe y OracleXETNSListener y cambiarlos a manual,
para as poderlos arrancar y parar cuando vosotros queris.

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 pgina de incio de nuestra base de datos nos pedir un usuario y una
contrasea, tendris que poner como usuario system y la contrasea que le hayis dado al instalar
el sistema. Una vez dentro, tenemos las opciones de administracin (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 bsicas.
Por lo tanto, quizs nos interesar utilizar la opcin 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 versin online de tu base de datos, para instalar una versin
completa tendramos que bajarnos el Oracle Database 10g ( que incluye sistema cliente, ejemplos,
sistema gateway y sistema clusterware para desarrolladores) y tendramos muchas ms opciones
que ya comentaremos ms adelante. La diferencia fundamental es que la version express puede
manejar solamente hasta 4 GB de datos y 1 GB de memoria. Esta versin 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 mltiples opciones.
Antes de comenzar os comento que necesitaremos una serie de tablas para ir haciendo ejercicios y
os aconsejara que os creis algunos usuarios ms con distintos privilegios para ir repasando lo que
hemos comentado de la seguridad en Oracle. Esto lo podis hacer de forma visual o por linea de
comando desde la pagina inicial de tu base de datos.
*gestin de seguridad con Oracle
Conceptos bsicos para la gestin de seguridad de una base de datos en Oracle.
Un administrador de Oracle puede controlar dos tipos de seguridad;

La seguridad del sistema: Se refiere a mecanismos que controlan el acceso y el uso de la


base de datos. Lo que llamamos permisos del sistema.

Seguridad de los datos: Son los mecanismos que controlan el acceso y uso de la base de
datos a nivel del objectos (tablas, vistas, usuario, etc). Son lo que llamamos los permisos a
nivel de objetos.

Seguridad del sistema


En lo referente a la seguridad del sistema es bastante importante saber que el administrador
puede crear perfiles para limitar los recursos de la base de datos.

Los factores ms importantes que puede limitar son:

Recurso

Descripcin

SESSION_PER_USER

El nmero de sesiones concurrentes que un usuario puede tener


en una instancia.

CPU_PER_SESSION

El tiempo de CPU, en centenas de segundos, que una sesin puede


utilizar.

CONNECT_TIME

El nmero de minutos que una sesin puede permanecer activa.

IDLE_TIME

El nmero de minutos que una sesin puede permanecer sin que


sea utilizada de manera activa.

LOGICAL_READS_PER_SESSION El nmero de bloques de datos que se pueden leer en una sesin.


LOGICAL_READS_PER_CALL

El nmero de bloques de datos que se pueden leer en una


operacin.

PRIVATE_SGA

La cantidad de espacio privado que una sesin puede reservar en


la zona de SQL compartido de la SGA.

COMPOSITE_LIMIT

El nmero de total de recursos por sesin, en unidades de servicio.


Esto resulta de un calculo ponderado de CPU_PER_SESSION,
CONNECT_TIME, LOGICAL_READS_PER_SESSION y PRIVATE_SGA,
cuyos pesos se pueden variar con el comando ALTER RESOURCE
COST.

La sintaxis para la creacin de un perfil con varias limitaciones seria:


create profile nombre_perfil limit
{Entero [K|M] | unlimited | default};
Donde unlimited significa que no hay limite sobre un recurso particular y default significa que coge
el limite del perfil DEFAULT
Para activar los perfiles el administrador debe ejecutar la siguiente orden:
alter system set resource_limit=true;
Para borrar un perfil tenemos que ejecutar la siguiente orden:
drop profile nombre_perfil [cascade];
Es importante saber si este perfil esta asignado a algn usuario ya que, si es as, tendremos que
poner "cascade", para que lo elimine de esos usuarios tambin.
Otro factor importante en la seguridad a nivel de sistema es la gestin de tablespaces. Un
tablespace es un espacio de la base de datos que contiene tablas o como su definicin oficial nos

dice, es una unidad lgica de almacenamiento de datos compuesta por uno o ms archivos. En
Oracle antes de introducir los datos en la base de datos tenemos que crear un tablespace para que
nos deje trabajar.
Es importante tener un tablespace para cada tipo de datos es decir, un tablespace para cada
aplicacin.
La sintaxis de la creacin de un tablespace es la siguiente:
create tablespace nombre_tablespace
datafile 'nombre_Archivo' [size entero [K|M]] [reuse]
[autoextend {off|on clausulas}]
[,'nombre_archivo' [size entero [K|M]] [reuse]
[autoextend {off|on clausulas}] ] ...
[ default storage {
initial tamao
next tamao
minextents tamao
maxextents tamao
pctincrease valor }] [online|offline];
Donde:

datafile: especifica el archivo/s de datos que constara el tablespace

size: especifica el tamao del tablesapce

reuse: si el archivo ya existe lo reutiliza y sino lo crea.

Dafault storage: define el almacenamiento por defecto para todos los objectos que se
creen en ese tablespace

initial: indica la extensin inicial del tablespace

next: indica la extensin siguiente

minextents: reserva extensiones adicionales a la extensin inicial y nos permite asignar


gran cantidad de espacio cuando se crea un objeto. El valor por defecto es 1

maxextents: es el nmero mximo de extensiones que se le asigna a un objecto

pctincrease: factor de crecimiento para la extensin. Valor por defecto 50

offline|online: nos indica si el tablespace esta operativo o no, despus de su creacin

Por defecto Oracle crea los siguientes tablespace:

system: donde Oracle almacena toda la informacin para su propia gestin

users: espacio de tablas donde se almacena la informacin personal de los usuarios

temporary o temp: donde Oracle almacena las tablas temporales

tools: espacio para hacer pruebas sobre la base de datos

RBS: donde Oracle guarda la informacin al deshacer algn cambio.

Para modificar un tablespace cambiamos el create por el alter mientras que para borrarlo basta
con hacer drop tablespace nombre_tablespace;
*gestin de seguridad con Oracle II
Continuamos con los conceptos bsicos en la gestin de seguridad de una base de datos.
Seguridad de los datos en Oracle.
En el articulo anterior hablbamos de que existan 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 utilizacin de usuarios.
Estos usuarios son nombres que definimos y a los cuales damos una contrasea para acceder a la
base de datos.
En Oracle cada usuario esta asignado a un esquema. Siendo un esquema una coleccin lgica de
objetos. Por defecto un usuario tiene acceso a todos los objectos de su esquema y podra acceder
a los objetos de otros esquemas como los permisos necesarios.
Cuando instanciamos Oracle se crean por defecto dos usuarios importantes:

sys change_on_install: propietario del diccionario de datos de la base de datos

system manager: usuario para realizar las tareas de administracin de la base de datos

La sintaxis para la creacin de un usuario es la siguiente:


create user nombre_usuario
identified by contraseas
[default tablespace nombre_tablespace]
[temporary tablespace nombre_tablespace]
[quota {entero {K|M} | unlimited} on nombre_tablespace]
[profile nombre_perfil];
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.

privilegios sobre objetos: estos privilegios nos permiten realizar cambios en los datos de los
objetos de otros usuarios

Cuando creamos un usuario es necesario darle privilegios, de lo contrario no podra realizar


ninguna accin.
Roles de usuario
Un rol es un conjunto de permisos que recibe un nombre comn y facilita la tarea de dar permisos
a los usuarios. Para crear un rol tan solo tenemos que escribir lo siguiente:
create role 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 sesin en Oracle

resource: Todos los permisos necesarios para tener recursos para la creacin de objetos

dba: posee todos los privilegios del sistema

La sentencia para privilegios sobre los objetos es la siguiente:


grant {privilegio_objeto[,privilegio_objeto]...| all [privileges]}
[(columna [,columna]...)]
on [usuario.]objeto}
to {usuario|rol| public [,{usuario|rol|public} ...]
[with grant option];
Mientras que la sentencia para crear privilegios de sistema es la siguiente:
grant {privilegio|rol} [,privilegio|rol}, ....]
to {usuario|rol| public [,{usuario|rol|public} ...]
[with admin option];
En ambos caso se utiliza la sentencia revoke para suprimir privilegios, cambiando la sintaxis.
Para los privilegios de sistema:
revoke {privilegio|rol} [,privilegio|rol}] ...
from {usuario|rol|public} [,usuario|rol|public}] ...;
para los privilegios de objetos:
revoke {privilegio[,privilegio] ... | all [privileges]}
on [usuario.]objeto
from {usuario|rol|public}[ ,{usuario|rol|public}]...;
Con esto podramos empezar a gestionar una base de datos, siempre y cuando tengamos algunos
conocimientos de pl/sql. Esto lo veremos en sucesivos artculos que iremos publicando.
*usuarios en Oracle
Todo lo relacionado con la gestin de usuarios en Oracle.

Es un nombre definido en la base de datos que se puede conectar a ella y acceder a determinados
objetos segn ciertas condiciones que establece el administrador.
Los objetos del diccionario de datos a los que un usuario puede acceder se encuentran en la vista
DICTIONARY, que es propiedad del usuario SYS.
DESC DICTIONARY;
Con la orden:
SELECT TABLENAME FROM DICTIONARY;
Se visualizan los objetos del diccionario de datos a los que se puede acceder.
Creacin deusuarios:
CREATE USER NOMBRE_USUARIO
IDENTIFIED BY CLAVE_ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M} | UNLIMITED } ON ESPACIO_TABLA]
[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 clusula, el usuario no tiene cuota asignada y no podr crear objetos en el tablespace. Para
tener espacio y acceso ilimitad a un tablespace es:
GRANT UNLIMITED TABLESPACE NOMBRE_TABLESPACE;
PROFILE= Asigna un perfil a un usuario.
Modificacin de usuarios:
ALTER USER NOMBRE_USUARIO
IDENTIFIED BY CLAVE _ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M } | UNLIMITED } ON ESPACIO_TABLA
[PROFILE PERFIL];
Borrado de usuarios:

DROP USER USUARIO [CASCADE];


CASCADE= Suprime todos los objetos del usuario antes de borrarlo.
*claves primarios con sql y Oracle
Aprendemos a crear y definir claves primarias y sus restricciones.
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 perdern si al salir del programa no realizamos esta accin. Puede
programarse para que lo haga automticamente.
Algunas ordenes que lleven COMMIT implcito:

QUIT

EXIT

CONNECT

DISCONNECT

CREATE TABLE

CREATE VIEW

GRANT

REVOQUE

DROP TABLE

DROP VIEW

ALTER

AUDIT

NO AUDIT

Creacion de una tabla:

Su primer carcter debe ser alfabtico y el resto pueden ser letras, nmeros y el carcter
subrayado.
CREATE TABBLE NOMBRETABLA
(COLUMNA1 TIPO_DATO {NOT NULL},
COLUMNA2 TIPO_DATO {NOT NULL},

) TABLESPACE ESPACIO_DE_TABLA;
Caractersticas:

Las definiciones individuales de columnas se separan mediante comas.

No se pone coma despus de la ltima definicin de columna.

Las maysculas y minsculas son indiferentes.

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 restriccin de integridad ser:
Una regla que restringe el rango de valores para una o ms columnas en la tabla.
Restricciones en create table:
Usamos la clusula CONSTRAINT, que puede restringir una sola columna o un grupo de columnas
de una misma tabla.
Hay dos modos de especificar restricciones:

Como parte de la definicin de columnas.

Al final, una vez especificados todas las columnas.

Formato:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DE_DATO
{CONSTRAINT NOMBRE_RESTRICCION}
{NOT NULL}
{UNIQUE}
{PRIMARY KEY}
{DEFAULT VALOR}
{REFERENCES NOMBRETABLA [(COLUMNA, [,COLUMNA])
{ON DELETE CASCADE}}

{CHECK CONDICION},
COLUMNA2...
)
{TABLESPACE ESPACIO_DE_TABLA} ;
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO ,
COLUMNA2 TIPO_DATO,
COLUMNA3 TIPO_DATO,
...
{CONSTRAINT NOMBRERESTRICCION}
[{UNIQUE} | {PRIMARY KEY} (COLUMNA [, COLUMNA])],
{CONSTRAINT NOMBRERESTRICCION}
{FOREIGN KEY (COLUMNA [, COLUMNA])
REFERENCES NOMBRETABLA {(COLUMNA [,
COLUMNA])
{ON DELETE CASCADE}},
{CONSTRINT NOMBRERESTRICCIONI}
{CHECK (CONDICION)}

)[TABLESPACE ESPACIO_DE_TABLA];
*definiciones de claves para tablas y restrinciones
Vemos claves primarias y claves externas (foreing keys) y aprendemos a aplicar restricciones a
los distintos campos de las tablas.
Clave primaria: Primary key
Es una columna o un conjunto de columnas que identifican unvocamente a cada fila. Debe ser
nica, no nula y obligatoria. Como mximo, podemos definir una clave primaria por tabla.
Esta clave se puede referenciar por una columna o columnas. Cuando se crea una clave primaria,
automticamente se crea un ndice que facilita el acceso a la tabla.
Formato de restriccin de columna:
CREATE TABLE NOMBRE_TABLA
(COL1 TIPO_DATO [CONSTRAINT NOMBRE_RESTRICCION] PRIMARY KEY
COL2 TIPO_DATO

)[TABLESPACE ESPACIO_DE_TABLA];
Formato de restriccin de tabla:
CREATE TABLE NOMBER_TABLA
(COL1 TIPO_DATO,
COL2 TIPO_DATO,


[CONSTRAINT NOMBRERESTRICCION] PRIMARY KEY (COLUMNA [,COLUMNA]),

)[TABLESPACE ESPACIO_DE_TABLA];
Claves ajenas: Foreign Key:
Esta formada por una o varias columnas que estn 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 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).
Formato de restriccin de columna:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO
[CONSTRAINT NOMBRERESTRICCION]
REFERENCES NOMBRETABLA [(COLUMNA)] [ON DELETE CASCADE]

)[TABLESPACE ESPECIO_DE_TABLA];
Formato de restriccin de tabla:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO,
COLUMNA2 TIPO_DATO,

[CONTRAINT NOMBRERESTRICCION]
FOREIGN KEY (COLUMNA [,COLUMNA])
REFERENCES NOMBRETABLA [(COLUMNA [,
COLUMNA])]
[ON DELETE CASCADE],
)[TABLESPACE ESPACIO_DE_TABLA];
Notas:

En la clusula REFERENCES indicamos la tabla a la cual remite la clave ajena.

Hay que crear primero una tabla y despus aquella que le hace referencia.

Hay que borrar primero la tabla que hace referencia a otra tabla y despus 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
automticamente. La restriccin 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 especifica en la clusula INSERT. En la especificacin DEFAULT es posible incluir varias
expresiones: constantes, funciones SQL y variables UID y SYSDATE.
Verificacin de restricciones: CHECK: Acta como una clusula where. Puede hacer referencia a
una o ms columnas, pero no a valores de otras filas. En una clusula CHECK no se pueden incluir
subconsultas ni las pseudoconsultas SYSDATE, UID y USER.
Nota: La restriccin NOT NULL es similar a CHECK (NOMBRE_COLUMNA IS NOT NULL)

UNIQUE: Evita valores repetidos en la misma columna. Puede contener una o varias columnas. Es
similar a la restriccin 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 restriccin
UNIQUE se crea un ndice automticamente.
Vistas del diccionario de datos para las restricciones:
Contienen informacin general las siguientes:
USER_CONSTRAINTS: Definiciones de restricciones de tablas propiedad del usuario.
ALL_CONSTRAINTS: Definiciones de restricciones sobre tablas a las que puede acceder el usuario.
DBA_CONSTRAINTS: Todas las definiciones de restricciones sobre todas las tablas.
Creacin de una tabla con datos recuperados en una consulta:
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 accin con la clusula AS
colocada al final de la orden CREATE TABLE.
CREATE TABLE NOMBRETABLA
(COLUMNA [,COLUMNA]
)[TABLESPACE ESPACIO_DE_TABLA]
AS CONSULTA;
No es necesario especificar tipos ni tamao de las consultas, ya que vienen determinadas por los
tipos y los tamaos de las recuperadas en la consulta.
La consulta puede tener una subconsulta, una combinacin 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.
*Supresin y modificacin de tablas con SQL
Vemos sentencias en SQL para la supresion y modificacin tanto de tablas como de
restricciones.
Supresin de tablas:
DROP TABLE: suprime una tabla de la base de datos. Cada usuario puede borrar sus propias tablas,
pero solo el administrador o algn usuario con el privilegio "DROP ANY TABLE" puede borrar las
tablas de otro usuario. Al suprimir una tabla tambin se suprimen los ndices y los privilegios
asociados a ella. Las vistas y los sinnimos creados a partir de esta tabla dejan de funcionar pero
siguen existiendo en la base de datos por tanto deberamos eliminarlos.
Ejemplo:
DROP TABLE [USUARIO].NOMBRETABLA [CASCADE CONSTRAINTS];
TRUNCATE: permite suprimir todas las filas de una tabla y liberar el espacio ocupado para otros
usos sin que reaparezca la definicin de la tabla de la base de datos. Una orden TRUNCATE no se
puede anular, como tampoco activa disparadores DELETE.
TRUNCATE TABLE [USUARIO.]NOMBRETABLA [{DROP | REUSE} STORAGE];
Modificacin de tablas:
Se modifican las tablas de dos formas: Cambiando la definicin de una columna (MODIFY)
aadiendo una columna a una tabla existente (ADD):
Formato:
ALTER TABLE NOMBRETABLA
{[ADD (COLUMNA [,COLUMNA])]
[MODIFY (COLUMNA [,COLUMNA])]
[ADD CONSTRAINT RESTRICCION]
[DROP CONSTRAINT RESTRICCION]};
ADD= Aade una columna o mas al final de una tabla.
MODIFY= Modifica una o mas columnas existentes en la tabla.
ADD CONSTRAINT= Aade una restriccin a la definicin de la tabla.
DROP CONSTRAINT= Elimina una restriccin de la tabla.
A la hora de aadir una columna a una tabla hay que tener en cuenta:

Si la columna no esta definida como NOT NULL se le puede aadir en cualquier momento.

Si la columna esta definida como NOT NULL se pueden seguir estos pasos:
1. Se aade una columna sin especificar NOT NULL.
2. Se da valor a la columna para cada una de las filas.
3. Se modifica la columna NOT NULL.

Al modificar una columna de duna tabla se han de tener en cuenta:

Se puede aumentar la longitud de una columna en cualquier momento.

Es posible aumentar o disminuir el numero de posiciones decimales en una columna de


tipo NUMBER.

Si la columna es NULL en todas las filas de la tabla, se puede disminuir la longitud y


modificar el tipo de dato

La opcin MODIFY NOT NULL solo ser posible cuando la tabla no contenga ninguna fila
con valor nulo en la columna que se modifica.

Adicin de restricciones:
Con la orden ALTER TABLE se aaden restricciones a una tabla.
Formato:
ALTER TABLE NOMBRETABLA
ADD CONSTRAINT NOMBRECONSTRAINT
Borrado de restricciones:
La orden ALTER TABLE con la clusula DROP CONSTRAINT; con la que se borran las restricciones
con nombre y las asignadas por el sistema. Formato:
ALTER TABLE NOMBRETABLA
DROP CONSTRAINT NOMBRE_CONSTRAINT,
NOMBRE_RESTRICCION:
*Manipulacin de datos con SQL

Utilizando SQL con Oracle aprendemos como hacer Inserciones, actualizaciones y a eliminar
datos.
Insert, Update y Delete:
Insert:
Se aaden filas de datos en una tabla:
INSERT INTO NOMBRETABLA [(COL [,COL])]
VALUES (VALOR [,VALOR]);
Nombretabla= Es la tabla en la que se van a insertar las filas.
Propiedades:

Si las columnas no se especifican en la clusula Insert se consideran, por defecto, todas las
columnas de la tabla.

Las columnas a las que damos valores se identifican por su nombre.

La asociacin columna valor es posicional.

Los valores que se dan a las columnas deben coincidir con el tipo de dato definido en la
columna.

Los valores constantes de tipo carcter han de ir encerrados entre comillas simples (' ') (los
de tipo fecha tambin).

Con Select:
Se aaden tantas filas como devuelva la consulta:
INSERT INTO NOMBRETABLA [(COL [,COL])]
SELECT {COLUMNA [, COLUMNA] | *}
FROM NOMBRETABLA2 [CLAUSULAS DE SELECT];
Update:
Actualiza los valores de las columnas para una o varias filas de una tabla:
UPDATE NOMBRETABLA
SET COLUMNA1= VALOR1, , COLUMNAN= VALORN
WHERE CONDICION;
Set= Indica las columnas que se van a actualizar y sus valores.

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 parntesis al lado de SET.
UPDATE NOMBRETABLA
SET COLUMNA= VALOR1, COLUMNA2= VALOR2,
WHERE COLUMNA3= (SELECT)

UPDATE NOMBRETABLA
SET (COLUMNA1, COLUMNA2, )= (SELECT )
WHERE CONDICION;
Delete:
Elimina una o varias filas de una tabla:
DELETE [FROM] NOMBRETABLA
WHERE CONDICION;
*SQL con Oracle. Operadores
Empezamos a ver los tipos de operadores y trabajamos con algunos ejemplos.
Operadores aritmticos:
+ = Suma
- = Resta
* = Multiplicacin
/ = divisin
Operadores de comparacin y lgicos:
!> = 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 carcter cualquiera.
Not = Negacin
And = y
a and b
Cierto si son ciertas a y b.

Or = o
a or b
Cierto si a o b son ciertas
Veamos un par de ejemplos:
Obtenemos los datos de los jugadores cuyos apellidos empiecen con una "S":
SELECT APELLIDO
FROM JUGADORES
WHERE APELLIDO LIKE 'S%';
Obtenemos aquellos apellidos que tengan una "R" en la segunda posicin:
SELECT APELLIDO
FROM JUGADORES
WHERE APELLIDO LIKE '_R*';
Obtenemos aquellos apellidos que empiezan por "A" y tiene una "o" en su interior:
SELECT APELLIDO
FROM JUGADORES
WHERE APELLDIOS LIKE 'A%O%';
Comprobacin con conjuntos de valores:

In= permite saber si una expresin pertenece o no a un conjunto de valores.

Between= permite saber si una expresin esta o no entre esos valores:

Ejemplo:
SELECT APELLIDOS
FROM JUGADORES
WHERE JUGADOR_NUM IN (10, 20);
Selecciona los apellidos de los jugadores donde el nmero de jugador (Jugador_num) sea (In) o 10
o 20
SELECT APELLIDOS
FROM JUGADORES
WHERE SALARIO NOT BETWEEN 15000000 AND 20000000;

Selecciona los apellidos de los jugadores donde el salario de estos no este entre (Not Between)
15000000 y 20000000.
*funciones sql
Vemos los distintos tipos de funciones y algunos ejemplos de las mismas con SQL para Oracle.
Funciones de valores simples:
ABS(n)=Devuelve el valor absoluto de (n).
CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n".
FLOOT(n) =Devuelve el valor entero inmediatamente inferior o igual a "n".
MOD (m, n)=Devuelve el resto resultante de dividir "m" entre "n".
NVL (valor, expresin)=Sustituye un valor nulo por otro valor.
POWER (m, exponente)=Calcula la potencia de un numero.
ROUND (numero [, m])=Redondea nmeros con el numero de dgitos de precisin indicados.
SIGN (valor)=Indica el signo del "valor".
SQRT(n)=Devuelve la raz cuadrada de "n".
TRUNC (numero, [m])=Trunca nmeros para que tengan una cierta cantidad de dgitos de
precisin.
VAIRANCE (valor)=Devuelve la varianza de un conjunto de valores.
Funciones de grupos de valores:
AVG(n)=Calcula el valor medio de "n" ignorando los valores nulos.
COUNT (* | Expresin)=Cuenta el numero de veces que la expresin evala algn dato con valor
no nulo. La opcin "*" cuenta todas las filas seleccionadas.
MAX (expresin)=Calcula el mximo.
MIN (expresin)=Calcula el mnimo.
SUM (expresin)=Obtiene la suma de los valores de la expresin.
GREATEST (valor1, valor2)=Obtiene el mayor valor de la lista.
LEAST (valor1, valor2)=Obtiene el menor valor de la lista.
Funciones que devuelven valores de caracteres:
CHR(n) =Devuelve el carcter cuyo valor en binario es equivalente a "n".
CONCAT (cad1, cad2)=Devuelve "cad1" concatenada con "cad2".
LOWER (cad)=Devuelve la cadena "cad" en minsculas.
UPPER (cad)=Devuelve la cadena "cad" en maysculas.
INITCAP (cad)=Convierte la cadena "cad" a tipo titulo.
LPAD (cad1, n[,cad2])=Aade caracteres a la izquierda de la cadena hasta que tiene una cierta
longitud.
RPAD (cad1, n[,cad2])=Aade caracteres a la derecha de la cadena hasta que tiene una cierta
longitud.
LTRIM (cad [,set])=Suprime un conjunto de caracteres a la izquierda de la cadena.
RTRIM (cad [,set])=Suprime un conjunto de caracteres a la derecha de la cadena.

REPLACE (cad, cadena_busqueda [, cadena_sustitucion])=Sustituye un carcter o caracteres de


una cadena con 0 o mas caracteres.
SUBSTR (cad, m [,n])=Obtiene parte de una cadena.
TRANSLATE (cad1, cad2, cad3)=Convierte caracteres de una cadena en caracteres diferentes,
segn un plan de sustitucin marcado por el usuario.
Funciones que devuelven valores numricos:
ASCII(cad)=Devuelve el valor ASCII de la primera letra de la cadena "cad".
INSTR (cad1, cad2 [, comienzo [,m]])=Permite una bsqueda de un conjunto de caracteres en una
cadena pero no suprime ningn carcter despus.
LENGTH (cad)=Devuelve el numero de caracteres de cad.
Funciones para el manejo de fechas:
SYSDATE=Devuelve la fecha del sistema.
ADD_MONTHS (fecha, n)=Devuelve la fecha "fecha" incrementada en "n" meses.
LASTDAY (fecha)=Devuelve la fecha del ltimo da del mes que contiene "fecha".
MONTHS_BETWEEN (fecha1, fecha2)=Devuelve la diferencia en meses entre las fechas "fecha1" y
"fecha2".
NEXT_DAY (fecha, cad)=Devuelve la fecha del primer da de la semana indicado por "cad" despus
de la fecha indicada por "fecha".
Funciones de conversin:
TO_CHAR=Transforma un tipo DATE NUMBER en una cadena de caracteres.
TO_DATE=Transforma un tipo NUMBER CHAR en DATE.
TO_NUMBER=Transforma una cadena de caracteres en NUMBER.
*sub consultas sql
Explicacin y ejemplos de las subconsultas en SQL para Oracle.
Subconsultas:
Consulta que se hace sobre los datos que nos da otra consulta. Su formato es:
SELECT______
FROM________
WHERE CONDICION OPERADOR (SELECT ______
FROM ___________
WHERE CONDICION OPERADOR);Ejemplo:
Obtenemos los jugadores con la misma posicin que "Snchez":
SELECT APELLIDO

FORM EMPLE
WHERE POSICION = (SELECT OFICIO
FROM EMPLE
WHERE APELLIDO LIKE 'GIL');
Seleccionamos en todos los campos de la tabla Jugadores cuya sede est en Madrid o Barcelona:
SELECT *
FROM JUGADORES
WHERE EQUIPO_NOM IN (SELECT EQUIPO_NOM
FROM SEDE
WHERE LOC IN ('MADRID', 'BARCELONA');
FROM SEDE
WHERE LOC IN ('MADRID', 'BARCELONA');
*Agrupacin y combinacin de elementos con SQL
Aprendemos a agrupar elementos y a combinar filas seleccionadas con SQL para Oracle
Agrupacin de elementos. Group by y Having:
Para saber cual es el salario medio de cada departamento de la tabla Jugadores sera:
SELECT EQUIPO_NO, AVG (SALARIO) "SALARIO MEDIO"
FROM JUGADORES
GROUP BY DEPT_NO;
La sentencia "Select" posibilita agrupar uno o ms conjuntos de filas. El agrupamiento se lleva a
cabo mediante la clusula "GROUP BY" por las columnas especificadas y en el orden especificado.
Formato:
SELECT
FROM
GROUP BY COLUMNA1, COLUMNA2, COLUMNAN
HAVING CONDICION
GROUP BY
Los datos seleccionados en la sentencia "Select" que lleva el "Group By" deben ser:

Una constante.

Una funcin de grupo (SUM, COUNT, AVG)

Una columna expresada en el Group By.

La clusula Group By sirve para calcular propiedades de uno o ms conjuntos de filas. Si se


selecciona ms de un conjunto de filas, Group By controla que las filas de la tabla original sean
agrupadas en un temporal.
La clusula Having se emplea para controlar cual de los conjuntos de filas se visualiza. Se evala
sobre la tabla que devuelve el Group By. No puede existir sin Group By.
Having es similar al Where, pero trabajo con grupos de filas; pregunta por una caracterstica de
grupo, es decir, pregunta por los resultados de las funciones de grupo, lo cual Where no pude
hacer.
Combinacin externa (outer joins):
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:
SELECT TABLA1.COLUMNA1, TABLA1.COLUMNA2, TABLA2.COLUMNA1, TABLA2.COLUMNA2
FROM TABLA1, TABLA2
WHERE TABLA1.COLUMNA1 = TABLA2.COLUMNA1 (+);
Esto selecciona todas las filas de la tabla "tabla1" aunque no tengan correspondencia con las filas
de la tabla "tabla2", se utiliza el smbolo +.
El resto de columnas de la tabla "tabla2" se rellena con NULL.
Union, intersec y minus:
Permite combinar los resultados de varios "Select" para obtener un nico resultado. Formato:
SELECT FROM WHERE
OPERADOR_DE_CONJUNTO
SELECTFROMWHERE
UNION=Combina los resultados de dos consultas. Las filas duplicadas que aparecen se reducen a
una fila nica.
UNION ALL=Como la anterior pero aparecern nombres duplicados.
INTERSEC=Devuelve las filas que son iguales en ambas consultas. Todas las filas duplicadas sern
eliminadas.
MINUS=Devuelve aquellas filas que estn en la primera "Select" y no estn en la segunda "Select".
Las filas duplicadas del primer conjunto se reducirn a una fila nica antes de que empiece la
comparacin con el otro conjunto.
Reglas para la utilizacin de operadores de conjunto:

Las columnas de las dos consultas se relacionan en orden, de izquierda a derecha.

Los nombres de columna de la primera sentencia "Select" no tiene porque ser los mismos
que los nombres de la segunda.

Los "Select" necesitan tener el mismo numero de columnas.

Los tipos de datos deben coincidir, aunque la longitud no tiene que ser la misma.

*Optimizar consultas SQL


Distintas formas de optimizar las consultas realizadas en SQL.
El lenguaje SQL es no procedimental, es decir, en las sentencias se indica que queremos conseguir
y no como lo tiene que hacer el interprete para conseguirlo. Esto es pura teora, pues en la
prctica a todos los gestores de SQL hay que especificar sus propios truquitos para optimizar el
rendimiento.
Por tanto, muchas veces no basta con especificar una sentencia SQL correcta, sino que adems,
hay que indicarle como tiene que hacerlo si queremos que el tiempo de respuesta sea el mnimo.
En este apartado veremos como mejorar el tiempo de respuesta de nuestro interprete ante unas
determinadas situaciones:
Diseo de las tablas

Normaliza las tablas, al menos hasta la tercera forma normal, para asegurar que no hay
duplicidad de datos y se aprovecha al mximo el almacenamiento en las tablas. Si hay que
desnormalizar alguna tabla piensa en la ocupacin 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 despus los de longitud variable.

Ajusta al mximo el tamao 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 tamao, por si acaso, es
mejor crear una nueva tabla que contenga la clave primaria de la primera y el campo para
observaciones.

Gestin y eleccin de los ndices


Los ndices son campos elegidos arbitrariamente por el constructor de la base de datos que
permiten la bsqueda a partir de dicho campo a una velocidad notablemente superior. Sin
embargo, esta ventaja se ve contrarrestada por el hecho de ocupar mucha ms memoria (el doble
ms o menos) y de requerir para su insercin y actualizacin un tiempo de proceso superior.
Evidentemente, no podemos indexar todos los campos de una tabla extensa ya que doblamos el
tamao de la base de datos. Igualmente, tampoco sirve de mucho el indexar todos los campos en
una tabla pequea ya que las selecciones pueden efectuarse rpidamente de todos modos.

Un caso en el que los ndices pueden resultar muy tiles es cuando realizamos peticiones
simultneas sobre varias tablas. En este caso, el proceso de seleccin puede acelerarse
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 ningn tipo de peticin ya que, adems del problema de memoria ya
mencionado, estamos ralentizando otras tareas de la base de datos como son la edicin, insercin
y borrado. Es por ello que vale la pena pensrselo dos veces antes de indexar un campo que no
sirve de criterio para bsquedas 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 estn embebidas dentro
del cdigo de la aplicacin. Es mucho ms 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

Se procurar elegir en la clusula WHERE aquellos campos que formen parte de la clave
del fichero por el cual interrogamos. Adems se especificarn en el mismo orden en el que
estn definidos en la clave.

Interrogar siempre por campos que sean clave.

Si deseamos interrogar por campos pertenecientes a ndices compuestos es mejor utilizar


todos los campos de todos los ndices. Supongamos que tenemos un ndice formado por el
campo NOMBRE y el campo APELLIDO y otro ndice formado por el campo EDAD. La
sentencia WHERE NOMBRE='Juan' AND APELLIDO Like '%' AND EDAD = 20 sera ms
optima que WHERE NOMBRE = 'Juan' AND EDAD = 20 por que el gestor, en este segundo

caso, no puede usar el primer ndice y ambas sentencias son equivalentes por que la
condicin APELLIDO Like '%' devolvera todos los registros.
Orden de las Tablas
Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado con el orden
empleado en la clusula FROM. Si deseamos saber cuantos alumnos se matricularon en el ao
1996 y escribimos: FROM Alumnos, Matriculas WHERE Alumno.IdAlumno = Matriculas.IdAlumno
AND Matriculas.Ao = 1996 el gestor recorrer todos los alumnos para buscar sus matriculas y
devolver las correspondientes. Si escribimos FROM Matriculas, Alumnos WHERE Matriculas.Ao =
1996 AND Matriculas.IdAlumno = Alumnos.IdAlumnos, el gestor filtra las matrculas y despus
selecciona los alumnos, de esta forma tiene que recorrer menos registros.
*Gestin de vistas en SQL
Creacin, modificacin y supresin de vistas con SQL.
Creacin y uso de vistas
No contienen informacin por si mismas, sino que estn basadas en las que contienen otras tablas
y refleja los datos de estas.
Si se suprime una tabla la vista asociada se invalida. Formato:
CREATE [OR REPLACE] VIEW NOMBREVISTA
[(COLUMNA [,COLUMNA])]
AS CONSULTA;
AS CONSULTA= Determina las columnas y las tablas que aparecern en la vista.
[OR REPLACE]= Crea de nuevo la vista si ya exista.
Para consultar la vista creada, USER_VIEWS:
SELECT VIEW_NAME FROM
Nota: al borrar las tablas, las vistas de esas tablas no se borran y quedan inutilizadas.
Borrado de vistas
Se hace con DROP VIEW. Formato:
DROP VIEW NOMBREVISTA;
Operaciones sobre vistas
Se pueden realizar las mismas operaciones que se hacen sobre las tablas. Restricciones:

Actualizacin Si una vista esta basada en una sola tabla, se pueden modificar las filas de la
vista.

La modificacin de la vista cambia la tabla sobre la que esta definida.

Borrado de filas a travs de una vista= Para borrar filas de una tabla a travs de una vista,
esta se debe crear:
o

Con filas de una sola tabla.

Sin utilizar la clusula GROUP BY ni DISTINCT.

Sin usar funciones de grupo o referencias a pseudocolumnas.

Actualizacin de filas a travs de una vista: Para actualizar filas en una tabla a travs de
una vista, esta ha de estar definida segn las restricciones anteriores y , adems, ninguna
de las columnas que se va a actualizar se habr definido como una expresin.

Insercin de filas a travs de una vista: Para insertar filas en una tabla a travs de una vista
se han de tener en cuenta todas las restricciones anteriores y, adems, 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. Tambin podemos modificar filas siempre y cuando la columna que se va a
modificar no sea la columna expresad en forma de clculo o con funciones.

Nota: No es posible insertar filas si las columnas de la vista contiene clculos o


funciones.
Cambios de nombre
RENAME cambia el nombre de una tabla, vista o sinnimo. 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 automticamente al nuevo
objeto.
REANME NOMBRE_ANTERIOR TO NOMBRE_NUEVO;
Con esta orden no podemos renombrar columnas de una tabla, estas se renombran mediante
CREATE TABLE AS
*Introduccin al lenguaje PL/SQL
Qu es el lenguaje PL/SQL y primeras explicaciones para saber cmo funciona este gestor
PL/SQL.

Nos encontramos ante un gestor que va incorporado en Oracle para solventar las grandes
limitaciones que tenamos con los editores SQL, en cuanto al control de las secuencias de
ejecucin de instrucciones, el uso de variables, la gestin de posibles errores, etc.
Este lenguaje esta basado en ADA, por lo que incluye todas las caractersticas de los lenguajes de
tercera generacin. Esto nos permite manejar las variables, tener una estructura modular
(procedimientos y funciones) y controlar las excepciones. Adems incorpora un completo soporte
para la programacin 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 manipulacin de datos, aportando al lenguaje SQL las estructuras de
control y otros elementos propios de los lenguajes de programacin de 3 generacin.
La unidad de trabajo en PL/SQL es el bloque, constituido por un conjunto de declaraciones,
instrucciones y mecanismos de gestin de errores y excepciones.
Bloques
Con PL/SQL se pueden construir distintos tipos de programas: procedimientos, funciones y
bloques annimos, paquetes, etc. Todos ellos tienen en comn una estructura bsica denominada
bloque.
Un bloque tiene 3 zonas:
Zona de declaraciones: donde se declaran objectos locales. Suele ir precedida por la clusula
declare (o is o as en los procedimientos y funciones).
Un conjunto de instrucciones precedido por la clusula BEGIN
Zona de excepciones: es una zona opcional precedida por la clusula EXCEPTION, donde se
gestionan las excepciones.
El formato genrico de un bloque es el siguiente:
[ DECLARE
<declaraciones>]
BEGIN
<instrucciones>
[EXCEPTION
<gestin de excepciones>]
END;
Las nicas clusulas obligatorias son BEGIN y END
Antes de hacer ningn bloque tenemos que ejecutar el siguiente comando en nuestra ventana de
Sql *PLUS
set serveroutput on;

Aunque ahora no entendis mucho os dejo un ejemplo de un bloque para que os vayis
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');
Ya en prximos artculos nos meteremos de lleno en la construccin de bloque y en entender las
lineas arriba escritas.
*Caractersticas 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.
Definicin de datos compatibles con SQL
Este lenguaje suele tener unos tipos de datos compatibles con SQL para las columnas de las tablas,
pero adems puede tener otros tipos de datos propios.
Para declarar los datos en un bloque tenemos que utilizar una sintaxis como esta:
DECLARE
nombre_variable Tipo dato;
BEGIN
...
Un ejemplo seria este:
DECLARE
precio NUMBER(8,2);
suma NUMBER(2) DEFAULT 0;
prenda CHAR(20) NOT NULL :='Camiseta';
descripcin 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 las
estructuras de control que podemos manejar dentro de nuestros bloques.
Estructuras de control
Las estructuras de control son bsicamente las mismas que podemos utilizar en cualquier lenguaje
de programacin.
La vamos a dividir en estructuras de control alternativas (IF) y estructuras de control repetitivas
(WHILE, FOR, LOOP)
La estructura del IF seria la siguiente:
IF <condicin> THEN
instrucciones
ELSEIF <condicin> THEN
instrucciones
....
ELSE
instrucciones
END IF;
La estructura del WHILE seria la siguiente:
WHILE <condicin> LOOP
instrucciones
END LOOP;
La estructura del FOR se escribira as:
FOR <variable> IN <mnimo> <mximo> LOOP
instrucciones
END LOOP
Si queremos que nos vaya contando al revs, es decir de 5 hasta 0 por ejemplo, la sintaxis seria la
siguiente:
FOR <variable> IN REVERSE
<final>.......<inicio> LOOP
instrucciones
.....
END LOOP;
Y la estructura del LOOP seria de esta forma:
LOOP
instrucciones
....

EXIT WHEN <condicin>


instrucciones
...
END LOOP;
Cursores implicitos
Es importante saber que en nuestros bloques PL/SQL es bastante prctico 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:
select <columna/s> INTO <variable/s> from <tabla> [where]
select count(*) INTO vnum from ventas;
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.
*Caractersticas de PL/SQL segunda parte
Es importante controlar los posibles errores y adems distinguir los distintos tipos de programas
que podemos crear con PL/SQL.
Gestin de excepciones
Las excepciones sirven para tratar los errores y mensajes. Oracle tiene una serie de excepciones
que son las ms frecuentes y con las que la mayora de la gente trabaja.
Unas de las ms usadas son:
NO_DATA_FOUND (cuando una orden tipo select no ha devuelto ningn 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)
Un ejemplo seria el siguiente:
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 aplicacin');
END;
Estructura modular

En PL/SQL podemos distinguir 3 tipos de programas o bloques.


Bloques annimos: 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 ms utilizado en PL/SQL y su formato es el siguiente:
PROCEDURE <nombre_procedimiento>
[(<lista de parmetros>)]
IS
[<declaraciones>]
BEGIN
<instrucciones>;
[EXCEPTIONS
<excepciones>;]
END;
En el formato distinguimos dos partes claramente, la cabecera donde esta el nombre del
procedimiento y los parmetros y el cuerpo donde se situ un bloque annimo.
Funciones: similares a los procedimientos pero con la funcin aadida de que pueden devolver
valores.
Si subs varias lineas y veis el ejemplo de control de excepciones, podis 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.
DBMS_OUTPUT.PUT_LINE nos permite visualizar en pantalla, pero para que funcione
correctamente tenemos que poner el SET SERVEROUTPUT a ON
Si queremos que un bloque nos pida algn dato tenemos que anteponer el smbolo & 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
Podemos agregar comentarios a nuestros bloques anteponiendo al comentario /* <comentario>
*/
Si queremos que el bloque annimo se ejecute directamente cuando terminamos de crearlo
debemos poner el smbolo / que, ademas de guardar el bloque en el buffer, lo ejecuta.
Tambin podemos guardar los bloques annimos 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
automticamente en la base de datos y para ejecutarlo tan solo tenemos que realizar la siguiente
operacin:
execute nombre_procedimiento(parmetros);
En el siguiente capitulo revisaremos todo lo que hemos visto en la introduccin del PL/SQL, pero
de una forma mas exhaustiva.
*Bloques annimos y procedimientos PL/SQL
En este artculo vamos a ver el uso y ejemplos de los bloques annimos 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 continuacin dos importantes elementos de esta plataforma.
Bloques annimos PL/SQL
Empezaremos con los bloques annimos, caracterizados porque no tienen nombre y se suelen
crear y ejecutar desde PL/SQL.
Todo bloque debe acabar en . para que sea almacenado en el buffer SQL. Una vez guardado lo
podemos ejecutar con la orden run. Tambin podemos guardarlo en un fichero con la siguiente
orden:
save nombrefichero [replace]
El replace slo lo pondremos si el fichero ya esta creado.
Para cargar y ejecutar este bloque annimo guardado en fichero ejecutaremos la siguiente orden:
start nombrefichero
El start lo podemos cambiar por la @ y nos funcionar igualmente.
Pero tambin 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;
.

Adems en los bloques PL/SQL se pueden utilizar lo que llamamos variables de sustitucin, que
nos pedirn datos por pantalla antes de ejecutar el bloque. Estas variables tienen que ir
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.
Procedimientos y funciones PL/SQL
Los procedimientos y funciones quedan almacenados en la base de datos a diferencia de los
bloques annimos que se almacenaban en el buffer.
Nota: Al quedar los bloques annimos almacenados en el buffer, a no ser que se guardasen en
ficheros, se perderan 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 annimos de los procedimientos o funciones es que en
los procedimientos o funciones no se pueden utilizar variables de sustitucin.
En cuanto a su construccin es la dada en el articulo Caractersticas de PL/SQL segunda
parte aadiendo al principio la siguiente secuencia CREATE OR REPLACE para crearlo, o
modificarlo si ya existe.
Pasamos a escribir un procedimiento que nos muestre los datos de un usuario:
CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2)
IS
NIFusu VARCHAR2(10);
Domusu VARCHAR2(10);
BEGIN
select nif, domicilio into NIFusu,Domusu from usuario where nombre=nomusu;
DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'NIF:' ||NIFusu|| 'Domicilio' ||Domusu);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu);
END;
/

Si el compilador detecta errores nos saldr un mensaje como este: Procedimiento creado con
errores de compilacin. Para ver estos errores tenemos la orden SHOW ERRORS.
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 tendramos que ejecutar la siguiente
orden:
EXECUTE ver_usuario('Luis');
Pero tambin podemos invocarlo desde un bloque PL/SQL de ls siguiente forma:
BEGIN
ver_usuario('Luis');
END;
.
Como en cualquier lenguaje, podemos agregar comentarios a nuestros procedimientos de la
siguiente forma:
- - para comentar en una sola linea
/* <comentario>*/ para varias lineas.
*Fundamentos del lenguaje PL/SQL
En este artculo estudiaremos los fundamentos de PL/SQL y algunos de los elementos que
constituyen este lenguaje.
Para continuar con el manual de Oracle publicado en DesarrolloWeb.com, es hora de adentrarnos
en las explicaciones de los elementos que forman parte del lenguaje PL/SQL.
Tipos de datos
Este lenguaje dispone de los mismo tipos de datos que podemos encontrar en SQL, pero adems
se han incorporado algunos nuevos:

char(n): almacena una cantidad fija de caracteres

varchar2(n): almacena cadenas de caracteres de longitudes variables

long(n): almacena cadenas de longitud variable

number(p,e): almacena numero de precisin p y escala e

boolean: almacena valores lgicos, true, false o NULL

date: almacena fechas completas, incluida la hora

raw(n): almacena datos binarios de longitud fija

long raw : almacena datos binarios de longitud variable

rowid: almacena identificadores de direcciones de fila

etc.

Adems es importante sealar 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 mximo 30 caracteres empezando siempre por una letra, que puede ir
seguida por otras letras, numeros, $, # _. Es importante destacar que PL/SQL no diferencia entre
maysculas y minsculas. Tambin debemos sealar que no pueden contener espacios ni signos
de puntuacin.
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.
<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.
Uno ejemplo de declaracin de variables seria el siguiente:
DECLARE
importe NUMBER (8,2);
contador NUMBER(2'0);
nombre char(5) NOT NULL :="Sara";
...
Uso de los atributos %TYPE y %ROWTYPE
%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 caractersticas 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;

mbito y visibilidad de variables


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
Cmo en la mayora de los lenguajes, en este tambin podemos declaras constantes, de la
siguiente forma:
<nombreVariable> CONSTANT <tipo> := <valor>;
Operadores
Asignacin

:=

Lgicos

AND
OR
NOT

Concatenacin ||
Is null
=
!=
<>
<
>
<=
>=
between...and
like
in
Comparacin y sus correspondientes negaciones
Aritmticos

+ - * / **

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:
1. La funcin no modifica el valor de las variables o expresiones que se pasan como
argumentos, sino que devuelve un valor a partir de dicho argumento.
2. Si a una funcin se le pasa un valor nulo en la llamada, posiblemente devolver un valor
nulo.
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)
*Subprogramas PL/SQL
Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.
En cualquier subprograma podemos distinguir:

La cabecera, compuesta por el nombre del subprograma, los parmetros y el tipo de valor
de retorno.

El cuerpo, compuesto por las declaraciones, las instrucciones y el manejo de excepciones.

Podemos distinguir entre dos tipos de subprogramas, como ya hemos comentado en artculos
anteriores:
Procedimientos
Los procedimientos ya los hemos visto en el articulo Bloques annimos 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
devolvern un valor. Su estructura es la siguiente:
CREATE [OR REPLACE] FUNCTION NombreFuncion [(parmetros)] RETURN tipo
IS [parte declarativa]
BEGIN
instrucciones
RETURN <valor o expresin>;
[EXCEPTION excepciones]
END;
La clusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la funcin.
Parmetros
Todos los subprogramas utilizan parmetros para pasar y recibir informacin.
Dentro de los parmetros podemos distinguir dos tipos:

Parmetros actuales: son variables indicadas en la llamada a un subprograma.

Parmetros formales: son variables declaradas en la especificacin del subprograma.

Adems podemos hacer el paso de parmetros de un tipo a otro. Generalmente si los tipos son
compatibles PL/SQL lo hace automticamente. En cualquier caso, podemos hacerlo de forma
manual utilizando las siguientes notaciones:

Posicional: el compilador asocia los parmetros actuales a los formales, basndose en


suposicin.

Nominal: el smbolo => despus del parmetro actual y antes del nombre del formal,
indica al compilador correspondencia.

Mixta: nos permite usar las dos notaciones anteriores.

Para que esto quede ms claro pasamos a escribir un ejemplo de paso de parmetros y conversin
de tipos.
Tenemos la especificacin de un procedimiento como esta:
PROCEDURE departamento(
n_departamento INTEGER,
localidad VARCHAR2
IS...
Desde el siguiente bloque se podrn realizar las llamadas indicadas:
DECLARE
num_departamento INTEGER;
aula VARCHAR(30)
BEGIN
...
- - posicional departamento(num_departamento, aula);
- - nominal departamento(num_departamento => n_departamento, aula =>localidad);
...
END;
Esto nos pasara los parmetros num_departamento al mismo tipo que n_departamento y
localidad al mismo tipo que aula.
Los parmetros que soporta PL/SQL pueden ser de entrada, salida o entrada/salida

IN

Nos permite pasar valores a un subprograma. Dentro del subprograma, el


parmetro actu como una constante. Puede ser una variable, constante, literal o
expresin.

Permite devolver valores al bloque que llam al subprograma. Dentro del


subprograma, el parmetro acta como una variable no inicializada. Solo puede ser
OUT una variable.

Permite pasar un valor inicial y devolver un valor actualizado. Dentro del


IN subprograma, el parmetro actu como variable inicializada. Puede intervenir otras
OUT expresiones. El valor actual debe ser una variable.
El formato genrico es el siguiente:
<nombrevariable> [IN | OUT | IN OUT] <tipodato>
[ { := | DEFAULT} <valor>]
Adems es importante recordar que al especificar parmetros debemos indicar el tipo, pero no el
tamao.
Creacin, modificacin y borrado de subprogramas
Cuando creamos subprogramas con SQL * PLUS utilizando los comandos CREATE, Oracle
automticamente compila el cdigo fuente, genera el cdigo objeto y los guarda en el diccionario
de datos, quedando disponibles para su utilizacin.
Para volver a compilar un subprograma almacenado utilizaremos la orden ALTER en vez del
CREATE y su formato es el siguiente:
ALTER {PROCEDURE | FUNCITON} nombresubprograma COMPILE;
Para ver el cdigo de un subprograma almacenado podemos ejecutar una sentencia como esta;
select LINE, SUBSTR(TEXT,1,60) from USER_SOURCE where name = 'nombresubprograma';
Para borrar un subprograma almacenado utilizaremos la orden DROP de la siguiente forma:
DROP {PROCEDURE | FUNCTION} nombresubprograma;
Nota: PL/SQL implementa la recursividad en los subprogramas, esto quiere decir, que un
programa puede llamarse a si mismo.
*Cursores en PL/SQL primera parte
Comenzamos a explicar los cursores de PL/SQL. Veremos los cursores explcitos, sus atributos y
las variables de acoplamiento .
En los anteriores captulos 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 utilizacin de cursores.
Hasta ahora hemos utilizado cursores implcitos, cuando devolvamos el resultado de una select
mediante la clausula into a una variable. Pero esto es un problema cuando el resultado de una
subconsulta nos devolva 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 explcitos.
Cursores explcitos

Los cursores explcitos los utilizamos cuando tenemos consultas que nos devuelven ms de una
fila.
Tenemos 4 operaciones bsicas para trabajar con un cursor explcito.
1. Declaracin del cursor: lo tenemos que declarar en la zona de declaraciones, con el
siguiente formato:CURSOR <nombrecursor> IS <sentencia SELECT>;
2. Apertura del cursor: Deber colocarse en la zona de instrucciones, con el siguiente
formato:
OPEN <nombrecursor>;
Al hacerlo se ejecuta automticamente la sentencia select y sus resultados se almacenan
en las estructuras internas de memoria manejadas por el cursor.
3. Recogida de informacin: Para recuperar la informacin anteriormente guardada en las
estructuras de memoria interna tenemos que usar el siguiente formato:
FETCH <nombrecursor> INTO {<variable> | <listavariables>};
Si tenemos una nica variable que recoge los datos de todas las columnas, el formato de la
variable seria el siguiente:
<variable> <nombrecursor>%ROWTYPE;
Si tenemos una lista de variables, cada una recoger la columna correspondiente de la
clusula select, por lo que sern del mismo tipo que las columnas.
4. - Cierre del cursor:
CLOSE <nombrecursor>;
Ahora, veamos un ejemplo de utilizacin de cursores explcitos:
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 declaracin de los cursores explcitos no utilizamos la clusula INTO, que s se
utilizaba en los cursores implcitos.
Ademas podis ver que despus 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.

Atributos del cursor


Para conocer detalles de la situacin del cursor tenemos 4 atributos:

%FOUND: devuelve verdadero di el ultimo FETCH ha recuperado algn valor; en caso


contrario devuelve falso; si el cursor no esta abierto nos devuelve error.

%NOTFOUND: hace justamente lo contrario al anterior.

%ROWCOUNT: nos devuelve el nmero de filas recuperadas hasta el momento.

%ISOPEN: devuelve verdadero si el cursor esta abierto.

Veamos ahora un ejemplo de utilizacin de %ROWCOUNT:


DECLARE
CURSOR C1 IS SELECT nombre from futbolista WHERE Cod='e1';
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;
Variables de acoplamientos en el manejo de cursores
En el ejemplo siguiente podemos observar que en la clusula WHERE se incluye una variable que
se debera haber declarado previamente. Este tipo de variables reciben el nombre de variables de
acoplamiento. El programa la sustituir por su valor en el momento en que se abre el cursor, y se
seleccionarn las filas segn dicho valor. Aunque ese valor cambie durante la recuperacin de los
datos con FETCH, el conjunto de filas que contiene el cursor no variar.
El ejemplo nos muestra los futbolistas de un equipo cualquiera.
CREATE OR REPLACE PROCEDURE ver_futbolistas_por_equipos(codeq VARCHAR2)
IS
Vequi VARCHAR2(3);
CURSOR C1 IS SELECT nombre from futbolista where codeq=Vequi;
Vnom VARCHAR(15);
BEGIN
vequi:=codeq;
OPEN C1;
FETCH C1 INTO vnom;
WHILE C1%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(Vnom);
FETCH C1 INTO Vnom;
END LOOP;
CLOSE C1;
END;
*Cursores PL/SQL segunda parte
Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y
cursores con parmetros.
Dando continuidad al Manual de Oracle que estamos publicando en DesarrolloWeb.com, y en el
apartado del lenguaje PL/SQL, continuamos nuestras explicaciones sobre los cursores, que
habamoscomenzado a explicar en el artculo anterior.
Variables de acoplamiento
Si os fijis en el siguiente ejemplo veris que en la clusula 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
seleccionarn las filas segn dicho valor.
Create or replace procedure ver_jugador(codeq varchar2)
IS
vequi varchar2(3);
cursor c1 is select nombre from jugador where cod=vequi;
vnom varchar2(15);
BEGIN
vequi:=codeq;
OPEN c1;
FETCH c1 INTO vnom;
WHILE c1%found LOOP
DBMS_OUTPUT.PUT_LINE(vnom);
FETCH c1 INTO vnom;
END LOOP;
CLOSE c1;
END;
Cursor FOR . LOOP
El trabajo normal de un cursor consiste en declarar un cursor, declarar una variable que recoger
los datos del cursor, abrir el cursor, recuperar con fetch, una a una, las filas extradas
introduciendo los datos en las variables, procesndolos y comprobando si se han recuperado
datos o no.
Para resumir todas esas tareas, tenemos una estructura cursor FOR...LOOP que hace todas estas
cosas de forma implcita, todas menos la declaracin del cursor.
El formato y el uso de esta estructura es:

1. se declara la informacin cursor en la seccin correspondiente


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 automtica, se declara implcitamente la
variable nombreVarReg de tipo nombrecursor%ROWTYPE y se ejecuta el primer fetch
cuyo resultado quedarn en nombreVarReg. A continuacin se realizaran las acciones que
correspondas hasta llegar al END LOOP.
Este es un ejemplo del LOOP . 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;
Cursores con parmetros
Un cursor puede tener parmetros; en este caso se aplicara el siguiente formato genrico:
CURSOR nombrecursor [(parmetros)] IS SELECT <sentencia select en la que intervendrn los
parmetros>;
Los parmetros formales indicados despus del nombre del cursor tienen la siguiente sintaxis:
nombreCursor [IN] tipodato [{:=|DEFAULT} valor]
Todos los parmetros formales de un cursor son parmetros de entrada y su mbito es local al
cursor por eso slo pueden ser referenciados dentro de la consulta.
Un ejemplo seria el siguiente:
DECLARE
...
CURSOR C1 (vpeso number, vestatura number DEFAULT 170) is select nficha, nombre FROM emple
WHERE estatura=vestatura AND peso=vpeso;
Para abrir un cursor con parmetros lo haremos de la siguiente forma:
OPEN nombrecursor [(parmetros)];
*Cursores PL/SQL tercera parte
Continuamos con los cursores, esta vez vamos a ver atributos con cursores explcitos y uso de
cursores para actualizar filas.

Atributos con Cursores implcitos


Los atributos de los cursores implcitos que se crean son los siguientes:

SQL%NOTFOUND: nos dice si el ltimo insert, update,delete o select into no han afectado
a ninguna fila.

SQL%FOUND: nos dice si el ltimo insert, update,delete o select into ha afectado a una o
mas filas

SQL%ROWCOUNT: devuelve el nmero de filas afectadas por el ltimo insert, update,


delete o select into

SQL%ISOPEN: Nos dice si el cursor esta cerrado, por lo que en teora siempre nos dar
falso ya que Oracle cierra automticamente el cursor despus de cada orden SQL.

Es importante tener en cuenta una serie de cosas:


Si se trata de un select into tenemos que tener en cuenta que solo puede devolver una nica fila
de lo contrario nos levantar automticamente una de estas dos excepciones:

Cuando un select into hace referencia a una funcin de grupo nuca se levantar la excepcin
NO_DATA_FOUND y SQL%FOUND siempre ser verdadero. Esto se explica porque las funciones de
grupo siempre devuelven algn valor (NULL se considera un valor).
Uso de cursores para actualizar filas
Para realizar una actualizacin con un cursor tenemos que aadir la siguiente FOR UPDATE al final
de la declaracin del cursor:
CURSOR nombre_cursor <declaraciones> FOR UPDATE
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
clusula WHERE para actualizar o borrar la ltima fila recuperada mediante la orden FETCH.
{UPDATE|DELETE}... WHERE CURRENT OF nombre_cursor.
Os pongo un ejemplo para que quede claro:
Subir el salario a todos los empleados del departamento indicado en la llamada. El porcentaje se
indicar tambin en la llamada.
CREATE OR REPLACE PROCEDURE subir_salario (num_dept NUMBER, incre NUMBER)
IS
CURSOR c IS SELECT oficio, salario FROM empleados WHERE cod_dept=num_dept
FOR UPDATE;

reg c%ROWTYPE;
inc NUMBER (8);
BEGIN
OPEN c;
FETCH c INTO reg;
WHILE c%FOUND LOOP
inc :=(reg.salario/100 )* inc;
UPDATE empleados SET salario=salario+inc WHERE CURRENT
FETCH c INTO reg;
END LOOP;
END;

OF c

Tambin 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 clusula SELECT indicaremos que seleccione
tambin el identificador de fila:
CURSOR nombre_cursor IS SELECT columna1,columna2,...ROWID FROM tabla;
Al ejecutarse el FETCH se guardar el nmero de fila en una variable y despus ese nmero se
podr usar en la clusula WHERE de la actualizacin:
{UPDATE |DELETE } ... WHERE ROWID = variable_rowid
El ejemplo anterior utilizando ROWID quedara de la siguiente manera:
CREATE OR REPLACE PROCEDURE subir_salario (num_dept NUMBER, incre NUMBER)
IS
CURSOR c IS SELECT oficio, salario,ROWID FROM empleados WHERE cod_dept=num_dept
FOR UPDATE;
reg c%ROWTYPE;
inc NUMBER (8);
BEGIN
OPEN c;
FETCH c INTO reg;
WHILE c%FOUND LOOP
inc :=(reg.salario/100 )* inc;
UPDATE empleados SET salario=salario+inc WHERE ROWID =
reg.ROWID;
FETCH c INTO reg;
END LOOP;
END;
Con este artculo damos por terminado todo lo referente a cursores y empezamos a tratar las
excepciones en el siguiente artculo.
*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 ejecucin.

En este artculo del Manual de PL/SQL de Oracle vamos a ver lo que son las excepciones, para qu
sirven y cmo utilizarlas. Daremos un repaso tambin 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.
Qu son las excepciones en Oracle
Las excepciones, presentes en la mayora de los lenguajes de programacin, sirven para tratar
errores en tiempo de ejecucin. En el sistema que nos ocupa, Oracle, sirven tambin para definir
qu se debe hacer frente a errores en sentencias definidas por el usuario. Cuando se produce un
error PL/SQL levanta una excepcin y pasa el control a la seccin excepcin correspondiente al
bloque PL/SQL.
El formato sera el siguiente:
BEGIN
.........
......
......
EXCEPTION
WHEN <nombre_excepcin> THEN
<instrucciones>;
......
[WHEN OTHERS THEN <instrucciones>;]
END;
Excepciones predefinidas
Son aquellas que se disparan automticamente al producirse determinados errores. Estas son las
ms comunes:
too_many_rows: Se produce cuando select into devuelve ms 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 ejecucin del programa.
value_error: se produce cuando hay un error aritmtico o de conversin.
zero_divide: se puede cuando hay una divisin entre 0.
dupval_on_index: se crea cuando se intenta almacenar un valor que creara duplicados en la clave
primaria o en una columna con restriccin UNIQUE.
invalid_number: se produce cuando se intenta convertir una cadena a un valor numrico.
Hay alguna ms pero estas son las ms utilizadas y tenemos que tener en cuenta que no es
necesario declararlas en la seccin DECLARE.
Excepciones definidas por el usuario

Son aquellas que crea el usuario. Para ello se requieren tres pasos:
1. Definicin: se realiza en la zona de DECLARE con el siguiente formato: nombre_excepcin
EXCEPTION
2. Disparar o levantar la excepcin mediante la orden raise: RAISE ;
3. Tratar la excepcin en el apartado EXCEPTION: WHEN THEN ;
Para que esto quede ms claro ponemos un ejemplo a continuacin.
DECLARE
...
Importe_mal EXCEPTION;
...
BEGIN
...
IF precio NOT BETWEEN mnimo and mximo 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 excepcin, sino un cdigo 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 seccin EXCEPTION donde se
tratara el error en la clausula WHEN OTHERS de la siguiente forma:
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error'||SQLCODE||SQLERRM.)
Utilizacin 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 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 excepcin que solo puede ser tratada en WHEN OTHERS.
Ponemos un ejemplo para que nos quede ms claro.

CREATE or REPLACE PROCEDURE subir_horas (emple NUMBER, horas_subir NUMBER)


IS
horas_actuales NUMBER;
BEGIN
Select horas into horas_actuales from empleados where id_empleado=emple;
if horas_actuales is NULL then
RAISE_APPLICATION_ERROR(-20010,'No tiene horas');
else
update empleados set horas=horas_actuales + horas_subir where id_empleado=emple;
end if;
End subir_horas;
*Control de transacciones
Control de transacciones en Oracle. Una transaccin se define como un conjunto de operaciones
sobre la base de datos.
En Oracle si se ejecuta un conjunto de operaciones y una de ellas falla se aborta la transaccin
entera. En este artculo veremos todo lo que debemos saber sobre transacciones y algunos
ejemplos interesantes. Est englogado dentro del Manual de Oracle que venimos publicando en
DesarrolloWeb.com.
La transaccin finaliza cuando se ejecuta un comando de control de transacciones como rollback o
commit work (se puede abreviar poniendo simplemente commit).
Un ejemplo:
BEGIN
....
update alumnos set edad=20 where n_alumno=109;
update nuevos set apellido='perez' where n_alumno=200;
commit work;
...
EXCEPTION
WHEN OTHERS THEN
rollback work;
END;
Comandos utilizados para el control de transacciones
Commit
Este comando da por concluida la transaccin actual y hace definitivos los cambios realizados
liberando las filas bloqueadas. Slo despus de que se ejecute commit tendremos acceso a los
datos modificados.

Rollback
Este comando da por concluida la transaccin 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 transaccin porque se han levantado excepciones.
Savepoint
Se utiliza para poner marcas o puntos de salvaguarda al procesar transacciones. Se utiliza junto
con rollback permitiendo deshacer cambios hasta los savepoint.
El nmero de savepoint esta limitado a 5 por sesin pero lo podemos modificar con la siguiente
sentencia:
savepoint numero;
Rollback implicito
Este comando se ejecuta cuando un programa almacenado (procedimiento o funcin) falla y no se
controla la excepcin que produjo el fallo. Pero si en el programa tenemos un commit estos
cambios no sern deshechos.
Rollback to
Deshace el trabajo realizado despus del punto indicado. Pero no se confirma el trabajo hecho
hasta el savepoint. La transaccin no finaliza hasta que se ejecuta un comando de control de
transacciones o hasta que finaliza la sesin.
Os dejo a continuacin un ejemplo bastante completo de lo que seria el control de transacciones:
create or replace procedure prueba (nfilas number)
as
begin
savepoint ninguna;
insert into tmp values ('primera fila');
savepoint una;
insert into tmp values ('segunda fila');
savepoint dos;
if nfilas=1 then
rollback to una;
else if nfilas=2 then
rollback to dos;
else
rollback to ninguna;
end if;
commit;
exception
when other then
rollback
end prueba;
Con este artculo terminamos la parte bsica sobre oracle, PL/SQL y pasamos a lo que podemos
denominar programacin avanzada de sql. Empezaremos con triggers en el siguiente artculo.

*Triggers a tablas en PL/SQL


Explicamos que son los triggers o disparadores de base de datos en PL/SQL de Oracle.
Como ya comentbamos en el articulo anterior, publicado en el Manual de Oracle de
DesarrolloWeb.com, comenzamos lo que podramos denominar programacin avanzada dentro de
PL/SQL.
En el presente artculo vamos a estudiar acerca de los triggers, donde veremos qu son y como se
construyen, comenzando con los trigger de tablas y ms tarde veremos los trigger de sustitucin y
los de sistema. Para ello lo primero que tenemos que ver es su definicin.
Trigger a tablas
Un trigger es un bloque de cdigo PL/SQL que se almacenan en la base de datos. Los bloques de
cdigo de los triggers estn asociados a una tabla y se ejecutan automticamente cuando se
producen ciertos eventos asociados a la tabla.
Se suelen utilizar para prevenir transacciones errneas y nos sirven tambin para implementar
restricciones de integridad o seguridad.
Su formato bsico es el siguiente:
create or replace trigger nombre_trigger
{before | after} {delete | insert | update[of lista_columnas]}
[or {before | after} {delete|insert|update [of lista_columnas]}]
on nombre_tabla
[for each {row | statement | when (condicin)}]
/* comienza el trigger */
[declare]
<declaraciones>
begin
<instrucciones>
[exception]
<excepciones>
end;
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 operacin independientemente del nmero 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
:new que hace referencia a los nuevos valores de actualizacin 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.

Slo se pueden utilizar cuando el trigger es a nivel de fila (for each row).

Vamos a a crear un trigger que se dispar automticamente despus de la modificacin del salario
de la tabla empleado y pase un comentario a la tabla auditar.
Create or replace trigger auditar_salario
after update of salario
on empleado
for each row
begin
insert into auditar values
('se ha modificado el salario' || :old.num_empleado);
end;
Orden de ejecucin de los trigger
Una misma tabla puede tener varios triggers y el orden de disparo seria el siguiente:
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 actualizacin de la fila
c) se ejecutan los triggers after... for each row
3. Una vez realizada la operacin se ejecuta el after for each statement
Cuanndo se dispara un trigger este forma parte de la operacin que lo dispar de manera que si el
trigger falla, Oracle dar por fallida la operacin completa. Aunque el fallo sea a nivel de fila se
har rollback a toda la operacin.
Ejemplo:
create or replace trigger nombre_trigger
before insert or delete
begin
if insert then
.....
elseif deleting then
....

elseif updating then


...
end if
....
end;
En el siguiente articulo veremos los triggers de sustitucin y los del sistema.
*Triggers de sustitucin y de sistema
Vemos lo que es un disparador de sustitucin y el de sistema, as como su creacin en Oracle.
Disparadores de sustitucin
Podemos crear triggers que no se ejecutan antes ni despus de una instruccin sino en lugar de
(instead of).
Solo podemos utilizar estos triggers si estn asociados a vistas, adems actan siempre a nivel de
fila.
La sintaxis de este tipo de trigger es la siguiente:
create [or replace] trigger nombre_trigger
instead of { insert | delete | update [of columnas]}
[ or { insert | delete | update}]
on nombre vista
[ for each row]
[declare]
declaraciones
begin
instrucciones
[execption]
excepciones
end;
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.
Un ejemplo de trigger de sustitucin seria el siguiente:
create or replace trigger t_borrado_emp
instead of delete on empleado
for each row
begin
delete from emple where emp_num=:old.cod
end;
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
trigger.
La sintaxis de este trigger seria la siguiente:
create [or replace] trigger nombre_trigger
{ before | after } { <lista eventos de definicin> | <lista eventos del sistema>}
on { database | schema} [when (condicin)]
<cuerpo del trigger (bloque PL/SQL)>
Donde la lista de eventos de definicin puede tener uno o ms eventos DDL separados por or y la
lista de eventos del sistema igualmente separados por or.
Al asociar un disparador a un evento debemos indicar el momento en que se dispare. A
continuacin os dejo una tabla de evento, momento y cuando se disparara para dejarlo todo mas
o menos claro.
Evento

Momento

Se disparan:

STARTUP

AFTER

Despus de arrancar la instancia

SHUTDOWN BEFORE

Antes de apagar la istancia

LOGON

AFTER

Despus de que el usuario se conecte a la base de datos.

LOGOFF

BEFORE

Antes de la desconexin de un usuario

SERVERERROR AFTER

Cuando ocurre un error en el servidor

CREATE

BEFORE |
AFTER

Antes o despus de crear un objeto en el esquema

DROP

BEFORE |
AFTER

Antes o despus de borrar un objeto en el esquema

ALTER

BEFORE |
AFTER

Antes o despus de cambiar un objeto en el esquema

TRUNCATE

BEFORE |
AFTER

Antes o despus de ejecutar un comando truncate

GRANT

BEFORE |
AFTER

Antes o despus de ejecutar un comando grant

REVOKE

BEFORE |
AFTER

Antes o despus de ejecutar un comando revoke

BEFORE |
AFTER

DLL

Antes o despus de ejecutar cualquier comando de definicin de


datos

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 podis 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:
create or replace trigger control
after logon
on database
begin
insert into control_conexion (usuario, momento, evento)
values {ORA_LOGIN_USER, SYSTIMESTAMP, ORA_SYSEVENT);
end;
*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 artculo 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.
Un paquete consta de los siguientes elementos:

Especificacin o cabecera: contiene las declaraciones pblicas (es decir, accesibles desde
cualquier parte de la aplicacin) de sus programas, tipos, constantes, variables, cursores,
excepciones, etc.

Cuerpo: contiene los detalles de implementacin y declaraciones privadas, es decir,


accesibles solamente desde los objetos del paquete.

La sintaxis de la cabecera es la siguiente:


create [or replace] package nombre_paquete as
<declaraciones pblicas>
<especificaciones de subprogramas>
end nombre_paquete;
La sintaxis del cuerpo sera la siguiente:
create [or replace] package body nombre_paquete as
<declaraciones privadas>

<cdigo de subprogramas>
[begin
<instrucciones iniciales>]
end nombre_paquete;
Como podis observar la cabecera se compila independientemente del cuerpo. Os dejo un
ejemplo de paquete para que lo veis ms claro.
/* Cabecera */
create or replace package busar_emple as
TYPE t_reg_emple is RECORD
(num_empleado emple.emp_no%TYPE,
apellido emple.apellido%TYPE,
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 */
create or replace package body buscar_emple as
vg_emple t_reg_emple;
procedure ver_emple; /* procedimiento privado*/
procedure ver_por_numero (v_cod emple.emp_no%TYPE)
is
begin
select emp_no, apellido, salario, dept_no into vg_emple from emple where emp_no=v_cod;
ver_emple;
end ver_por_numero;
procedure ver_por_apellido (v_ape emple.apellido%TYPE)
is
begin
select emp_no,apellido,salario,dept_no into vg_emple from emple where apellido=v_apellido;
ver_emple;
end ver_por_apellido;
function datos (v_cod emple.emp_no%TYPE)
return t_reg_emple
is
begin
select emp_no,apellido,salario,dept_no into vg_emple from emple where emp_no=v_cod;
procedure ver_emple
is

begin
DBMS_OUTPUT.PUT_LINE(vg_emple.num_empleado || '*' || vg_emple.apellido || '*' ||
vg_emple.salario || '*'|| vg_emple.departamento);
end ver_emple;
end buscar_emple;
Como podis ver este paquete nos permite buscar un empleado de tres formas distintas y
visualizar sus datos.
Utilizacin de los objetos definidos en los paquetes
Podemos utilizar los objetos definidos en los paquetes bsicamente de dos maneras distintas:

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 slo tendramos que llamarlo. La llamada
sera 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 especificacin del mismo. Para llamar a un objeto o
procedimiento desde fuera del paquete utilizaramos la siguiente notacin: execute
nombre_paquete.nombre_procedimiento(lista de parametros);

Declaracin de cursores en paquetes


En los paquetes tambin podemos introducir cursores, para ello debemos declararlo en la
cabecera del paquete indicando su nombre, los parmetros y tipo devuelto. Para que lo veis ms
claro os dejo un ejemplo a continuacin:
CREATE or REPLACE PACKAGE empleados AS
.....
CURSOR a RETURN empleado%ROWTYPE;
...
END empleados;
CREATE or REPLACE PACKAGE BODY empleados AS
....
CURSOR a RETURN empleado%ROWTYPE
SELECT * FROM empleado WHERE salario < 10000;
....
END empleados;
Los paquetes suministrados por Oracle son:
Standard : tiene la funcin to_char y abs
dbms_standard: tiene la funcin raise_aplication_error
dbms_output: con la funcin put_line

dbms_sql: que utiliza sql de forma dinmica.


NOTA: sql dinmico significa que el programa es capaz de ejecutar rdenes de definicin y
manipulacin sobre objetos que slo se conocen al ejecutar el paquete.
Un ejemplo de la utilizacin de dbms_sql es el siguiente:
BEGIN
......
id_cursor := DBMS_SQL.OPEN_CURSOR;
DMBS_SQL.PARSE(id_cursor, instruccin,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.
Despus tenemos el DMBS_SQL.PARSE que analiza la instruccin que se va a ejecutar. Ya en la
siguiente linea ejecutamos la sentencia y por ltimo cerramos el cursor.