Tutorial Oracle 10g

Embed Size (px)

Citation preview

TUTORIAL ORACLE 10GOracle es una potente herramienta cliente/servidor para la gestin de Bases de Datos. Explicamos la herramienta y las ayudas que ofrece al desarrollador.Por David MasipAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Empezamos un nuevo curso sobre SQL con Oracle que puede resultar muy interesante para ampliar los conocimientos de SQL que habamos adquirido anteriormente.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Conceptos bsicos para la gestin de seguridad de una base de datos en Oracle.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 sistemaEn 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 SESSION_PER_USER

Descripcin El nmero de sesiones concurrentes que un usuario puede tener en una instancia. El tiempo de CPU, en centenas de segundos, que una sesin puede utilizar. El nmero de minutos que una sesin puede permanecer activa. El nmero de minutos que una sesin puede permanecer sin que sea utilizada de manera activa. El nmero de bloques de datos que se pueden leer en una sesin. El nmero de bloques de datos que se pueden leer en una operacin. La cantidad de espacio privado que una sesin puede reservar en la zona de SQL compartido de la SGA. El nmero de total de recursos por sesin, en unidades de servicio. Esto

CPU_PER_SESSION

CONNECT_TIME

IDLE_TIME LOGICAL_READS_PER_SESSION LOGICAL_READS_PER_CALL PRIVATE_SGA COMPOSITE_LIMIT

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;

Continuamos con los conceptos bsicos en la gestin de seguridad de una base de datos. Seguridad de los datos en Oracle.Por Russvell Oblitas ValenzuelaAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 usuarioUn 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.

Pasamos a describir los pasos necesarios para instalar el sistema gestor de base de datos Oracle Database 10g Express.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Todo lo relacionado con la gestin de usuarios en Oracle.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Aprendemos a crear y definir claves primarias y sus restricciones.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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];

Vemos sentencias en SQL para la supresion y modificacin tanto de tablas como de restricciones.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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:

Utilizando SQL con Oracle aprendemos como hacer Inserciones, actualizaciones y a eliminar datos.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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;

Empezamos a ver los tipos de operadores y trabajamos con algunos ejemplos.Por Agustin JareoAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Operadores aritmticos:

+ = Suma

- = Resta * = Multiplicacin / = divisin

Operadores de comparacin y lgicos:

!> = Distinto >= = Mayor o igual que Comparacin = between...and like in y sus correspondientes negaciones AritmticosFunciones 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.

EtiquetasPodemos 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)

Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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:

ProcedimientosLos 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 ; [EXCEPTION excepciones] END;

La clusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la funcin.

ParmetrosTodos 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

Nos permite pasar valores a un subprograma. Dentro del subprograma, el parmetro actu como una IN constante. Puede ser una variable, constante, literal o expresin. Permite devolver valores al bloque que llam al subprograma. Dentro del subprograma, el parmetro OUT acta como una variable no inicializada. Solo puede ser una variable. Permite pasar un valor inicial y devolver un valor IN actualizado. Dentro del subprograma, el parmetro OUT actu como variable inicializada. Puede intervenir otras expresiones. El valor actual debe ser una variable.El formato genrico es el siguiente:

[IN | OUT | IN OUT] [ { := | DEFAULT} ]

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.

Comenzamos a explicar los cursores de PL/SQL. Veremos los cursores explcitos, sus atributos y las variables de acoplamiento .Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 IS ; 2. Apertura del cursor: Deber colocarse en la zona de instrucciones, con el siguiente formato:OPEN ;

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 INTO { | };

Si tenemos una nica variable que recoge los datos de todas las columnas, el formato de la variable seria el siguiente: %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 ;

Ahora, veamos un ejemplo de utilizacin de cursores explcitos:

DECLARE CURSOR C1 IS SELECT nombre, apellido FROM arbitro; Vnom VARCHAR2(12); Vape BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom, Vape; EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vapen); END LOOP; CLOSE C1; END; VARCHAR2(20);

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 cursorPara 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 cursoresEn 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;

Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y cursores con parmetros.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 habamos comenzado a explicar en el artculo anterior.

Variables de acoplamientoSi 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 . LOOPEl 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 parmetrosUn cursor puede tener parmetros; en este caso se aplicara el siguiente formato genrico:

CURSOR nombrecursor [(parmetros)] IS SELECT ;

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)];

Continuamos con los cursores, esta vez vamos a ver atributos con cursores explcitos y uso de cursores para actualizar filas.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Atributos con Cursores implcitosLos 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: NO_DATA_FOUND: si la consulta no devuelve ninguna fila TOO_MANY_ROWS: si la consulta devuelve ms de una fila

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 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 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 cod_dept=num_dept

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 FOR UPDATE; reg c%ROWTYPE; inc NUMBER (8); BEGIN OPEN c; cod_dept=num_dept

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.

Las excepciones en el sistema gestor Oracle y el lenguaje PL/SQL, nos ayudan a detectar y tratar errores en tiempo de ejecucin.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 OracleLas 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 THEN

; ...... [WHEN OTHERS THEN ;] END;

Excepciones predefinidasSon 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 usuarioSon 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 excepcionesExisten 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_ERROREn 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 en Oracle. Una transaccin se define como un conjunto de operaciones sobre la base de datos.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Explicamos que son los triggers o disparadores de base de datos en PL/SQL de Oracle.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 tablasUn 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] begin [exception] end;

Elementos de un triggerbefore / 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 triggerUna 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.

Vemos lo que es un disparador de sustitucin y el de sistema, as como su creacin en Oracle.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Disparadores de sustitucinPodemos 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 sistemaEstos 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 } { | } on { database | schema} [when (condicin)]

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 STARTUP SHUTDOWN LOGON LOGOFF SERVERERROR CREATE DROP ALTER TRUNCATE GRANT REVOKE

Momento AFTER BEFORE AFTER BEFORE AFTER BEFORE | AFTER BEFORE | AFTER BEFORE | AFTER BEFORE | AFTER BEFORE | AFTER BEFORE |

Se disparan: Despus de arrancar la instancia Antes de apagar la istancia Despus de que el usuario se conecte a la base de datos. Antes de la desconexin de un usuario Cuando ocurre un error en el servidor Antes o despus de crear un objeto en el esquema Antes o despus de borrar un objeto en el esquema Antes o despus de cambiar un objeto en el esquema Antes o despus de ejecutar un comando truncate Antes o despus de ejecutar un comando grant Antes o despus de ejecutar un

AFTER DLL BEFORE | AFTER

comando revoke 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;

Vamos a ver que son los paquetes en el sistema gestor de base de datos Oracle, explicando estructura y funcionamiento.Por Sara AlvarezAtencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 end nombre_paquete;

La sintaxis del cuerpo sera la siguiente:

create [or replace] package body nombre_paquete as [begin ] 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 paquetesPodemos 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 paquetesEn 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. No os preocupis si no habis terminado de entenderlo ya que dedicaremos un articulo completo a la utilizacin de DBSM_SQL.