Este documento presenta un manual de curso sobre PL/SQL. Explica conceptos básicos de modelado de datos como entidades, relaciones y cardinalidad. Luego introduce PL/SQL describiendo su estructura, variables, cursores, manejo de errores, subprogramas y paquetes. Cada capítulo cubre un tema en detalle con ejemplos.
0 calificaciones0% encontró este documento útil (0 votos)
137 vistas89 páginas
Este documento presenta un manual de curso sobre PL/SQL. Explica conceptos básicos de modelado de datos como entidades, relaciones y cardinalidad. Luego introduce PL/SQL describiendo su estructura, variables, cursores, manejo de errores, subprogramas y paquetes. Cada capítulo cubre un tema en detalle con ejemplos.
Este documento presenta un manual de curso sobre PL/SQL. Explica conceptos básicos de modelado de datos como entidades, relaciones y cardinalidad. Luego introduce PL/SQL describiendo su estructura, variables, cursores, manejo de errores, subprogramas y paquetes. Cada capítulo cubre un tema en detalle con ejemplos.
Este documento presenta un manual de curso sobre PL/SQL. Explica conceptos básicos de modelado de datos como entidades, relaciones y cardinalidad. Luego introduce PL/SQL describiendo su estructura, variables, cursores, manejo de errores, subprogramas y paquetes. Cada capítulo cubre un tema en detalle con ejemplos.
Descargue como PDF, TXT o lea en línea desde Scribd
Descargar como pdf o txt
Está en la página 1/ 89
Manual del Curso de PL/SQL
MANUAL DEL CURSO
INDICE
CAPTULO 1: NOCIONES DE MODELAMIENTO DE DATOS ........................................................... 2 ENTIDADES...................................................................................................................................................... 4 RELACIONES.................................................................................................................................................... 5 CARDINALIDAD............................................................................................................................................... 6 CAPTULO 2: INTRODUCCIN A PL/SQL........................................................................................... 10 QU ES PL/SQL?......................................................................................................................................... 10 ESTRUCTURAS DE BLOQUE............................................................................................................................ 10 VARIABLES Y CONSTANTES .......................................................................................................................... 11 CURSORES..................................................................................................................................................... 12 MANEJO DE ERRORES.................................................................................................................................... 13 SUBPROGRAMAS ........................................................................................................................................... 13 PAQUETES ..................................................................................................................................................... 14 VENTAJAS EN LA UTILIZACIN DE PL/SQL................................................................................................... 15 CAPTULO 3: FUNDAMENTOS DEL LENGUAJE............................................................................... 18 SET DE CARACTERES Y UNIDADES LXICAS ................................................................................................. 18 DELIMITADORES E IDENTIFICADORES ........................................................................................................... 19 TIPOS DE DATOS Y CONVERSIONES............................................................................................................... 21 ALCANCE Y VISIBILIDAD............................................................................................................................... 24 CAPTULO 4: ESTRUCTURAS DEL LENGUAJE................................................................................ 26 CONTROL CONDICIONAL: SENTENCIA IF ...................................................................................................... 27 CONTROLES DE ITERACIN: LAS SENTENCIAS LOOP Y EXIT ...................................................................... 30 CONTROLES DE SECUENCIA: LAS SENTENCIAS GOTO Y NULL ................................................................... 34 SENTENCIAS SQL.......................................................................................................................................... 36 PROCESAMIENTO DE TRANSACCIONES .......................................................................................................... 42 CAPTULO 5: MANEJO DE CURSORES ............................................................................................... 46 DECLARACIN DE CURSORES........................................................................................................................ 47 APERTURA DE UN CURSOR............................................................................................................................ 48 RECUPERACIN DE FILAS.............................................................................................................................. 49 CIERRE DE UN CURSOR.................................................................................................................................. 51 CAPTULO 6: MANEJO DE ERRORES.................................................................................................. 52 EXCEPCIONES PREDEFINIDAS ........................................................................................................................ 52 EXCEPCIONES DEFINIDAS POR EL USUARIO.................................................................................................... 54 USO DE SQLCODE Y SQLERRM................................................................................................................ 56 CAPTULO 7: SUBPROGRAMAS............................................................................................................ 57 PROCEDIMIENTOS.......................................................................................................................................... 59 FUNCIONES.................................................................................................................................................... 60 USO DE PARMETROS ................................................................................................................................... 62 RECURSIVIDAD.............................................................................................................................................. 64 POLIMORFISMO ............................................................................................................................................. 66 CAPTULO 8: PAQUETES........................................................................................................................ 68 VENTAJAS DE LA UTILIZACIN DE PAQUETES................................................................................................ 69 ESPECIFICACIN DE PAQUETES ..................................................................................................................... 71 CUERPO DE UN PAQUETE............................................................................................................................... 71 ANEXOS.......................................................................................................................................................73 Manual del Curso de PL/SQL 2 CAPTULO 1: NOCIONES DE MODELAMIENTO DE DATOS
Al disear un sistema de informacin o un proyecto de tecnologa se debe tener en cuenta varios factores que intervienen en el desarrollo del mismo. El xito del proyecto depender de la calidad con que se desarrollen todas las etapas que se identifiquen. Algunas consideraciones se relacionan con reconocer ciertos componentes que participan en el diseo de una solucin tecnolgica, donde se incluye el anlisis, el diseo lgico y fsico de la solucin y posteriormente su implantacin. En el mbito de los sistemas de informacin, se reconoce que el estudio de los procesos de negocio deber desembocar prontamente en el establecimiento de un modelo lgico de datos, que refleje de la mejor forma posible la complejidad que puede llegar a adquirir el sistema real.
DISTRIBUCIN NORMAL % DE CASOS FRECUENCIA
Figura 1-1 Curva de estudio de casos
Manual del Curso de PL/SQL 3 Cuando se estudia un proceso de negocio o una situacin cualquiera, se presenta una importante diversidad de componentes o casos, unos muy frecuentes, otros menos y algunos eventuales. Cuando se trata de crear un sistema que refleje este proceso, surge la pregunta cules son los componentes que voy a considerar en el diseo?. Cuanto mayor sea el nmero de componentes, casos o situaciones, considerados, mayor ser la complejidad del diseo. Particularmente, si deben considerarse las situaciones excepcionales, el diseo ser muy complejo y por ende caro.
Abstraccin
REALIDAD MODELO Figura 1-2: Abstraccin de la realidad para generar un modelo
Abstraccin es la actividad por la cual se recogen las caractersticas comunes ms relevantes y esenciales de una realidad, para generar un modelo. Este modelo deber tener un comportamiento, desde el punto de vista de quin lo usar, semejante a la realidad que representa. Por esta razn el modelo deber poseer tantos atributos de la realidad, como corresponda a su operacin interna y a su relacin con otros modelos. Manual del Curso de PL/SQL 4 Entidades
Entonces, cuando se modela una realidad, surge la necesidad de identificar aquellas entidades que conforman la situacin en estudio y representarlas con objetos genricos que tengan el nivel de abstraccin adecuado que permitan reconocer las caractersticas del objeto que se est modelando. Estas entidades poseern entonces caractersticas o atributos que las determinarn en forma detallada y que ayudarn incluso a relacionarlas con otras entidades del mismo modelo.
Ejemplo: Sea la entidad CLIENTE en una cadena de tiendas, que representa a las personas que compran los productos que son ofrecidos por la empresa. La notacin ms comn para representar una entidad, en la gnesis de un modelo de datos, es la siguiente: Cliente
Si la tienda ofrece determinados productos y la venta de stos es registrada en un pedido, entonces las entidades PRODUCTO y PEDIDO tambin pertenecern al modelo de datos lgico: Producto Pedido
Ahora, cuando debemos detallar las caractersticas de estas entidades que son relevantes para el proceso de negocio que se est analizando, las escribimos en el recuadro inferior. En este ejemplo, las caractersticas relevantes de las entidades definidas podran ser las siguientes: RUT Nombres Apellidos Direccin Telfono Cliente Cdigo Nombre Stock Mnimo Stock Mximo Producto No. pedido Fecha Total Pedido
Manual del Curso de PL/SQL 5 Clave Primaria En todas las entidades es preciso identificar aquel atributo que identifica unvocamente a cada ocurrencia dentro de ella. Es la que llamamos clave principal o primaria. Si observamos nuestro modelo, es claro que los atributos principales de cada entidad deberan ser los siguientes: Cliente RUT Pedido No. de Pedido Producto Cdigo del Producto
Hasta aqu se han establecido ciertas entidades que, luego del anlisis practicado a la situacin en estudio, se han definido como las ms representativas del modelo de negocio. Tambin se han precisado las caractersticas ms importantes de cada una de ellas, las cuales se conocen con el nombre de atributos en un modelo relacional.
Relaciones
A continuacin, cuando ya se encuentra definida cada entidad en forma individual, el siguiente paso es descubrir las relaciones que existen entre ellas, las cuales tambin se determinan por las reglas del negocio que se est modelando.
En el ejemplo, se entiende que los clientes son los que realizan los pedidos. Adems, cada pedido puede involucrar uno o ms artculos (productos) ofrecidos por la empresa. De esta manera, se desprende que las relaciones se producen entre las entidades, las cuales simbolizamos con una lnea que las une. Ejemplo: RUT Nombres Apellidos Direccin Telfono Cliente Cdigo Nombre Stock Mnimo Stock Mximo Producto No. pedido Fecha Total Pedido
Manual del Curso de PL/SQL 6 Al observar detenidamente estas lneas que unen a nuestras entidades podremos darnos cuenta que tienen formas muy diferentes. Esto no ha sido un capricho del editor de este manual, sino una nomenclatura muy conocida para representar las cardinalidades o nmero de veces en que las ocurrencias de una entidad participan sobre otra.
Cardinalidad
Existen varias formas de anotar la cardinalidad de las relaciones que se identifican en un modelo. Todas ellas son dependientes de la posicin, es decir, un mismo smbolo dibujado al revs significa una cosa totalmente diferente en el modelo. En este manual estudiaremos la notacin siguiente:
1. Este smbolo representa que cada ocurrencia de la entidad de la izquierda participa cero o muchas veces en una relacin con algn tem de la entidad de la derecha ( ). Al mismo tiempo, indica que una ocurrencia de la entidad de la derecha siempre se relaciona con algn tem en la entidad de la izquierda ( ). Por ejemplo, en la relacin: RUT Nombres Apellidos Direccin Telfono Cliente No. pedido Fecha Total Pedido
La cardinalidad indicada, al leerla de izquierda a derecha, asegura que cada Cliente realiza 0 ms pedidos a la tienda. Por otro lado, tambin aclara que un pedido slo se asocia con un solo Cliente (al leer de derecha a izquierda). En una implementacin fsica (un paso ms adelante que este diseo) se podr observar que algunos atributos o caractersticas de algunas entidades deben ser traspasadas a otras para mantener la integridad de los datos que se modelan en esta etapa. Manual del Curso de PL/SQL 7 2. Este smbolo es especial porque est representando una relacin de muchos tems de una entidad sobre muchos otros de la otra entidad. En palabras, aterrizando a nuestro pequeo modelo, se leera de la siguiente forma:
Cdigo Nombre Stock Mnimo Stock Mximo Producto No. pedido Fecha Total Pedido
a) Un pedido debe contener por lo menos un producto y como mximo varios de ellos ( ). b) Un mismo producto puede aparecer ninguna o muchas veces en un mismo pedido ( ).
La lectura es fcil, pero su implementacin fsica requerir de un paso adicional, que es romper esta relacin de muchos a muchos y crear una nueva entidad que relacione de manera simple a cada una de las entidades Producto y Pedido.
Si se tuviera en cuenta este mismo punto al momento de efectuar el modelo lgico, podramos haber propuesto un esquema como el siguiente:
Cdigo Nombre Stock Mnimo Stock Mximo Producto No. pedido Fecha Total Pedido No. Caja Venta
En este nuevo modelo (o submodelo) se rompi la relacin anterior y fabricamos dos nuevas relaciones ms sencillas y que aportan tanta o ms informacin que la anterior. Por ejemplo, ahora podemos conocer el nmero de la caja donde se efectu la venta, que no era un atributo ni del pedido ni de los productos. Sin embargo, no era necesario buscar un atributo a la nueva entidad, puesto que sta podra estar vaca si no existe un dato que la caracterice en forma adecuada dentro de nuestro modelo del negocio. Manual del Curso de PL/SQL 8 Finalmente, segn nuestra manera natural de ver las cosas, entendemos que las entidades y relaciones revisadas en las pginas anteriores, aclaran la participacin de los objetos del negocio para ejemplificar los temas revisados hasta aqu. Sin embargo, debo demostrar ahora que esta misma lgica no puede ser entendida por un sistema computacional o un administrador de bases de datos, por muy poderoso que ste sea. La razn es muy simple y se ejemplificar de la siguiente manera:
Suponga las siguientes ocurrencias de las entidades anteriormente definidas:
Cliente Atributo Valores A B C RUT 5.555.555-5 6.666.666-6 7.777.777-7 Nombres Sergio Marco Antonio Luis Fernando Apellidos Contreras Ruiz Fernndez Ros Crcamo Vera Direccin Los Copihues #48 Las Encinas #1000 Apoquindo #777 Telfono 6666666 7777777
Producto Atributo Valores A B C Cdigo A100 B123 C430 Nombre Microondas Mesa de Televisor Silla Stock Mnimo 15 10 10 Stock Mximo 40 60 60
Pregunta: Si el Cliente A efecta un pedido de 3 sillas y un microondas. Cmo debera representarlo la relacin de Pedido? Manual del Curso de PL/SQL 9 Respuesta: Antes de conocer la respuesta final, observemos cmo debera reflejarlo el modelo: Supongamos el pedido nmero 1000, efectuado el 15 de diciembre por un total de $115.000 (suponga que el microondas vale $70.000 y cada silla $15.000).
Pedido Atributo Valores
No. Pedido 1000 Fecha 15-Dic-2000 Total $115.000
Al revisar esta ocurrencia en la entidad de Pedido es obvio que no podemos relacionarla de ninguna manera con algn cliente. Sin embargo, al modelarlo estuvo correcto, pero era el dibujo y la cardinalidad de la relacin quienes nos informaban de que los pedidos los efectuaban los clientes en tal o cual cantidad. Entonces, al implementar la solucin debemos considerar tambin lo siguiente:
Cada vez que encontremos una relacin de uno-a-uno, simbolizada por , como en el caso de los pedidos y los clientes en la figura siguiente, se entender que el atributo principal de la entidad que es afectada por esta cardinalidad deber traspasarse a la otra entidad.
Como en nuestro modelo este tipo de relacin se da entre Cliente y Pedido, entonces el modelo fsico de esa relacin se vera de la siguiente manera:
RUT Nombres Apellidos Direccin Telfono Cliente No. pedido Fecha Total RUT Cliente Pedido
Y de esa manera, al pasar el atributo principal de Cliente (RUT) a la entidad Pedido, se logra establecer claramente un nexo fsico en la base de datos. Manual del Curso de PL/SQL 10 CAPTULO 2: INTRODUCCIN A PL/SQL
Qu es PL/SQL?
PL/SQL provee una manera muy cmoda de relacionar los conceptos de bases de datos y manejarlos mediante ciertas estructuras de control, dentro del contexto de una herramienta netamente de programacin. Su utilizacin es dentro del administrador de bases de datos Oracle y sus principales caractersticas son la posibilidad que brinda de utilizar sentencias SQL para manipular datos en Oracle y sentencias de control de flujo para organizar esta manipulacin de datos. Dentro del lenguaje, es posible declarar constantes y variables, definir procedimientos y funciones y atrapar errores en tiempo de ejecucin. As visto, PL/SQL combina la el poder de la manipulacin de datos, con SQL, y las facilidades del procesamiento de los mismos, tal como en los ms modernos lenguajes de programacin.
Estructuras de Bloque
PL/SQL es un lenguaje estructurado en bloques, lo que quiere decir que la unidad bsica de codificacin son bloques lgicos, los que a su vez pueden contener otros sub-bloques dentro de ellos, con las mismas caractersticas. Un bloque (o sub-bloque) permite agrupar en forma lgica un grupo de sentencias. De esta manera se pueden efectuar declaraciones de variables que slo tendrn validez en los bloques donde stas se definan. Un bloque PL/SQL tiene tres partes: una seccin de declaracin, una seccin de ejecucin y otra de manejo de excepciones. Slo el bloque de ejecucin es obligatorio en un programa PL/SQL. Es posible anidar sub-bloques en la seccin ejecutable y de excepciones, pero no en la seccin de declaraciones. Manual del Curso de PL/SQL 11
Figura 2-1: Estructura de bloques de un programa PL/SQL
Variables y Constantes
PL/SQL permite declarar constantes y variables para ser utilizadas en cualquier expresin dentro de un programa. La nica condicin exigida por PL/SQL es que cada variable (o constante) debe estar declarada antes de ser utilizada en una expresin. Las variables pueden corresponder a cualquier tipo de dato de SQL, tal como char, date o number, o algn tipo de PL/SQL, como boolean o binary_integer. Por ejemplo, si desea declarar una variable llamada part_no que almacene cuatro dgitos numricos y otra variable in_stock de tipo booleano, es decir, que almacene solamente los valores True o False, la declaracin se vera como sigue: part_no number(4) ; in_stock boolean ;
Cmo asignar valores a variables Es posible asignar valores a las variables de dos formas. La primera utiliza el operador :=. La variable se ubica al lado izquierdo y la expresin al lado derecho del smbolo. Por ejemplo: tax := price * tax_rate ; bonus := current_salary * 0.10 ; amount := TO_NUMBER(SUBSTR(750 dlares, 1, 3)) ; valid := False ; Manual del Curso de PL/SQL 12 La segunda forma de asignar valores a variables es obtener valores directamente desde la base de datos, como en: SELECT sal * 0.10 INTO bonus FROM emp WHERE empno = emp_id ;
Declaracin de Constantes En la declaracin de una constante (muy similar a la de una variable), se debe incorporar la palabra reservada constant e inmediatamente asignar el valor deseado. En adelante, no se permitirn reasignaciones de valores para aquella constante que ya ha sido definida. Ejemplo: credit_limit CONSTANT real := 5000.00 ;
Cursores
Los cursores son reas de trabajo que permiten ejecutar sentencias SQL y procesar la informacin obtenida de ellos. Hay dos tipos de cursores: implcitos y explcitos. PL/SQL declara implcitamente un cursor para todas las sentencias de manipulacin de datos, incluyendo las consultas que retornan slo una fila. Para consultas que devuelven ms de una fila, es posible declarar explcitamente un cursor que procese las filas en forma individual. Por ejemplo: DECLARE CURSOR curs_01 IS SELECT empno, ename, job FROM emp WHERE deptno=20;
El conjunto de filas retornado se denomina set de resultados. Su tamao est determinado por el nmero de filas que calzan con el criterio de seleccin de la query que implementa el cursor. Las filas son procesadas de a una cada vez. En el captulo dedicado exclusivamente a estos componentes del lenguaje, se detallarn las caractersticas de las diferentes modalidades de utilizacin de los cursores. Manual del Curso de PL/SQL 13
Figura 2-2: Recuperacin de filas a travs de un cursor
Manejo de Errores
PL/SQL provee una fcil manera de detectar y procesar ciertas condiciones de error predefinidas (o definidas por el usuario), llamadas excepciones. Cuando ocurre un error se procesa una excepcin, esto es, se detiene la ejecucin normal del programa y se transfiere el control a un segmento especial del programa que tiene por objeto manejar estas situaciones excepcionales. Estas rutinas que se codifican en forma separada se conocen con el nombre de exception handlers. Las excepciones predefinidas son gatilladas automticamente por el sistema cuando ocurre un error de cierta naturaleza. Adems, es posible alcanzar excepciones definidas con el usuario, simplemente haciendo un llamado a stas utilizando la sentencia raise.
Subprogramas
En PL/SQL existen dos tipos de subprogramas, llamados procedimientos y funciones, los que pueden manejar parmetros de entrada y de salida. Un subprograma es un programa en miniatura, que comienza con un encabezado, una seccin opcional de declaraciones, una seccin de ejecucin y una seccin opcional de manejo de excepciones, como cualquier otro programa de PL/SQL.
Manual del Curso de PL/SQL 14 Paquetes
Es posible almacenar lgicamente un conjunto de tipos de datos relacionados, variables, cursores e incluso subprogramas dentro de un paquete. Cada paquete involucra la definicin y tratamiento de todos los elementos recin mencionados. Los paquetes se descomponen en dos partes: una especificacin y un cuerpo. La especificacin (package specification) es idntica a una seccin de declaracin de aplicaciones. En esta especie de encabezado es posible declarar tipos, constantes, variables, excepciones, cursores y subprogramas disponibles para su uso en el cuerpo del paquete. De esta manera, el cuerpo (package body) define la implementacin de esos subprogramas declarados en el apartado anterior. Ejemplo de uso de paquetes: CREATE PACKAGE emp_actions as -- package specification PROCEDURE hire_employee (empno NUMBER, ename CHAR, ) ; PROCEDURE fire_employee (empid NUMBER) ; END emp_actions ;
CREATE PACKAGE BODY emp_actions AS -- package body PROCEDURE hire_employee (empno NUMBER, ename CHAR, ) IS BEGIN INSERT INTO emp VALUES (empno, ename, ); END hire_employee; PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM emp WHERE empno = emp_id; END fire_employee; END emp_actions;
Los paquetes pueden ser compilados y almacenados en una base de datos Oracle y su contenido puede ser compartido por varias aplicaciones. Cuando un paquete es llamado para su ejecucin, ste se almacena completamente en memoria la primera vez. Las siguientes llamadas no requieren efectuar este procedimiento cada vez y por esto aumentan la eficiencia de los programas. Manual del Curso de PL/SQL 15 Ventajas en la utilizacin de PL/SQL
PL/SQL es un lenguaje de procesamiento de transacciones completamente portable y con un alto rendimiento, que proporciona las siguientes ventajas al ser utilizado: Soporte para SQL Soporte para la programacin orientada a objetos Mejor rendimiento Alta productividad Completa portabilidad Integracin con Oracle garantizada Seguridad
Soporte para SQL SQL se ha convertido en el lenguaje estndar de bases de datos por su flexibilidad de uso y facilidad de aprenderlo. Unos pocos comandos permiten la fcil manipulacin de prcticamente toda la informacin almacenada en una base de datos. SQL es no-procedural, lo cual significa que es Oracle quien se preocupar de cmo ejecutar de la mejor manera un requerimiento sealado en una sentencia SQL. No es necesaria la conexin entre varias sentencias porque Oracle las ejecuta de a una a la vez. PL/SQL le permite a usted una completa manipulacin de los datos almacenados en una base Oracle, proporciona comandos de control de transacciones y permite utilizar las funciones de SQL, operadores y pseudocolumnas. As, usted puede manipular los datos en Oracle de una manera flexible y segura. Adems, PL/SQL soporta tipos de datos de SQL, lo que reduce la necesidad de convertir los datos al pasar de una a otra aplicacin. PL/SQL tambin soporta SQL dinmico, una avanzada tcnica de programacin que convierte a sus aplicaciones en ms flexibles y verstiles.
Soporte para Programacin Orientada a Objetos Los objetos se han convertido en una herramienta ideal para modelar situaciones de la vida real. Con su utilizacin es posible reducir el costo y tiempo de construccin de aplicaciones complejas. Otra ventaja es que utilizando una metodologa de este tipo es posible mantener Manual del Curso de PL/SQL 16 diferentes equipos de programadores construyendo aplicaciones basadas en el mismo grupo de objetos. Permitir el encapsulamiento del cdigo en bloques es el primer paso para la implementacin de mtodos asociados a diferentes tipos de objetos construidos tambin con PL/SQL.
Mejor rendimiento Sin PL/SQL, Oracle tendra que procesar las instrucciones una a una. Cada llamada producira un overhead considerable, sobre todo si consideramos que estas consultas viajan a travs de la red. Por el contrario, con PL/SQL, un bloque completo de sentencias puede ser enviado cada vez a Oracle, lo que reduce drsticamente la intensidad de comunicacin con la base de datos. Los procedimientos almacenados escritos con PL/SQL son compilados una vez y almacenados en formato ejecutable, lo que produce que las llamadas sean ms rpidas y eficientes. Adems, ya que los procedimientos almacenados se ejecutan en el propio servidor, el trfico por la red se reduce a la simple llamada y el envo de los parmetros necesarios para su ejecucin. El cdigo ejecutable se almacena en cach y se comparte a todos los usuarios, redundando en mnimos requerimientos de memoria y disminuyendo el overhead al mnimo. Alta productividad Si se decide utilizar otros productos de Oracle como Oracle Forms y Oracle Reports, es posible integrar bloques completos de PL/SQL en un trigger de Oracle Forms, debido a que PL/SQL es el mismo en todos los ambientes.
Completa portabilidad Las aplicaciones escritas con PL/SQL son portables a cualquier sistema operativo y plataforma en la cual se encuentre corriendo Oracle. En otras palabras, PL/SQL corre dondequiera que se encuentre corriendo Oracle tambin. Esto significa que se pueden codificar libreras que podrn ser reutilizadas en otros ambientes. Manual del Curso de PL/SQL 17 Integracin con Oracle PL/SQL y los lenguajes SQL en general se encuentran perfectamente integrados. PL/SQL soporta todos los tipos de datos de SQL. Los atributos %TYPE y %ROWTYPE integran PL/SQL con SQL, permitiendo la declaracin de variables basado en tipos de columnas de tablas de la base de datos. Lo anterior provee independencia de los datos, reduce costos de mantencin y permite a los programas adaptarse a los cambios en la base de datos para cumplir con las nuevas necesidades del negocio.
Seguridad Los procedimientos almacenados construidos con PL/SQL habilitan la divisin de la lgica del cliente con la del servidor. De esta manera, se previene que se efecte manipulacin de los datos desde el cliente. Adems, se puede restringir el acceso a los datos de Oracle, permitiendo a los usuarios la ejecucin de los procedimientos almacenados para los cuales tengan privilegios solamente.
Manual del Curso de PL/SQL 18 CAPTULO 3: FUNDAMENTOS DEL LENGUAJE
Este captulo se centra en pequeos aspectos del lenguaje, tal como el grupo de caracteres vlidos, las palabras reservadas, signos de puntuacin y otras reglas de formacin de sentencias que es preciso conocer antes de empezar a trabajar con el resto de funcionalidades.
Set de Caracteres y Unidades Lxicas
Las instrucciones del lenguaje deben ser escritas utilizando un grupo de caracteres vlidos. PL/SQL no es sensible a maysculas o minsculas. El grupo de caracteres incluye los siguientes: Letras maysculas y minsculas de la A a la Z Nmeros del 0 al 9 Los smbolos ( ) + - * / < > = ! ~ ^ ; . @ % , # $ & _ | { } ? [ ] Tabuladores, espacios y saltos de carro
Una lnea de texto en un programa contiene lo que se conoce como unidades lxicas, los que se clasifican como sigue: Delimitadores (smbolos simples y compuestos) Identificadores (incluye palabras reservadas) Literales Comentarios
Por ejemplo en la instruccin: bonus := salary * 0.10; -- clculo del bono
se observan las siguientes unidades lxicas: Los identificadores bonus y salary Manual del Curso de PL/SQL 19 El smbolo compuesto := Los smbolos simples * y ; El literal numrico 0.10 El comentario clculo del bono
Para asegurar la fcil comprensin del cdigo se pueden aadir espacios entre identificadores o smbolos. Tambin es una buena prctica utilizar saltos de lnea e indentaciones para permitir una mejor legibilidad. Ejemplo: IF x>y THEN max := x; ELSE max := y; END IF;
Puede reescribirse de la siguiente manera para mejorar el aspecto y legibilidad: IF x > y THEN max := x; ELSE max := y; END IF;
Delimitadores e Identificadores
Un delimitador es un smbolo simple o compuesto que tiene un significado especial dentro de PL/SQL. Por ejemplo, es posible utilizar delimitadores para representar operaciones aritmticas, por ejemplo:
Smbolo Significado + operador de suma % indicador de atributo delimitador de caracteres . selector de componente / operador de divisin Manual del Curso de PL/SQL 20 ( expresin o delimitador de lista ) expresin o delimitador de lista : indicador de variable host , separador de tems * operador de multiplicacin delimitador de un identificador entre comillas = operador relacional < operador relacional > operador relacional @ indicador de acceso remoto ; terminador de sentencias - negacin u operador de substraccin
Los delimitadores compuestos consisten de dos caracteres, como por ejemplo:
Smbolo Significado := operador de asignacin => operador de asociacin || operador de concatenacin ** operador de exponenciacin << comienzo de un rtulo >> fin de un rtulo /* comienzo de un comentario de varias lneas */ fin de un comentario de varias lneas .. operador de rango <> operador relacional != operador relacional ^= operador relacional <= operador relacional >= operador relacional -- comentario en una lnea Manual del Curso de PL/SQL 21 Los identificadores incluyen constantes, variables, excepciones, cursores, subprogramas y paquetes. Un identificador se forma de una letra, seguida opcionalmente de otras letras, nmeros, signo de moneda, underscore y otros signos numricos. La longitud de un identificador no puede exceder los 30 caracteres. Se recomienda que los nombres de los identificadores utilizados sean descriptivos. Algunos identificadores especiales, llamados palabras reservadas, tienen un especial significado sintctico en PL/SQL y no pueden ser redefinidos. Son palabras reservadas, por ejemplo, BEGIN, END, ROLLBACK, etc.
Tipos de Datos y Conversiones
Cada constante y variable posee un tipo de dato el cual especifica su forma de almacenamiento, restricciones y rango de valores vlidos. Con PL/SQL se proveen diferentes tipos de datos predefinidos. Un tipo escalar no tiene componentes internas; un tipo compuesto tiene otras componentes internas que pueden ser manipuladas individualmente. Un tipo de referencia almacena valores, llamados punteros, que designan a otros elementos de programa. Un tipo lob (large object) especifica la ubicacin de un tipo especial de datos que se almacenan de manera diferente.
En la figura 3-1 se muestran los diferentes tipos de datos predefinidos y disponibles para ser utilizados.
Manual del Curso de PL/SQL 22
Figura 3-1: Tipos de datos de PL/SQL
Conversiones Algunas veces se hace necesario convertir un valor desde un tipo de dato a otro. En PL/SQL se aceptan las conversiones de datos implcitas y explcitas. Una conversin explcita es aquella que se efecta utilizando las funciones predefinidas. Por ejemplo, para convertir un valor de carcter a fecha o nmero se utiliza TO_DATE o TO_NUMBER. Existe una cantidad limitada de funciones de conversin, que implementan esta caracterstica de conversin explcita. Cuando se hace necesario, PL/SQL puede convertir un tipo de dato a otro en forma implcita. Esto significa que la interpretacin que se dar a algn dato ser el que mejor se adecue dependiendo del contexto en que se encuentre. Tampoco significa que todas las conversiones son permitidas. Algunos ejemplos de conversin implcita ms comunes se dan cuando variables de tipo char se operan matemticamente para obtener un resultado numrico. Manual del Curso de PL/SQL 23 Si PL/SQL no puede decidir a qu tipos de dato de destino puede convertir una variable se generar un error de compilacin.
Tabla de conversiones implcitas Hasta BIN_INT CHAR DATE LONG NUMBER PLS_INT RAW ROWID VARCHAR2 Desde BIN_INT X X X X X CHAR X X X X X X X X DATE X X X LONG X X X NUMBER X X X X X PLS_INT X X X X X RAW X X X ROWID X X VARCHAR2 X X X X X X X X
Uso de %TYPE El atributo %TYPE define el tipo de una variable utilizando una definicin previa de otra variable o columna de la base de datos. Ejemplo: DECLARE credito REAL(7,2); debito credito%TYPE;
Tambin se podra declarar una variable siguiendo el tipo de un campo de alguna tabla, como por ejemplo en: debito cuenta.debe%TYPE; La ventaja de esta ltima forma es que no es necesario conocer el tipo de dato del campo debe de la tabla emp, manteniendo la independencia necesaria para proveer ms flexibilidad y rapidez en la construccin de los programas. Manual del Curso de PL/SQL 24 Uso de %ROWTYPE El atributo %ROWTYPE precisa el tipo de un registro (record) utilizando una definicin previa de una tabla o vista de la base de datos. Tambin se puede asociar a una variable como del tipo de la estructura retornada por un cursor. Ejemplo: DECLARE emp_rec emp%ROWTYPE; CURSOR c1 IS SELECT deptno, dname, loc FROM dept; dept_rec c1%ROWTYPE;
En este ejemplo la variable emp_rec tomar el formato de un registro completo de la tabla emp y la variable dept_rec se define por una estructura similar a la retornada por el cursor c1.
Alcance y Visibilidad
Las referencias a un identificador son resueltas de acuerdo a su alcance y visibilidad dentro de un programa. El alcance de un identificador es aquella regin de la unidad de programa (bloque, subprograma o paquete) desde la cual se puede referenciar al identificador. Un identificador es visible slo en las regiones en que se puede referenciar. La figura 3-2 muestra el alcance y visibilidad de la variable x, la cual est declarada en dos bloques cerrados diferentes. Los identificadores declarados en un bloque de PL/SQL se consideran locales al bloque y globales a todos sus sub-bloques o bloques anidados. De esto se desprende que un mismo identificador no se puede declarar dos veces en un mismo bloque pero s en varios bloques diferentes, cuantas veces se desee.
Manual del Curso de PL/SQL 25
Figura 3-2: Alcance y Visibilidad de Identificadores
Este ejemplo ilustra el alcance y visibilidad (o posibilidad de ser referenciada) de una determinada variable x, que ha sido declarada en dos bloques anidados. La variable ms externa tiene un alcance ms amplio pero cuando es referenciada en el bloque en que se ha declarado otra variable con el mismo nombre, es esta ltima la que puede ser manipulada y no la primera.
Manual del Curso de PL/SQL 26 CAPTULO 4: ESTRUCTURAS DEL LENGUAJE
Este captulo muestra como estructurar el flujo de control dentro de un programa PL/SQL. Se podr entender como las distintas sentencias se encuentran conectadas mediante un poderoso y simple control de estructuras que constan de un punto de entrada y uno de salida. En su conjunto estas estructuras pueden manejar cualquier situacin y permiten una correcta estructuracin del programa. De acuerdo con el Teorema de la Estructura, cualquier programa computacional puede ser escrito utilizando las estructuras bsicas de control que se muestran en la figura 4-1. Estas se pueden combinar de todas las maneras necesarias para alcanzar la solucin de un problema dado. Las estructuras de seleccin verifican cierta condicin, despus ejecutan cierta secuencia de expresiones dependiendo si la condicin result ser verdadera o falsa. Una condicin es cualquier variable o expresin que retorna un valor booleano (TRUE o FALSE). Las estructuras de iteracin ejecutan una secuencia de sentencias repetidamente mientras la condicin permanezca verdadera. Las estructuras de secuencia simplemente ejecutan una secuencia de estamentos en el orden que ocurren.
Seleccin T F Iteracin F T Secuencia
Figura 4-1: Estructuras de Control Manual del Curso de PL/SQL 27 Control Condicional: Sentencia IF
A menudo es necesario tomar alternativas de accin dependiendo de las circunstancias. La sentencia IF permite ejecutar una secuencia de acciones condicionalmente. Esto es, si la secuencia es ejecutada o no depende del valor de la condicin a evaluar. Existen tres modos para esta instruccin: IF THEN, IF THEN ELSE y IF THEN ELSIF.
IF THEN Este es el modo ms simple y consiste en asociar una condicin con una secuencia de sentencias encerradas entre las palabras reservadas THEN y END IF (no ENDIF). Ejemplo: IF condicin THEN secuencia_de_sentencias END IF;
La secuencia de sentencias es ejecutada slo si la condicin es verdadera. Si la condicin es falsa o nula no realiza nada. Un ejemplo real de su utilizacin es la siguiente: IF condicin THEN calcular_bonus (emp_id) UPDATE sueldos SET pago = pago + bonus WHERE emp_no = emp_id; END IF;
IF THEN ELSE Esta segunda modalidad de la sentencia IF adiciona una nueva palabra clave: ELSE, seguida por una secuencia alternativa de acciones: IF condicin THEN secuencia_de_sentencias_1 ELSE secuencia_de_sentencias_2 END IF; Manual del Curso de PL/SQL 28 La secuencia de sentencias en la clusula ELSE es ejecutada solamente si la condicin es falsa o nula. Esto implica que la presencia de la clusula ELSE asegura la ejecucin de alguna de las dos secuencias de estamentos. En el ejemplo siguiente el primer UPDATE es ejecutado cuando la condicin es verdadera, en el caso que sea falsa o nula se ejecutar el segundo UPDATE:
IF tipo_trans = CR THEN UPDATE cuentas SET balance = balance + credito WHERE ELSE UPDATE cuentas SET balance = balance debito WHERE END IF;
Las clusulas THEN y ELSE pueden incluir estamentos IF, tal como lo indica el siguiente ejemplo:
IF tipo_trans = CR THEN UPDATE cuentas SET balance = balance + credito WHERE ELSE IF nuevo_balance >= minimo_balance THEN UPDATE cuentas SET balance = balance debito WHERE ELSE RAISE fondos_insuficientes; END IF; END IF; Manual del Curso de PL/SQL 29 IF THEN ELSIF Algunas veces se requiere seleccionar una accin de una serie de alternativas mutuamente exclusivas. El tercer modo de la sentencia IF utiliza la clave ELSIF (no ELSEIF) para introducir condiciones adicionales, como se observa en el ejemplo siguiente:
IF condicin_1 THEN secuencia_de_sentencias_1 ELSIF condicin_2 THEN secuencia_de_sentencias_2 ELSE secuencia_de_sentencias_3 END IF;
Si la primera condicin es falsa o nula, la clusula ELSIF verifica una nueva condicin. Cada sentencia IF puede poseer un nmero indeterminado de clusulas ELSIF; la palabra clave ELSE que se encuentra al final es opcional. Las condiciones son evaluadas una a una desde arriba hacia abajo. Si alguna es verdadera, la secuencia de sentencias que corresponda ser ejecutada. Si cada una de las condiciones analizadas resultan ser falsas, la secuencia correspondiente al ELSE ser ejecutada: BEGIN
IF sueldo > 50000 THEN bonus : = 1500; ELSIF sueldo > 35000 THEN bonus : = 500; ELSE bonus : = 100; END IF; INSERT INTO sueldos VALUES (emp_id, bonus, ); END;
Manual del Curso de PL/SQL 30 Si el valor de sueldo es mayor que 50.000, la primera y segunda condicin son verdaderas, sin embargo a bonus se le asigna 1500, ya que la segunda condicin jams es verificada. En este caso slo se verifica la primera condicin para luego pasar el control a la sentencia INSERT.
Controles de Iteracin: Las sentencias LOOP y EXIT
La sentencia LOOP permite ejecutar una secuencia de acciones mltiples veces. Todas ellas gobernadas por una condicin que regula la ejecucin de la iteracin. Existen tres modalidades para esta instruccin: LOOP, WHILE LOOP y FOR LOOP.
LOOP El modo bsico (o infinito) de LOOP encierra una serie de acciones entre las palabras clave LOOP y END LOOP, como en el siguiente ejemplo:
LOOP secuencia_de_instrucciones END LOOP;
Con cada iteracin del ciclo las sentencias son ejecutadas. Para terminar estos ciclos de ejecucin se utiliza la palabra clave EXIT. Es posible ubicar innumerables EXIT dentro del loop, obviamente ninguno fuera de l. Existen dos modalidades para utilizar esta sentencia: EXIT y EXIT WHEN.
EXIT La clusula EXIT obliga al loop a concluir incondicionalmente. Cuando se encuentra un EXIT en el cdigo, el loop es completado inmediatamente y pasa el control a la prxima sentencia. Manual del Curso de PL/SQL 31 LOOP IF ranking_credito < 3 THEN
EXIT; --Termina el loop inmediatamente END IF; END LOOP;
Es necesario recordar que esta sentencia debe estar dentro del loop. Para completar un bloque PL/SQL antes de que su final natural sea alcanzado, es posible utilizar la instruccin RETURN.
EXIT WHEN Esta sentencia permite terminar el loop de manera condicional. Cuando se encuentra un EXIT la condicin de la clusula WHEN es evaluada. Si la condicin es verdadera el loop es terminado y el control es pasado a la prxima sentencia. Ejemplo: LOOP FECTH c1 INTO EXIT WHEN c1%NOTFOUND; -- termina el loop si la condicin es verdadera
END LOOP; CLOSE c1;
Hasta que la condicin no sea verdadera el loop no puede completarse, esto implica que necesariamente dentro de las sentencias el valor de la condicin debe ir variando. En el ejemplo anterior si la ejecucin de FETCH retorna una fila la condicin es falsa. Cuando FETCH falla al retornar una fila, la condicin es verdadera por lo que el loop es completado y el control es pasado a la sentencia CLOSE.
La sentencia EXIT WHEN reemplaza la utilizacin de un IF. A modo de ejemplo se pueden comparar los siguientes cdigos: Manual del Curso de PL/SQL 32
IF count > 100 THEN | EXIT WHEN count > 100; EXIT; | END IF; |
Ambos cdigos son equivalentes, pero el EXIT WHEN es ms fcil de leer y de entender.
Etiquetas En todos los bloques escritos en PL/SQL, los ciclos pueden ser rotulados. Un rtulo es un identificador encerrado entre los signos dobles << y >> y debe aparecer al comienzo de un loop, como se muestra a continuacin: <<rtulo>> LOOP secuencia de sentencias END LOOP;
La ltima sentencia puede cambiarse tambin por END LOOP rtulo;
WHILE - LOOP Esta sentencia se asocia a una condicin con una secuencia de sentencias encerradas por las palabras clave LOOP y END LOOP, como sigue:
WHILE condicin LOOP secuencia_de_sentencias END LOOP;
Antes de cada iteracin del ciclo se evala la condicin. Si sta es verdadera se ejecuta la secuencia de sentencias y el control se devuelve al inicio del loop. Si la condicin en falsa o nula, el ciclo se rompe y el control se transfiere a la prxima instruccin, fuera del loop. Manual del Curso de PL/SQL 33 FOR - LOOP En las instrucciones anteriores el nmero de iteraciones es desconocido, mientras no se evala la condicin del ciclo. Con una instruccin del tipo FOR-LOOP, la iteracin se efecta un nmero finito (y conocido) de veces. La sintaxis de esta instruccin es la siguiente: FOR contador IN [REVERSE] valor_minimo..valor_maximo LOOP secuencia_de_sentencias END LOOP;
El contador no necesita ser declarado porque por defecto se crea para el bloque que involucra el ciclo y luego se destruye. Por defecto, la iteracin ocurre en forma creciente, es decir, desde el menor valor aportado hasta el mayor. Sin embargo, si se desea alterar esta condicin por defecto, se debe incluir explcitamente en la sentencia la palabra REVERSE. Los lmites de una iteracin pueden ser literales, variables o expresiones, pero que deben evaluarse como nmeros enteros. Un contador de loop tiene validez slo dentro del ciclo. No es posible asignar un valor a una variable contadora de un loop, fuera de l. Ejemplo: FOR cont IN 1..10 LOOP
END LOOP; sum := cont + 1 ; -- Esto no est permitido
La sentencia EXIT tambin puede ser utilizada para abortar la ejecucin del loop en forma prematura. Por ejemplo, en el siguiente trozo de programa la secuencia normal debera completarse luego de 10 veces de ejecutarse, pero la aparicin de la clusula EXIT podra hacer que sta termine antes: Manual del Curso de PL/SQL 34 FOR j IN 1..10 LOOP FETCH c1 INTO emprec; EXIT WHEN c1%NOTFOUND;
END LOOP;
O tambin se puede utilizar:
<<externo>> FOR i IN 1..5 LOOP
FOR j IN 1..10 LOOP FETCH c1 INTO emprec; EXIT externo WHEN c1%NOTFOUND; -- sale de ambos ciclos
END LOOP; END LOOP externo; -- el control retorna a esta lnea
Controles de Secuencia: Las sentencias GOTO y NULL
Ocasionalmente podra ser til la utilizacin de una sentencia de este tipo. A pesar de que es sabido que la sentencia GOTO redunda en un cdigo ms complejo y desordenado a veces podra cooperar en la implementacin de un programa. La sentencia nula puede cooperar con la fcil lectura del cdigo cuando este sobrepasa una cantidad determinada de instrucciones y torna ms difcil su comprensin.
GOTO La sentencia GOTO obliga a saltar a un rtulo del programa en forma incondicional. El rtulo debe ser nico dentro de su alcance y debe preceder a una sentencia ejecutable o a un Manual del Curso de PL/SQL 35 bloque PL/SQL. Cuando es ejecutada, esta instruccin transfiere el control a la sentencia o bloque rotulada. Los siguientes ejemplos ilustran una forma vlida de utilizar la sentencia GOTO y otra no vlida. Ejemplo vlido: BEGIN
<<actualiza>> BEGIN UPDATE emp SET
END;
GOTO <<<actualiza>>
END;
Ejemplo no vlido: DECLARE done BOOLEAN; BEGIN
FOR i IN 1..50 LOOP IF done THEN GOTO fin_loop; END IF;
<<fin_loop>> -- Ilegal END LOOP; -- Esta no es una sentencia ejecutable END;
Manual del Curso de PL/SQL 36 Restricciones Algunas restricciones en la utilizacin de un GOTO son las siguientes: una sentencia de este tipo no puede saltar dentro de una sentencia IF, LOOP o un sub-bloque. Tampoco se puede utilizar GOTO dentro del bloque de excepciones para salir de l.
NULL La sentencia NULL especifica explcitamente inaccin. No hace nada ms que pasar el control del programa a la siguiente sentencia. Tambin sirve como un comodn para hacer el cdigo ms entendible, advirtiendo que la alternativa sealada no requiere codificacin. Ejemplo: EXCEPTION WHEN zero_divide THEN Rollback; WHEN value_error THEN INSERT INTO errores VALUES Commit; WHEN others THEN NULL; END;
Sentencias SQL
SENTENCIA de seleccin - SELECT La seleccin sobre una tabla consiste en elegir un subconjunto de filas que cumplan (o no) algunas condiciones determinadas. La sintaxis de una sentencia de este tipo es la siguiente: SELECT / <columna1, columna2,....> FROM <nombre-tabla> [WHERE <condicin>] [GROUP BY <columna1, columna2....> ] Manual del Curso de PL/SQL 37 [HAVING <condicin-seleccin-grupos> ] [ORDER BY <columna1 [DESC], columna2 [DESC]...> ]
* / <columna1, columna2,....> Si se escribe , selecciona todas las columnas. Si se desea seleccionar slo algunas columnas de la tabla, se debe poner los nombres de cada una de ellas, separadas por una coma. <nombre-tabla> Nombre de la(s) tabla(s) de la(s) cual(es) se van a seleccionar los valores. WHERE <condicin> Clusula opcional que se utiliza cuando se desea establecer una o varias condiciones para la sentencia Select. Las condiciones podrn tener: operadores aritmticos: =,<>,>,>=,<,<= operadores booleanos: AND, OR operadores especiales como: BETWEEN, que permite obtener todas las filas que se encuentran en un intervalo de valores. Formato: nombre-columna BETWEEN limite-inferior AND limite-superior IN, que permite obtener todas las filas que sean iguales a alguno de los valores descritos por extensin. Formato: nombre-columna IN (valor1, valor2, .....) LIKE, que permite imponer condiciones sobre series de caracteres o parte de ellos. - El smbolo % se utiliza como carcter de sustitucin para indicar un nmero indeterminado de caracteres. Depende de la base de datos en la que se est trabajando. - El smbolo _ se utiliza como carcter de sustitucin para indicar un carcter en una determinada posicin. Depende de la base de datos en la que se est trabajando. (Los caracteres % y _ pueden combinarse) Formato: nombre-columna LIKE A% NOT, todas las condiciones que se pueden utilizar, pueden negarse anteponiendo la partcula NOT delante de los operadores especiales: IN, LIKE, BETWEEN. Manual del Curso de PL/SQL 38 IS NULL, obtiene todas las filas que contengan un valor nulo en una determinada columna. Formato: nombre-columna IS NULL
Tambin se puede negar con la partcula NOT, IS NOT NULL Una sentencia Select puede tener una o ms condiciones unidas por un operador booleano.
GROUP BY <columna1, columna2....> Se utiliza para agrupar resultados por una determinada columna, especficamente cuando se utilizan funciones de columna y los resultados se desean obtener por grupos (SQL lanza un sort para generar los grupos).
HAVING <condicin-selec-grupos> Se utiliza con la clusula GROUP BY, cuando se quiere poner condiciones al resultado de un grupo.
ORDER BY <colum1 [DESC], colum2 [DESC]...> Sirve para ordenar el resultado. Todas las columnas por las que se desee realizar el orden tienen que encontrarse en la sentencia Select de la consulta. El orden de las columnas puede ser ascendente, (por omisin, ASC), o descendente, (DESC).
SENTENCIA SELECT (JOIN) Consiste en la unin de campos de dos o ms tablas. Dichas tablas tendrn por lo menos una columna comn que sirva de nexo del join. SELECT <columna1, columna2,...> FROM <nombre-tabla1>, <nombre-tabla2>
<columna1, columna2,...> Para diferenciar las columnas con el mismo nombre se antepondr el nombre de la tabla a la que pertenecen, utilizando el punto como separador. Manual del Curso de PL/SQL 39 Por ejemplo: SELECT Tabla1.Columna2, Tabla2.Columna2, Columna3..... FROM Tabla1, Tabla2 WHERE Tabla1.Columna1 = Tabla2.Columna1 La Columna1 de cada una de las tablas respectivas son las columnas de nexo o columnas de join.
SENTENCIA SELECT DISTINCT Recupera las filas de una tabla eliminando los valores de la columna duplicados.
SELECT DISTINCT <columna1>, <columna2,....> FROM <nombre-tabla1>, <nombre-tabla2> [GROUP BY <columna1, columna2....> ] [HAVING <condicin-seleccin-grupos>] [ORDER BY <columna1 [DESC], columna2 [DESC]...>]
FUNCIONES SOBRE COLUMNAS COUNT. Indica el nmero de filas que cumplen una determinada condicin, o el nmero de valores diferentes que posee una columna. Formato: COUNT(*) o COUNT(DISTINCT <columna>)
SUM. Suma los valores de una columna. Formato: SUM(<columna>)
AVG. Entrega la media de los valores de una columna. Formato: AVG(<columna>)
MIN. Entrega el valor mnimo de una columna. Formato: MIN(<columna>)
MAX. Entrega el valor mximo de una columna. Manual del Curso de PL/SQL 40 Formato: MAX(<columna>)
SUBSELECTS Permite realizar comparaciones con valores obtenidos en otra sentencia select anidada, a la que se denomina Subselect o Subselect interna.
SELECT <columna1>, <columna2,....> FROM <nombre-tabla1>, <nombre-tabla2> WHERE <columna1> = (SELECT <columna1> FROM <nombre-tabla1>, <nombre-tabla2> WHERE <condicin>)
(Cuando en la condicin se pone el operador =, la subselect deber recuperar un slo registro).
CLUSULA UNION Mezcla los resultados de dos o ms consultas individuales en una nica tabla resultado, eliminando las filas duplicadas, si existieran.
SELECT <columna1>, <columna2,....> FROM <nombre-tabla1>, <nombre-tabla2> WHERE <condicin> UNION [ALL] SELECT <columna1>, <columna2,...> FROM <nombre-tabla1>, <nombre-tabla2> WHERE <condicin>
ALL Si se especifica ALL, el resultado de la query no elimina las filas duplicadas, si existieran. Manual del Curso de PL/SQL 41 Primero realiza cada una de las Select escritas, generando una tabla resultado por cada una de las consultas. Luego, une las dos tablas en una. Las columnas de la tabla resultado poseen los nombres de las columnas de la primera sentencia Select que se ejecute.
SENTENCIA INSERT Aade filas a una tabla. Posee varios formatos posibles:
INSERT INTO <nombre-tabla> VALUES (<serie de valores>) El orden en el que se asignen los valores en la clusula VALUES tiene que coincidir con el orden en que se definieron las columnas en la creacin del objeto tabla, dado que los valores se asignan por posicionamiento relativo.
INSERT INTO <nombre-tabla> (<columna1>, <columna2>.....) VALUES (<valor1>, <valor2>....) En este caso los valores se asignarn a cada una de las columnas mencionadas por posicionamiento relativo, siendo necesario que por lo menos se asignen valores a todas aquellas columnas que no admiten valores nulos en la tabla.
SENTENCIA INSERT CON MLTIPLES FILAS Para insertar un subconjunto de filas de una tabla en otra se escribe una sentencia INSERT con una SUBSELECT interna. Los formatos posibles son:
INSERT INTO <nombre-tabla> (<columna1>, <columna2>.....) SELECT (<sentencia Select>) Asigna a las columnas los valores recuperados en la sentencia Select. Inserta en la tabla todas las filas que se recuperen en la Select.
INSERT INTO <nombre-tabla> SELECT * FROM <nombre-tabla-fuente> En este caso las estructuras de las tablas tienen que ser iguales. Manual del Curso de PL/SQL 42 SENTENCIA UPDATE Actualiza valores de una o ms columnas para un subconjunto de filas de una tabla.
Actualiza los campos correspondientes junto con los valores que se le asignen, en el subconjunto de filas que cumplan la condicin de seleccin. Si no se pone condicin de seleccin, la actualizacin se da en todas las filas de la tabla. Si se desea actualizar a nulos, se asignar el valor NULL.
SENTENCIA DELETE Borra una o ms filas de una tabla. La sintaxis es la siguiente: DELETE FROM <nombre-tabla> [WHERE <condicin>]
Si no se pone condicin de seleccin, borra todas las filas de la tabla.
Procesamiento de Transacciones
Existen tcnicas bsicas que permiten salvaguardar la consistencia de la base de datos de forma explcita, es decir, manejable por el usuario o programador. Las tareas o jobs que maneja Oracle son llamadas sesiones. Una sesin de usuario comienza cuando se corre un programa o se conecta a la base a travs de una herramienta. Oracle administra la concurrencia con los mecanismos de control adecuados, que garantizan que se mantenga siempre la integridad de los datos. Oracle tambin permite la habilitacin de bloqueos para controlar el acceso concurrente a los datos. Un bloqueo permite el acceso exclusivo a ciertos datos por un breve periodo de tiempo, ya sea a travs de una tabla o fila de datos. Manual del Curso de PL/SQL 43 Una transaccin es una serie de sentencias SQL de manipulacin de datos que provee una unidad lgica de trabajo. Cada sentencia SQL corresponde a una transaccin. Esta unidad es reconocida por Oracle con la finalidad de proveer la caracterstica de asegurar las transacciones efectuadas en la base de datos (commit) o deshacerlas (rollback). Si un programa falla a la mitad de una transaccin, la base de datos se recupera automticamente hasta el ltimo punto guardado. Las sentencias commit y rollback permiten asegurar que todos los cambios efectuados sobre la base de datos se guardarn permanentemente o se descartarn en forma definitiva. Todas las sentencias que se ejecutan desde la ocurrencia del ltimo commit o rollback comprenden la transaccin (o grupo de transacciones) activa. La sentencia savepoint establece un punto de procesamiento dentro de una transaccin y funciona de manera similar a un rtulo (ver captulo 3).
Uso de COMMIT La sentencia commit finaliza la transaccin actual efecta los cambios en la base de datos de forma permanente. Mientras un usuario no efecta el commit, el resto de usuarios que accesan la misma base en forma concurrente no vern los cambios que este primer usuario ha estado efectuando. Slo despus de ejecutada la sentencia todos los usuarios de la base estarn en condiciones de ver los cambios implementados por el usuario que hace el commit. Ejemplo: BEGIN
UPDATE cuenta SET bal = mi_bal debito WHERE num_cta = 7715 ;
UPDATE cuenta SET bal = mi_bal + credito WHERE num_cta = 7720 ; COMMIT WORK; END;
Manual del Curso de PL/SQL 44 La sentencia COMMIT libera todas las filas bloqueadas de la tabla cuenta. La palabra clave work no tiene otro efecto que permitir la fcil lectura de la instruccin, pero es perfectamente prescindible dentro del lenguaje. Note que la palabra end al final del cdigo indica el final del bloque, no el fin de la transaccin. Una transaccin puede abarcar ms de un bloque, como tambin dentro de un mismo bloque pueden ocurrir muchas transacciones.
Uso de ROLLBACK La sentencia rollback finaliza la transaccin actual y deshace todos los cambios realizados en la base de datos en la transaccin activa. Considrese el caso del ejemplo siguiente, donde se inserta informacin en tres tablas diferentes y se toma la precaucin de que si se trata de insertar un valor duplicado en una clave primaria, se genera un error (controlado con la sentencia rollback). Ejemplo: DECLARE emp_id integer;
BEGIN SELECT empno, INTO emp_id, FROM new_emp WHERE
INSERT INTO emp VALUES(emp_id, ); INSERT INTO tax VALUES(emp_id, ); INSERT INTO pay VALUES(emp_id, );
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK;
END; Manual del Curso de PL/SQL 45 Uso de SAVEPOINT Con la sentencia savepoint es posible nombrar y marcar un punto determinado donde se podr retornar el control luego de ejecutarse una sentencia rollback. Ejemplo: DECLARE emp_id emp.empno%TYPE; BEGIN UPDATE emp SET WHERE empno=emp_id; DELETE FROM emp WHERE
SAVEPOINT do_insert; INSERT INTO emp VALUES (emp_id, );
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK TO do_insert; END;
Es posible establecer puntos de control (savepoint) en programas recursivos. En ese caso, cada instancia de la llamada al programa mantendr sus propios puntos de control y el que se encuentre activo corresponder a la instancia del programa que se est ejecutando.
Manual del Curso de PL/SQL 46 CAPTULO 5: MANEJO DE CURSORES
Los cursores permiten manejar grupos de datos que se obtienen como resultado de una consulta SQL que retorna una o ms filas. PL/SQL utiliza dos tipos de cursores: implcitos y explcitos. Siempre declara un cursor implcito para cualquier sentencia de manipulacin de datos, incluyendo aquellas que retornan slo una fila. Sin embargo, para las queries que retornan ms de una fila, usted debe declarar un cursor explcito para ser usado en una instruccin FOR. No se pueden usar sentencias de control para cursores implcitos, como en el caso de los cursores explcitos, por lo que no se revisarn en este captulo.
Los Cursores Explcitos son aquellos que devuelven cero, una o ms filas, dependiendo de los criterios con que hayan sido construidos. Un cursor puede ser declarado en la primera seccin de un programa PL/SQL (declare). Existen tres comandos para controlar un cursor: OPEN, FETCH y CLOSE. En un principio, el cursor se inicializa con la instruccin OPEN. Enseguida, se utiliza la instruccin FETCH para recuperar la primera fila o conjunto de datos. Se puede ejecutar FETCH repetidas veces hasta que todas las filas hayan sido recuperadas. Cuando la ltima fila ya ha sido procesada, el cursor se puede liberar con la sentencia CLOSE. Es posible procesar varias queries en paralelo, declarando y abriendo mltiples cursores. Manual del Curso de PL/SQL 47 Declaracin de Cursores
Los cursores deben ser declarados antes de ser utilizados en otras sentencias. Cuando se declara un cursor, a ste se le da un nombre y se asocia con una consulta especfica usando la sintaxis siguiente: DECLARE CURSOR nombre_cursor [ (parmetro1 [, parmetro2]) ] [RETURN tipo_de_retorno] IS sentencia_select ;
Donde tipo_de_retorno debe representar a un registro o una fila en una tabla de la base y los parmetros siguen la siguiente sintaxis: nombre_del_parametro [IN] tipo_de_dato [ { := | DEFAULT} expresin ]
Por ejemplo, los cursores c1 y c2 se pueden declarar como sigue: DECLARE CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal>1000 ; CURSOR c2 RETURN dept%ROWTYPE IS SELECT * from dept WHERE deptno = 10 ;
El nombre del cursor (c1 y c2 en el ejemplo) corresponde a un identificador no declarado, no a un nombre de variable de PL/SQL. No se pueden asignar valores a un nombre de cursor ni utilizarlos en una expresin. Un cursor puede recibir parmetros, los cuales deben ser declarados con la clusula IN para formalizar su incorporacin. Los parmetros pueden ser inicializados con algn valor, pero estos pueden ser cambiados en cualquier oportunidad. El alcance de los parmetros es local al cursor, lo que significa que ellos slo pueden ser referenciados dentro de la consulta especificada en la declaracin del mismo. Estos valores son utilizados por la query cuando el cursor se abre. Manual del Curso de PL/SQL 48 Apertura de un Cursor
Al abrir un cursor se ejecuta inmediatamente la consulta e identifica el conjunto resultado, el que consiste de todas las filas que concuerdan con el criterio de seleccin de ste. Para los cursores que se abren con la clusula For Update, la sentencia de apertura del cursor adems bloquea esas filas retornadas. Un ejemplo es el siguiente: DECLARE CURSOR c1 IS SELECT ename, job FROM emp WHERE sal > 3000;
BEGIN OPEN c1;
END;
Pasaje de Parmetros Se utiliza tambin la sentencia OPEN para pasar los parmetros al cursor, en caso de que ste los requiera. Por ejemplo: DECLARE emp_name emp.name%TYPE; salary emp.sal%TYPE; CURSOR c1 (name VARCHAR2, salary NUMBER) IS SELECT
Cualquiera de estas sentencias abre el cursor: OPEN c1(emp_name, 3000); OPEN c1(John, 1500); OPEN c1(emp_name, salary);
Obsrvese que en este ejemplo, cuando se utiliza la variable salary en la declaracin se refiere al nombre del segundo parmetro del cursor. Sin embargo, cuando es usada en una sentencia OPEN se refiere a la variable del programa. Manual del Curso de PL/SQL 49 Recuperacin de Filas
La sentencia FETCH permite recuperar los conjuntos de datos de a uno a la vez. Despus de cda recuperacin y carga de un set de datos el cursor avanza a la fila siguiente. Ejemplo: FETCH c1 INTO my_empno, my_ename, my_deptno; Para cada columna retornada en un cursor y especificada en la declaracin del mismo debe existir una variable compatible en tipo en la lista INTO. Tpicamente se utiliza la sentencia FETCH dentro de un conjunto de instrucciones como el siguiente: LOOP FETCH c1 INTO mi_registro; EXIT WHEN c1%NOTFOUND; --- se procesa el registro END LOOP;
Eventualmente, la sentencia FETCH fallar, es decir, no retornar ningn conjunto de datos. Cuando esto sucede, no se gatilla una excepcin, luego se debe detectar esta condicin utilizando los atributos del cursor %FOUND y/o %NOTFOUND. Algunos atributos de los cursores se detallan a continuacin:
Uso de %FOUND Luego de que un curso ha sido abierto, pero antes de recuperar la primera fila el valor del atributo %FOUND es nulo. A continuacin, tomar el valor TRUE cada vez que obtenga una fila del set de resultados (en cada FETCH que se haga) y slo alcanzar el valor FALSE cuando ya no existan ms filas para mostrar en el set de resultados. Manual del Curso de PL/SQL 50 Ejemplo: LOOP FETCH c1 INTO IF c1%FOUND THEN -- fetch exitoso
ELSE -- fetch fall; se sale del loop EXIT; END IF; END LOOP;
Uso de %NOTFOUND Es el opuesto lgico de %FOUND. Cada vez que una sentencia FETCH retorne una fila vlida, este atributo devolver FALSO. Slo alcanzar el valor TRUE cuando no haya ms filas en un cursor y se ejecute la sentencia FETCH (sin xito por lo tanto). Ejemplo: LOOP FETCH c1 INTO EXIT WHEN c1%NOTFOUND;
END LOOP;
Uso de %ISOPEN Este atributo toma el valor verdadero (TRUE) cuando un cursor se encuentra abierto. De otra manera, retorna FALSO.
Uso de %ROWCOUNT Cuando un cursor es abierto, este atributo es seteado en 0 (cero). En adelante, cada vez que se recuperen filas exitosamente con un FETCH, este valor se ir incrementando en uno. Cuando se utiliza con cursores implcitos, este atributo devuelve el total de filas afectadas por una instruccin del tipo INSERT, UPDATE o DELETE. Manual del Curso de PL/SQL 51 Cierre de un Cursor
La sentencia que deshabilita un cursor, CLOSE, se utiliza de la siguiente manera: CLOSE c1;
Una vez que un cursor ya ha sido cerrado, es posible volverlo a abrir sin tener que declararlo otra vez. Cualquier otra operacin que se desee efectuar sobre un cursor no operativo (cerrado) provocar una excepcin del tipo invalid_cursor.
Manual del Curso de PL/SQL 52 CAPTULO 6: MANEJO DE ERRORES
En PL/SQL una advertencia o condicin de error es llamada una excepcin. Estas pueden ser definidas en forma interna (en tiempo de ejecucin de un programa) o explcitamente por el usuario. Ejemplos de excepciones definidas en forma interna son la divisin por cero y la falta de memoria en tiempo de ejecucin. Estas mismas condiciones excepcionales tienen sus nombres propios y pueden ser referenciadas con ellos: zero_divide y storage_error. Tambin se pueden definir excepciones a medida y nombrarlas de alguna forma, utilizando las reglas de construccin mencionadas en el captulo 2. Cuando ocurre un error se alcanza la excepcin, esto quiere decir que se ejecuta la porcin del programa donde sta se encuentra implementada, transfirindose el control a ese bloque de sentencias. Las excepciones definidas por el usuario deben ser alcanzadas explcitamente utilizando la sentencia raise. Con las excepciones ser pueden manejar los errores cmodamente sin necesidad de mantener mltiples chequeos por cada sentencia escrita. Tambin provee claridad en el cdigo desde el momento en que permite mantener las rutinas correspondientes al tratamiento de los errores en forma separada de la lgica del negocio.
Excepciones predefinidas
Las excepciones predefinidas no necesitan ser declaradas. Simplemente se utilizan cuando estas son gatilladas por algn error determinado. La siguiente es la lista de las excepciones predeterminadas por PL/SQL y una breve descripcin de cundo son accionadas:
Manual del Curso de PL/SQL 53 Nombre Excepcin Gatillada cuando SQLCODE
ACCESS_INTO_NULL El programa intent asignar valores a los atributos de un objeto no inicializado -6530 COLLECTION_IS_NULL El programa intent asignar valores a una tabla anidada an no inicializada -6531 CURSOR_ALREADY_OPEN El programa intent abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automticamente lo abre y ello no se debe especificar con la sentencia OPEN -6511 DUP_VAL_ON_INDEX El programa intent almacenar valores duplicados en una columna que se mantiene con restriccin de integridad de un ndice nico (unique index) -1 INVALID_CURSOR El programa intent efectuar una operacin no vlida sobre un cursor -1001 INVALID_NUMBER En una sentencia SQL, la conversin de una cadena de caracteres hacia un nmero falla cuando esa cadena no representa un nmero vlido -1722 LOGIN_DENIED El programa intent conectarse a Oracle con un nombre de usuario o password invlido -1017 NO_DATA_FOUND Una sentencia SELECT INTO no devolvi valores o el programa referenci un elemento no inicializado en una tabla indexada +100 NOT_LOGGED_ON El programa efectu una llamada a Oracle sin estar conectado -1012 PROGRAM_ERROR PL/SQL tiene un problema interno -6501 ROWTYPE_MISMATCH Los elementos de una asignacin (el valor a asignar y la variable que lo contendr) tienen tipos incompatibles. Tambin se presenta este error cuando un parmetro pasado a un subprograma no es del tipo esperado -6504 SELF_IS_NULL El parmetro SELF (el primero que es pasado a un mtodo MEMBER) es nulo -30625 STORAGE_ERROR La memoria se termin o est corrupta -6500 SUBSCRIPT_BEYOND_COUNT El programa est tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posicin ms grande que el nmero real de elementos de la coleccin -6533 SUBSCRIPT_OUTSIDE_LIMIT El programa est referenciando un elemento de un arreglo utilizando un nmero fuera del rango permitido (por -6532 Manual del Curso de PL/SQL 54 ejemplo, el elemento -1) SYS_INVALID_ROWID La conversin de una cadena de caracteres hacia un tipo rowid fall porque la cadena no representa un nmero -1410 TIMEOUT_ON_RESOURCE Se excedi el tiempo mximo de espera por un recurso en Oracle -51 TOO_MANY_ROWS Una sentencia SELECT INTO devuelve ms de una fila -1422 VALUE_ERROR Ocurri un error aritmtico, de conversin o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable ms pequea -6502 ZERO_DIVIDE El programa intent efectuar una divisin por cero -1476
Excepciones definidas por el usuario
PL/SQL permite al usuario definir sus propias excepciones, las que debern ser declaradas y gatilladas explcitamente utilizando otros comandos del lenguaje.
Declaracin Las excepciones slo pueden ser declaradas en el segmento Declare de un bloque, subprograma o paquete. Se declara una excepcin escribiendo su nombre seguida de la palabra clave EXCEPTION. Las declaraciones son similares a las de variables, pero recuerde que una excepcin es una condicin de error, no un tem de datos. Aun as, las mismas reglas de alcance aplican tanto sobre variables como sobre las excepciones. Ejemplo: DECLARE error_01 EXCEPTION;
Reglas de Alcance Una excepcin no puede ser declarada dos veces en un mismo bloque. Tal como las variables, una excepcin declarada en un bloque es local a ese bloque y global a todos los sub-bloques que comprende. Manual del Curso de PL/SQL 55 La sentencia RAISE La sentencia RAISE permite gatillar una excepcin en forma explcita. Es factible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepcin. Ejemplo: DECLARE out_of_stock EXCEPTION; -- declaracin de la excepcin total NUMBER(4); BEGIN
IF total < 1 THEN RAISE out_of_stock; -- llamado a la excepcin END IF; EXCEPTION WHEN out_of_stock THEN -- manejar el error aqu WHEN OTHERS THEN
END;
Finalmente, cabe destacar la existencia de la excepcin OTHERS, que simboliza cualquier condicin de excepcin que no ha sido declarada. Se utiliza comnmente al final del bloque de excepciones para absorber cualquier tipo de error que no ha sido previsto por el programador. En ese caso, es comn observar la sentencia ROLLBACK en el grupo de sentencias de la excepcin o alguna de las funciones SQLCODE SQLERRM, que se detallan en el prximo punto. Manual del Curso de PL/SQL 56 Uso de SQLCODE y SQLERRM
Al manejar una excepcin es posible apoyarse con las funciones predefinidas SQLCode y SQLErrm para aclarar al usuario la situacin de error acontecida. Sqlcode siempre retornar el nmero del error de Oracle y un 0 (cero) en caso exitoso al ejecutarse una sentencia SQL. Por otra parte, Sqlerrm retornar el correspondiente mensaje de error para la situacin ocurrida. Tambin es posible entregarle a la funcin SQLERRM un nmero negativo que represente un error de Oracle y sta devolver el mensaje asociado. Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones, para aclarar el significado de la excepcin OTHERS, cuando sta ocurre. Estas funciones no pueden ser utilizadas directamente en una sentencia SQL, pero s se puede asignar su valor a alguna variable de programa y luego usar esta ltima en alguna sentencia. Ejemplo: DECLARE err_num NUMBER; err_msg VARCHAR2(100); BEGIN
EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; err_msg := SUBSTR(SQLERRM, 1, 100); INSERT INTO errores VALUES(err_num, err_msg); END;
Manual del Curso de PL/SQL 57 CAPTULO 7: SUBPROGRAMAS
Los subprogramas son bloques de instrucciones de PL/SQL que pueden ser invocados por otros y recibir parmetros. En PL/SQL existen dos tipos de subprogramas: Los Procedimientos y las Funciones. Por regla general, se utiliza un procedimiento para ejecutar una accin especfica y una funcin para calcular un valor. Los subprogramas tambin constan de una seccin de declaraciones, un cuerpo que se ejecuta y una seccin opcional de manejo de excepciones. Ejemplo: PROCEDURE debit_account (acct_id INTEGER, amount REAL) IS old_balance REAL; new_balance REAL; overdrown EXCEPTION; BEGIN SELECT bal INTO old_balance FROM accts WHERE acct_no = acct_id; new_balance := old_balance amount; IF new_balance < 0 THEN RAISE overdrown; ELSE UPDATE accts SET bal = new_balance WHERE acct_no = acct_id; END IF; EXCEPTION WHEN overdrown THEN
END debit_account;
En el ejemplo, cuando el subprograma es invocado, recibe los parmetros acct_id y amount. Con el primero de ellos selecciona el valor del campo bal y lo almacena en old_balance. Luego almacena una diferencia en otra variable, new_balance, la que de ser negativa gatillar una condicin de excepcin definida por el usuario (overdrown). Manual del Curso de PL/SQL 58
Figura 7-1: Estructura de un Paquete
Ventajas de los subprogramas Los subprogramas proveen extensibilidad, es decir, permite crear nuevos programas cada vez que se necesiten, los cuales pueden ser invocados fcilmente y sus resultados utilizados de inmediato.
Tambin aportan modularidad. Esto es, permite dividir un gran programa en mdulos lgicos ms pequeos y fciles de manejar. Esto apoya el diseo de programas utilizando la metodologa top-down.
Adems, los subprogramas proveen las caractersticas de reusabilidad y mantenibilidad. Una vez construido, un subprograma puede ser utilizado en cualquier nmero de aplicaciones. Si la definicin del tema que implementa es cambiada, entonces slo se debe alterar el subprograma y no todos los lugares donde es referenciado. Finalmente, construir subprogramas agregan abstraccin, lo que implica que es preciso conocer slo qu es lo que hacen y no cmo estn implementados necesariamente. Manual del Curso de PL/SQL 59 Procedimientos
Un procedimiento es un subprograma que ejecuta una accin especifica. La sintaxis para construirlos es la siguiente:
PROCEDURE nombre [ (parmetro [, parmetro, ] ) ] IS [declaraciones_locales] BEGIN sentencias_ejecutables [EXCEPTION condiciones_de_excepcin] END [nombre] ;
Adems, cada parmetro se escribe con la siguiente notacin:
nombre_parmetro [IN | OUT [NOCOPY] | IN OUT [NOCOPY] tipo_de_dato [ { := | DEFAULT } expresin ]
En los pasajes de parmetros no se puede precisar el largo de alguno de ellos explcitamente, como en:
PROCEDURE xxx (param01 CHAR(5)) IS
Esta sentencia es invlida. Debera decir slo param01 CHAR, sin especificar el largo del carcter. Sin embargo, si es absolutamente necesario restringir el largo de una cadena como la del ejemplo, se puede corregir la situacin codificando la llamada al procedimiento xxx de la siguiente manera: Manual del Curso de PL/SQL 60 DECLARE temp CHAR(5); SUBTYPE Char5 IS temp%TYPE; PROCEDURE xxx (param01 Char5) IS
Un procedimiento posee dos partes: una especificacin y un cuerpo. La especificacin es simple, comienza con la palabra PROCEDURE y termina (en la misma lnea) con el nombre del procedimiento o la lista de parmetros (que es opcional). El cuerpo del procedimiento comienza con la palabra reservada IS y termina con END, seguido opcionalmente por el nombre del procedimiento.
Funciones
Una funcin es un subprograma que calcula un valor. La sintaxis para construir funciones es la siguiente:
FUNCTION nombre [ (parmetro [, parmetro, ] ) ] RETURN tipo_de_dato IS BEGIN sentencias_ejecutables [EXCEPTION condiciones_de_excepcin] END [nombre] ;
Y la sintaxis de los parmetros es idntica al caso de los procedimientos:
nombre_parmetro [IN | OUT [NOCOPY] | IN OUT [NOCOPY] tipo_de_dato [ { := | DEFAULT } expresin ]
Manual del Curso de PL/SQL 61 La funcin tambin posee una especificacin y un cuerpo. El segmento de especificacin comienza con la palabra FUNCTION y termina con la clusula RETURN, la cual especifica el tipo de dato retornado por la funcin. El cuerpo comienza con la palabra IS y termina con la palabra END, es decir, incluye las secciones de declaraciones, sentencias ejecutables y una parte opcional de manejo de excepciones.
Ejemplo: FUNCTION revisa_salario (salario REAL, cargo CHAR(10)) RETURN BOOLEAN IS salario_minimo REAL; salario_maximo REAL; BEGIN SELECT lowsal, highsal INTO salario_minimo, salario_maximo FROM salarios WHERE job = cargo ; RETURN (salario >= salario_minimo) AND (salario <= salario_maximo) END revisa_salario ;
Esta misma funcin de ejemplo puede ser llamada desde una sentencia PL/SQL que reciba un valor booleano, como por ejemplo, en:
DECLARE renta_actual REAL; codcargo CHAR(10); BEGIN
IF revisa_salario (renta_actual, codcargo) THEN
La funcin revisa_salario acta como una variable de tipo booleano, cuyo valor depende de los parmetros recibidos.
Manual del Curso de PL/SQL 62 La sentencia RETURN Esta sentencia termina inmediatamente la ejecucin de un programa, retornando el control al bloque de programa que lo llam. No se debe confundir con la clusula return de las funciones, que especifica el tipo de dato devuelto por ella. Un subprograma puede contener varias sentencias Return. Si se ejecuta cualquiera de ellas, el subprograma completo se termina. La sintaxis para los procedimientos es simple, slo se necesita la palabra RETURN. Sin embargo, en el caso de las funciones, esta sentencia debe contener un valor, que es aquel que se va a devolver al programa que la llam. La expresin que sigue a la sentencia puede ser tan compleja como se desee pero siempre debe respetar el tipo de datos que est definido en la cabecera (especificacin) de la funcin. Una funcin debe contener como mnimo una sentencia RETURN, de otra manera, al no encontrarla, PL/SQL generar la excepcin PROGRAM_ERROR.
Uso de Parmetros
Los subprogramas traspasan informacin utilizando parmetros. Las variables o expresiones referenciadas en la lista de parmetros de una llamada a un subprograma son llamados parmetros actuales. Las variables declaradas en la especificacin de un subprograma y utilizadas en el cuerpo son llamados parmetros formales. En este ltimo caso (para los parmetros formales) se pueden explicitar tres modos diferentes para definir la conducta de los parmetros: IN, OUT e IN OUT. Sin embargo, evite usar los tipos de parmetros OUT e IN OUT en las funciones, ya que por su naturaleza stas devuelven un slo dato y no a travs de parmetros. Es una mala prctica hacer que una funcin devuelva muchos valores; para eso utilice los procedimientos. Manual del Curso de PL/SQL 63 Parmetros de modo IN Estos parmetros son la entrada a las funciones y procedimientos y actan dentro de ellas como constantes, es decir, sus valores no pueden ser alterados dentro de un subprograma. Los parmetros actuales (que se convierten en formales dentro de un subprograma) pueden ser constantes, literales, variables inicializadas o expresiones.
Parmetros de modo OUT Un parmetro de salida (OUT) permite comunicar valores al bloque de programa que invoc al subprograma que utiliza este parmetro. Esto quiere decir adems, que es posible utilizar un parmetro de este tipo como si fuera una variable local al subprograma. En el programa que invoca la funcin o procedimiento, el parmetro de modo OUT debe ser una variable, nunca una expresin o una constante.
Parmetros de modo IN OUT Esta modalidad permite proporcionar valores iniciales a la rutina del subprograma y luego devolverlos actualizados. Al igual que el tipo anterior, un parmetro de este tipo debe corresponder siempre a una variable. Si la salida de un subprograma es exitosa, entonces PL/SQL asignar los valores que corresponda a los parmetros actuales (los que reciben los valores de los parmetros formales en la rutina que llama al subprograma). Por el contrario, si la salida del subprograma se produce con un error no manejado en alguna excepcin, PL/SQL no asignar ningn valor a los parmetros actuales.
Resumen de las caractersticas de los parmetros
IN OUT IN OUT
es el tipo por defecto debe ser especificado debe ser especificado
pasa valores a un subprograma retorna valores a quien lo llam pasa valores iniciales al subprograma y retorna un valor actualizado a quien lo llam
un parmetro formal acta parmetros formales actan parmetros formales actan Manual del Curso de PL/SQL 64 como una constante como variables como una variable inicializada
a un parmetro formal no se le puede asignar un valor a un parmetro formal debe asignrsele un valor a un parmetro formal podra asignrsele un valor
los parmetros actuales pueden ser constantes, variables inicializadas, literales o expresiones los parmetros actuales deben ser variables los parmetros actuales deben ser variables
Recursividad
La recursividad es una poderosa tcnica que simplifica el diseo de algoritmos. Bsicamente, la recursividad significa autoreferencia. Se aplica cuando un mismo algoritmo debe ser utilizado varias veces dentro de la solucin a un problema determinado, cambiando cada vez las condiciones iniciales de cada ejecucin (del algoritmo).
Un programa recursivo es aquel que se llama a si mismo. Piense en una llamada recursiva como una llamada a otro subprograma que hace lo mismo que el inicial. Cada llamada crea una nueva instancia de todos los tems declarados en el subprograma, incluyendo parmetros, variables, cursores y excepciones. Se recomienda ser muy cuidadoso con las llamadas recursivas. Entre otras cosas, existe un mximo de veces que un mismo cursor puede ser abierto y eso se define en una variable de Oracle llamada OPEN_CURSORS. Al menos alguna vez la recursividad se debe revertir, es decir, las autoreferencias deben darse un nmero finito de veces. Ejemplo: FUNCTION factorial (n POSITIVE) RETURN INTEGER IS -- devuelve n! BEGIN IF n = 1 THEN -- condicin de trmino RETURN 1 ELSE RETURN n * factorial(n 1); -- esta es la llamada recursiva END IF; Manual del Curso de PL/SQL 65 END factorial; Recursividad versus Iteracin La recursividad no es una herramienta considerada fundamental en la programacin PL/SQL. Cualquier problema que requiera su utilizacin tambin puede ser resuelto utilizando iteracin. Una versin iterativa de un programa es usualmente ms fcil de disear y de entender. Sin embargo, la versin recursiva es ms simple, pequea y ms fcil de depurar. A modo de ejemplo, observe las siguientes dos versiones de cmo calcular el nmero n-simo de la serie de Fibonacci:
-- Versin recursiva FUNCTION fib (n POSITIVE) RETURN INTEGER IS BEGIN IF (n = 1) OR (n = 2) THEN RETURN 1; ELSE RETURN fib(n 1) + fib(n 2); END IF; END fib;
-- Versin iterativa FUNCTION fib (n POSITIVE) RETURN INTEGER IS pos1 INTEGER := 1; pos2 INTEGER := 0; cum INTEGER; BEGIN IF (n = 1) OR (n = 2) THEN RETURN 1; ELSE cum := pos1 + pos2; FOR i IN 3..n LOOP pos2 := pos1; Manual del Curso de PL/SQL 66 pos1 := cum; cum := pos1 + pos2; END LOOP; RETURN cum; END IF; END fib;
La versin recursiva de la funcin fib es mucho ms elegante que la iterativa. Sin embargo, esta ltima es ms eficiente; corre ms rpido y utiliza menos memoria del computador. Si las llamadas son demasiadas se podr advertir la diferencia en eficiencia. Considere esto para futuras implementaciones de una u otra alternativa.
Polimorfismo
El polimorfismo es una caracterstica del manejo de objetos. Significa que es posible definir ms de un objeto con los mismos nombres, pero diferenciados nicamente por la cantidad o tipo de los parmetros que reciben o devuelven. En el caso de los subprogramas, es posible declarar mas de uno con el mismo nombre, pero se deber tener la precaucin de diferenciarlos en cuanto al tipo de parmetros que utilizan.
Ejemplo: PROCEDURE initialize (tab OUT DateTabTyp, n INTEGER) IS BEGIN FOR i IN 1..n LOOP tab(i) := SYSDATE; END LOOP; END initialize; Manual del Curso de PL/SQL 67 PROCEDURE initialize (tab OUT RealTabTyp, n INTEGER) IS BEGIN FOR i IN 1..n LOOP tab(i) := 0.0; END LOOP; END initialize;
Estos procedimientos slo difieren en el tipo de dato del primer parmetro. Para efectuar una llamada a cualquiera de ellos, se puede implementar lo siguiente:
DECLARE TYPE DateTabTyp IS TABLE OF DATE INDEX BY BINARY_INTEGER; TYPE RealTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER; hiredate_tab DateTabTyp; comm_tab RealTabTyp; indx BINARY_INTEGER;
BEGIN indx := 50; initialize(hiredate_tab, indx); -- llama a la primera versin initialize(comm_tab, indx); -- llama a la segunda versin ... END;
Manual del Curso de PL/SQL 68 CAPTULO 8: PAQUETES
Un paquete es un esquema u objeto que agrupa tipos de PL/SQL relacionados, tems y subprogramas. Los paquetes se constituyen de dos partes: la especificacin y el cuerpo. La especificacin es la interfaz con las aplicaciones. En ella es posible declarar los tipos, variables, constantes, excepciones, cursores y subprogramas disponibles para su uso posterior. El cuerpo define completamente a cursores y subprogramas e implementa lo que se declar inicialmente en la especificacin. Es posible depurar y modificar cuantas veces se desee el cuerpo de un paquete sin necesidad de alterar por ello la especificacin del mismo.
Ejemplo de creacin de paquetes: CREATE OR REPLACE PACKAGE emp_actions AS -- Especificacin del paquete TYPE EmpRecTyp IS RECORD (emp_id INTEGER, salary REAL); CURSOR desc_salary RETURN EmpRecTyp; PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER); PROCEDURE fire_employee(emp_id NUMBER); END emp_actions; Manual del Curso de PL/SQL 69 CREATE OR REPLACE PACKAGE BODY emp_actions AS -- Cuerpo del paquete CURSOR desc_salary RETURN EmpRecTyp IS SELECT empno, sal FROM emp ORDER BY sal DESC; PROCEDURE hire_employee ( ename VARCHAR2, job VARCHAR2, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER) IS BEGIN INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job, mgr, SYSDATE, sal, comm, deptno); END hire_employee; PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM emp WHERE empno = emp_id; END fire_employee; END emp_actions;
Ventajas de la utilizacin de Paquetes
Modularidad Los paquetes permiten encapsular tipos relacionados, tems y subprogramas en lo que se denomina un mdulo de PL/SQL. Cada paquete es diseado de manera que sea fcil de entender y con interfaces simples, claras y bien definidas. Manual del Curso de PL/SQL 70 Diseo fcil de aplicaciones Cuando se disea una aplicacin, todo lo que se necesita para comenzar es la informacin declarativa que se escribe en una especificacin de paquete. Usted puede escribirla e incluso compilarla sin la necesidad de haber creado previamente el cuerpo del mismo.
Ocultamiento de informacin Dentro de los paquetes se puede especificar que tipos, tems y subprogramas sern pblicos (visibles y accesibles) o privados (ocultos e inaccesibles). La idea fundamental es dar a conocer solamente aquellos componentes que pueden ser modificados en alguna instancia, manteniendo la integridad del paquete en todo momento.
Agregan Funcionalidad Variables y cursores que han sido empaquetados para su uso pblico persisten durante toda la duracin de la sesin. As, ellos pueden ser compartidos por todos los subprogramas que se ejecutan en el mismo ambiente. Con eso tambin se puede mantener la informacin a travs de todas las transacciones sin tener que almacenarla en la base de datos.
Rendimiento Cuando se llama a un subprograma empaquetado por primera vez, ste es almacenado completamente en memoria. De esta manera, las sucesivas llamadas a los subprogramas del mismo paquete sern ms rpidas. Tambin es posible cambiar la definicin de una funcin empaquetada sin tener que alterar los subprogramas que la llaman.
Manual del Curso de PL/SQL 71 Especificacin de Paquetes
Una especificacin de paquete contiene declaraciones pblicas. El alcance de esas declaraciones es local al esquema de base de datos y global al paquete. As, los tems declarados son accesibles desde su aplicacin y desde cualquier lugar dentro del mismo paquete. La siguiente es una declaracin de funcin que es posible encontrar en una especificacin de paquete:
FUNCTION factorial (n INTEGER) RETURN INTEGER; -- devuelve el factorial de n
Esta es toda la informacin que usted requiere para llamar posteriormente a la funcin factorial.
El contenido de un paquete puede ser referenciado de esta manera incluso desde triggers de base de datos, procedimientos almacenados y otras herramientas de Oracle.
Cuerpo de un Paquete
El cuerpo de un paquete implementa una especificacin de paquete. Contiene la definicin de cada cursor y subprograma declarado en la especificacin. Recuerde que todos los subprogramas definidos en el cuerpo de un paquete estarn accesibles solamente si han sido especificados previamente. En un cuerpo pueden encontrarse tambin declaraciones privadas (tipos y otros tems) necesarias dentro del paquete y cuyo alcance se limita tambin al cuerpo del mismo y no est disponible para ser accesado desde otros paquetes. Si en una declaracin de paquete slo se encuentran declaraciones de tipos, constantes, variables y excepciones el cuerpo del paquete se hace innecesario. Sin embargo, se reitera que cualquier definicin de cursor o subprograma debe estar implementada en el cuerpo del mismo paquete. Manual del Curso de PL/SQL 72 El paquete STANDARD Dentro de PL/SQL existe un paquete llamado standard, el cual provee el conjunto de tipos, excepciones y subprogramas que estn disponibles automticamente en el ambiente de trabajo de PL/SQL. Por ejemplo, en l se define la funcin ABS, que retorna el valor absoluto de un argumento y que se define como sigue:
FUNCTION ABS (n NUMBER) RETURN NUMBER;
El contenido del paquete standard es visible desde todas las aplicaciones y puede ser accesado incluso desde triggers y procedimientos almacenados. Si usted decidiera redeclarar la funcin ABS puede hacerlo. Sin embargo, an tendra la posibilidad de referenciar la funcin del mismo nombre que existe en el paquete standard, utilizando la notacin punto, como en: STANDARD.ABS(x)
La mayora de las funciones de conversin preconstruidas en PL/SQL son polimrficas. Por ejemplo, el paquete standard contiene las siguientes declaraciones:
FUNCTION TO_CHAR(right DATE) RETURN VARCHAR2 ; FUNCTION TO_CHAR(left NUMBER) RETURN VARCHAR2 ; FUNCTION TO_CHAR(left DATE, right VARCHAR2) RETURN VARCHAR2 ; FUNCTION TO_CHAR(left NUMBER, right VARCHAR2) RETURN VARCHAR2 ;
PL/SQL resuelve la llamada a la instancia de la funcin que corresponda observando los tipos de datos de los parmetros actuales y formales. Manual del Curso de PL/SQL 73
Manual del Curso de PL/SQL 74 TEMARIO CURSO PL/SQL
1. Conceptos de Modelamiento de Datos Objetivo: El alumno conocer los conceptos introductorios al tema de modelamiento de datos. Se revisar el modelo entidad - relacin y sus principales componentes. Tpicos: a) Las bases de datos y el modelo entidad - relacin b) Entidades c) Relaciones d) Cardinalidad
2. Introduccin Objetivo: El alumno conocer algunas caractersticas de la base de datos Oracle y del producto PL/SQL y cmo se inserta en la arquitectura de desarrollo de la base de datos. Tambin se familiarizar con la herramienta SQL Navigator, con la que se desarrollarn los contenidos prcticos del curso. Tpicos: a) Estructuras de Bloques b) Variables y Constantes c) Cursores d) Manejo de Errores e) Subprogramas f) Paquetes g) Ventajas de la utilizacin de PL/SQL Manual del Curso de PL/SQL 75 3. Fundamentos del Lenguaje Objetivo: El alumno conocer los componentes bsicos del lenguaje. Tal como en otros lenguajes de programacin, PL/SQL tiene un set de caracteres, palabras reservadas, signos de puntuacin y otras reglas fijas que el alumno deber conocer antes de empezar a trabajar con el resto de funcionalidades. Tpicos: a) Delimitadores e Identificadores b) Tipos de datos y conversiones c) Alcance y Visibilidad de las variables
4. Estructuras del Lenguaje Objetivo: Al finalizar este captulo, el alumno conocer las diferentes estructuras de control de flujo, iteracin y otras que componen este lenguaje de programacin. Tambin se incluyen nociones de la interaccin con la base de datos Oracle. Tpicos: a) Estructuras de Control b) Sentencias SQL c) Procesamiento de Transacciones
5. Uso de Cursores Objetivo: En este captulo, el alumno aprender a manejar cursores con la sintaxis de PL/SQL. Incluye la declaracin, apertura, parsing, recuperacin de datos y cierre de cursores. Tpicos: a) Declaracin y Utilizacin de cursores b) Atributos de los cursores explcitos e implcitos Manual del Curso de PL/SQL 76 6. Manejo de Errores Objetivo: Al finalizar este captulo, el alumno aprender a construir y manejar situaciones de excepcin. Se ensear a construir el bloque de excepciones de un programa construido con PL/SQL: Tpicos: a) Cmo construir excepciones b) Tipos de errores c) Variables internas de error (sqlcode, sqlerrm)
7. Subprogramas Objetivo: El alumno aprender como construir procedimientos almacenados y funciones en PL/SQL. Tambin conocer y aplicar el uso de los diferentes tipos de parmetros y llamados a rutinas externas. Tambin conocer las tcnicas de recursividad y polimorfismo. Tpicos: a) Procedimientos y Funciones b) Tipos de Parmetros c) Recursividad d) Polimorfismo
8. Paquetes Objetivo: Al finalizar el captulo, el alumno aprender la utilidad de empaquetar funciones y procedimientos. Crear Package Specification (especificacin o declaracin de paquetes) y tambin Package Body (cuerpo de los paquetes). Tpicos: a) Principales caractersticas y ventajas b) Especificacin de Paquetes c) Cuerpo de los Paquetes
Manual del Curso de PL/SQL 77 LABORATORIOS CURSO PL/SQL
Laboratorio #1
Objetivo: Al finalizar el primer laboratorio, el alumno se familiarizar con PL/SQL y el ambiente de desarrollo SQL Navigator. Manejo de variables y tipos de datos. Tambin aprender los primeros pasos en la creacin de programas.
Procedimiento: 1. Abrir el entorno de trabajo de SQL Navigator y conocer la interfaz de trabajo de este software, especficamente en el ambiente en que se desarrollan los programas con PL/SQL.
En una aplicacin que se crear durante el mismo laboratorio, se mostrarn los componentes de un programa explicados en clases. Los temas que se mostrarn en forma prctica por el mismo profesor sern los siguientes: - Creacin de un procedimiento - Creacin de una funcin - Muestra de los bloques que se pueden construir en cada programa - Cmo compilar, grabar, ejecutar un programa - Cmo crear paquetes
A continuacin se solicitar al alumno que cree un pequeo programa que realice una tarea simple sobre la base de datos de ejemplo.
2. Como requerimiento opcional, el alumno podr investigar la herramienta SQL Navigator con el fin de soltar la mano en el manejo de sta.
Fin del Laboratorio #1 Manual del Curso de PL/SQL 78 Laboratorio #2
Objetivo: Al final del segundo laboratorio, el alumno aprender a construir aplicaciones utilizando todas las estructuras de control aprendidas hasta aqu. Tambin ejercitar la construccin de sentencias SQL utilizndolas contra la base de datos de ejemplo.
Procedimiento: 1. Abrir el entorno de trabajo de SQL Navigator y crear un procedimiento que realice diferentes tareas donde sea obligatorio el uso de las sentencias de control de flujo aprendidas (condicionales e iterativas).
2. Se debern ejecutar consultas SQL contra la base de datos que efecten las tareas indicadas en el mismo momento del laboratorio por su profesor.
Fin del Laboratorio #2 Manual del Curso de PL/SQL 79 Laboratorio #3
Objetivo: En este laboratorio se efectuar un reforzamiento de todos los temas vistos en clases y se completar con la prctica del manejo de cursores.
Procedimiento: 1. Repasar las estructuras de control, bloques y dems componentes de un programa vistos en clases.
2. Se practicar con la declaracin, apertura, utilizacin (recuperacin de filas) y cierre de los cursores.
3. Se usarn los atributos de los cursores en programas creados en el mismo laboratorio.
4. De manera opcional se mostrar un programa real construido en un proyecto de DMR.
Fin del Laboratorio #3 Manual del Curso de PL/SQL 80 Laboratorio #4
Objetivo: Al final del laboratorio, el alumno habr aprendido a manejar excepciones dentro de un programa. Conocer la forma en que estas se gatillan y como manejar el error para evitar cadas fatales de los programas en tiempo de ejecucin.
Procedimiento: 1. Se provocarn de manera intencional varios errores para estudiar el comportamiento de un programa en esos casos.
2. Al final del laboratorio deber existir un programa (puede ser alguno creado en un laboratorio anterior) totalmente estable, es decir, que acepte cualquier tipo de error y lo maneje de manera adecuada.
Fin del Laboratorio #4 Manual del Curso de PL/SQL 81 Laboratorio #5
Objetivo: El alumno aprender cmo crear procedimientos y funciones y cmo comunicarlos mediante el uso de parmetros de entrada, salida y de entrada/salida.
Procedimiento: 1. El alumno crear un procedimiento nuevo que reciba cierta cantidad de parmetros.
2. Luego, crear otro procedimiento diferente que efectuar un llamado al primero y lo obligar a ejecutarse con ciertos valores en sus parmetros.
3. A continuacin se crear una funcin que ser llamada desde ambos procedimientos. Se debern probar las caractersticas de recursividad de las funciones.
4. Finalmente y en forma opcional se debern probar las caractersticas de polimorfismo de las funciones, implementando el ejemplo que aparece en el manual del curso.
Fin del Laboratorio #5 Manual del Curso de PL/SQL 82 Laboratorio #6
Objetivo: Al finalizar este laboratorio, el alumno estar en condiciones de crear especificaciones y cuerpos de paquetes.
Procedimiento: 1. El alumno crear una especificacin de paquete que comprenda todas las funciones y procedimientos creados en los laboratorios del curso. Slo se crear un package specification.
2. En el cuerpo del paquete deber copiar la definicin de todos sus subprogramas que declar en la seccin de especificacin del paquete que est creando.
Fin del Laboratorio #6 Manual del Curso de PL/SQL 83 Modelo de datos para el curso de PL/SQL
EMPLEADO Atributo Valores
Cdigo 100 101 102 103 Nombres Sergio Marco Antonio Luis Fernando Mara Cecilia Ap. Paterno Contreras Fernndez Crcamo Poblete Ap. Materno Ruiz Castro Vergara Romero Sexo M M M F Fecha Ncto. 14/Jul/1965 18/Sep/1970 15/Oct/1973 03/Ene/1971 Renta $220.000 $185.000 $350.000 $510.000 Cargo A1 A2 B1 B1 Depto. S01 S01 S02 S03
DEPARTAMENTO Atributo Valores
Cdigo S01 S02 S03 Nombre Finanzas Contabilidad Personal
CARGO Atributo Valores
Cdigo A1 A2 B1 Nombre Contador Asistente Jefe de Area Renta Mnima $200.000 $120.000 $350.000 Renta Mxima $410.000 $230.000 $500.000
Manual del Curso de PL/SQL 84 CARGAS Atributo Valores
Cdigo C1 C2 C3 C4 Nombre Claudia Marta Celia Francisco Apellidos Fernndez Lara Fernndez Lara Crcamo Vera Romero Poblete Fecha Ncto. 01/Feb/1992 09/Jul/1998 17/Feb/1988 23/Nov/1990 Cod. Empleado 101 101 102 103
Manual del Curso de PL/SQL 85 Scripts de creacin de tablas
create table EMPLEADO( id_empl number(3) not null, nomb_empl varchar2(25) not null, apepat varchar2(15) not null, apemat varchar2(15) null, sexo char(1) not null, fechanac date null, renta number(10) not null, id_cargo char(2) not null, id_depto char(3) not null, CONSTRAINT pk_empleado PRIMARY KEY (id_empl) );
create table DEPARTAMENTO( id_depto char(3) not null, nomb_depto varchar2(15) not null, CONSTRAINT pk_departamento PRIMARY KEY (id_depto) );
create table CARGO( id_cargo char(2) not null, nomb_cargo varchar2(15) not null, rentamin number(10) not null, rentamax number(10) not null, CONSTRAINT pk_cargo PRIMARY KEY (id_cargo) ); Manual del Curso de PL/SQL 86 create table CARGAS( cod_carga varchar2(3) not null, nomb_carga varchar2(20) not null, apell_carga varchar2(20) not null, fnac_carga date not null, id_empl number(3) not null, CONSTRAINT pk_cargas PRIMARY KEY (cod_carga) );
Manual del Curso de PL/SQL 87 Scripts de carga de datos en tablas