Sei sulla pagina 1di 69

TUTORIAL ORACLE 10G

Oracle 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 Masip
Atencin: 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 Jareo
Atencin: 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 Alvarez
Atencin: 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 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 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 Valenzuela
Atencin: 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 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.

Pasamos a describir los pasos necesarios para instalar el sistema gestor de base de datos Oracle Database 10g Express.
Por Sara Alvarez
Atencin: 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 Jareo
Atencin: 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 Jareo
Atencin: 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 Jareo
Atencin: 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 Jareo
Atencin: 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 Jareo
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Vemos los distintos tipos de funciones y algunos ejemplos de las mismas con SQL para Oracle.
Por Agustin Jareo
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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

Explicacin y ejemplos de las subconsultas en SQL para Oracle.


Por Agustin Jareo
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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

Aprendemos a agrupar elementos y a combinar filas seleccionadas con SQL para Oracle
Por Agustin Jareo
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Distintas formas de optimizar las consultas realizadas en SQL.


Por Claudio
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

Creacin, modificacin y supresin de vistas con SQL.


Por Agustin Jareo
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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

Qu es el lenguaje PL/SQL y primeras explicaciones para saber cmo funciona este gestor PL/SQL.
Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

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.
Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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; NOT NULL :='Camiseta';

prenda CHAR(20)

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.

Es importante controlar los posibles errores y adems distinguir los distintos tipos de programas que podemos crear con PL/SQL.
Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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.

En este artculo vamos a ver el uso y ejemplos de los bloques annimos en PL/SQL y los procedimientos.
Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 Domusu 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; / VARCHAR2(10); VARCHAR2(10);

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.

En este artculo estudiaremos los fundamentos de PL/SQL y algunos de los elementos que constituyen este lenguaje.
Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 Concatenacin

:= AND OR NOT ||

Is null = != <> < > Comparacin <= >= between...and like in 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)

Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.
Por Sara Alvarez
Atencin: 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:

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

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:

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

Comenzamos a explicar los cursores de PL/SQL. Veremos los cursores explcitos, sus atributos y las variables de acoplamiento .
Por Sara Alvarez
Atencin: 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 <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 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 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;

Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y cursores con parmetros.
Por Sara Alvarez
Atencin: 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 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)];

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

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: 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 <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 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 Alvarez
Atencin: 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 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 en Oracle. Una transaccin se define como un conjunto de operaciones sobre la base de datos.
Por Sara Alvarez
Atencin: 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 Alvarez
Atencin: 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 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.

Vemos lo que es un disparador de sustitucin y el de sistema, as como su creacin en Oracle.


Por Sara Alvarez
Atencin: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

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 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 Alvarez
Atencin: 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 <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. No os preocupis si no habis terminado de entenderlo ya que dedicaremos un articulo completo a la utilizacin de DBSM_SQL.

Potrebbero piacerti anche