You are on page 1of 47

PL/SQL

Francisco J. Rueda 19 de julio de 2011

ndice de contenido
Introduccin.......................................................................................................... 1 SQL.......................................................................................................................2 Organizacin de las Tablas..............................................................................4 Estructura Bsica de PL/SQL...............................................................................5 Bloque Annimo............................................................................................... 6 Excepciones..................................................................................................... 6 Funciones......................................................................................................... 7 Procedimientos.................................................................................................7 Bloques Anidados.............................................................................................8 Paquetes...........................................................................................................9 Memoria: Declaracin de Tipos y Variables.......................................................12 Tipos de Datos............................................................................................... 12 Variables.........................................................................................................13 mbito.............................................................................................................14 Tipos............................................................................................................... 15 Parmetros..................................................................................................... 20 Singletons........................................................................................................... 21 Inserciones..................................................................................................... 21

Actualizaciones...............................................................................................24 Borrados.........................................................................................................25 Selecciones.................................................................................................... 25 Cursores..............................................................................................................27 Uso manual de cursores................................................................................ 27 Uso automtico de cursores...........................................................................29 Bulk Collect.....................................................................................................29 FORALL..........................................................................................................31 Tecnologa Objeto-Relacional............................................................................ 32 Orientacin a Objetos.....................................................................................33 Orientacin a Servicios...................................................................................34 Mapa de Carreteras a la Realidad................................................................. 35 Un Cambio en el Orden..................................................................................37 Tipos de Objetos............................................................................................ 38 Vistas de Objetos........................................................................................... 41 Tablas de Objetos.......................................................................................... 41 Desajuste Entre Lenguaje y Base de Datos .................................................. 42 Tipos Anidados y Colecciones....................................................................... 43 Resolucin de Problemas...................................................................................44 Pruebas Unitarias............................................................................................... 45

Documentar Programas......................................................................................46 Cuentos de Hadas..............................................................................................47

Introduccin
PL/SQL Procedural Language for SQL. Beneficios de los procedimientos almacenados:

Eliminan la latencia debida a la red, por lo que las aplicaciones son ms rpidas. Permiten que se modele el mundo real de una forma ms certera en la base de datos, al incluir en la misma el com portamiento. Proporcionan acceso a funcionalidad que no est disponible en SQL, que se limita a SELECT, INSERT, UPDATE y DELETE.

Apuntes de PL/SQL

Pgina 1

SQL
Data Definition Language (DDL) Lenguaje usado para definir la base de datos relacional. Data Manipulation Language (DML) Lenguaje usado para manipular los datos de la base de datos relacional. En la Tabla 1 se pueden ver resumidas las posibles combinaciones para crear triggers.

Apuntes de PL/SQL

Pgina 2

Evento BEFORE BEFORE BEFORE BEFORE BEFORE BEFORE AFTER AFTER AFTER AFTER AFTER AFTER INSTEAD OF INSTEAD OF INSTEAD OF INSTEAD OF INSTEAD OF INSTEAD OF

SQL DELETE DELETE INSERT INSERT UPDATE UPDATE DELETE DELETE INSERT INSERT UPDATE UPDATE DELETE DELETE INSERT INSERT UPDATE UPDATE

Nivel FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW FOR EACH ROW Nunca se debe usar PL/SQL para hacer algo que se puede hacer directamente con SQL. Por ejemplo, actualizar una tabla con valores de otra, salvo que haya alguna complejidad. Siempre ser ms lento con PL/SQL que con SQL.

Tabla 1: Combinaciones para crear triggers

Organizacin de las Tablas


Bsicamente existen tres tipos de tablas: Contenido

Apuntes de PL/SQL

Pgina 3

Datos que pueden variar substancialmente, como en una tabla de em pleados. Cdigos Datos que permanecen ms o menos fijos, como una tabla de tipos de empleados. Intersecciones Tabla muchos a muchos que guarda un histrico acerca de algo. Razn Restringen los valores a introducir en un campo Mejora Calidad

Su clave primaria suele ser un ID autogenerado, Rendimiento por lo que el dato a almacenar en la tabla relacionada es menor Se puede modificar el cdigo o la descripcin sin Mantenimiento de la aplicanecesidad de hacerlo tambin en la tabla rela- cin cionada Se puede modificar el cdigo o la descripcin al Flexibilidad vuelo Tabla 2: Importancia de las tabla de cdigos

Apuntes de PL/SQL

Pgina 4

Estructura Bsica de PL/SQL


Cada pieza de cdigo se ejecuta en un bloque, que contiene las siguientes partes: DECLARE Seccin en la que se declaran tipos, variables, funciones, etc. BEGIN Inicio de la seccin ejecutable. Todo programa PL/SQL debe tener al menos una lnea ejecutable, aunque sea slo NULL. EXCEPTION Comienzo de la seccin de manejo de excepciones. END Final del bloque. La forma de indicarle a SQL*Plus que ejecute un bloque SQL es mediante el carcter / al final del mismo, como nico carcter de la lnea.

Bloque Annimo
No se guarda en la base de datos, por lo que no tiene nombre. No se suelen usar en produccin, nada ms en desarrollo; son perfectos para crear unidades de pruebas. En el caso de este tipo de bloque, cuando SQL*Plus encuentra el carcter /, la base de datos Oracle lo compilar y lo ejecutar.

Apuntes de PL/SQL

Pgina 5

Excepciones
En caso de que no haya una seccin EXCEPTION, PL/SQL usar el gestor de excepciones por defecto para elevar la excepcin al programa ejecutante. PL/SQL posee ms de 20 excepciones con nombre predefinidas, a las que el desarrollador puede aadir las suyas propias. Dos de las ms co munes son: NO_DATA_FOUND Se produce cuando una sentencia SELECT no devuelve ninguna fila. TOO_MANY_ROWS Se produce cuando una sentencia SELECT esperaba una nica fila pero en realidad devuelve ms de una.

Funciones
Las funciones se pueden usar en cualquier sitio en el que se espere un valor: asignaciones, sentencias SQL, etc. La sintaxis DDL para crear una funcin es:

Apuntes de PL/SQL

Pgina 6

CREATE[ORREPLACE]FUNCTION[( [IN][OUT], [IN][OUT],... [IN][OUT])] RETURNIS thedeclarationsection BEGIN theexecutablesection return; EXCEPTION theexceptionhandlingsection END; /

Procedimientos
Un procedimiento es un bloque PL/SQL con nombre y que no devuelve ningn valor. La sintaxis DDL para la creacin de un procedimiento alma cenado es:

Apuntes de PL/SQL

Pgina 7

CREATE[ORREPLACE]PROCEDURE[( [IN][OUT], [IN][OUT],... [IN][OUT])]IS thedeclarationsection BEGIN theexecutablesection return; EXCEPTION theexceptionhandlingsection END; /

Bloques Anidados
Tener bloques anidados (bloques dentro de otros bloques) permite, entre otras cosas, manejar excepciones que se generen nicamente dentro de un determinado bloque. Las reglas para anidar son:

Bloquea cada sentencia SQL excepto cursores. Bloque cualquier sentencia SQL en la que se realice una conversin de datos o se mueva una cadena de texto a una variable de una longitud menor. Bloquea cualquier sentencia SQL en la que se espere el lanzamiento de una excepcin.

La importancia de los bloques anidados es que permiten identificar la razn y el lugar en el que se eleva una excepcin.

Apuntes de PL/SQL

Pgina 8

Paquetes
Un paquete organiza juntos funciones y procedimientos que estn relacionados, como una librera. Tienen dos partes: Especificacin Es la parte visible pblicamente; lista cualquier constante, funcin, procedimiento o variable que sea visible globalmente. Cuerpo El cdigo que implementa la especificacin del paquete.

Especificacin
La sintaxis DDL para crear la especificacin de un paquete es: CREATE[ORREPLACE]PACKAGEAS oneormore:constant,cursor,function,procedure,orvariable declarations END; /

En la especificacin, para cada procedimiento o funcin no hay que usar la sintaxis CREATE [OR REPLACE] PROCEDURE o CREATE [OR REPLACE] FUNCTION, sino simplemente PROCEDURE o FUNCTION. Por ejemplo:

Apuntes de PL/SQL

Pgina 9

CREATEORREPLACEPACKAGEdatesAS GC_MAXCONSTANTDATE:=To_Date('99991231235959', 'YYYYMMDDHH24MISS'); FUNCTIONEnd_Of_Day(date_inINDATE) RETURNDATE; FUNCTIONGet_Max RETURNDATE; PROCEDUREHelp; ENDdates; /

Cuerpo
Debe incluir el cdigo de cada funcin o procedimiento declarado en la correspondiente especificacin; tambin puede contener cualquier constante, cursor, funcin, procedimiento o variable que no sea accesible pblicamente pero s dentro del cuerpo del paquete. Al igual que en le caso de la especificacin, cada procedimiento o funcin se debe declarar usando la palabra PROCEDURE o FUNCTION. Por lo dems, el cuerpo de cada uno de estos es como un bloque PL/SQL normal. La sintaxis DDL para crear el cuerpo de un paquete es:

Apuntes de PL/SQL

Pgina 10

CREATE[ORREPLACE]PACKAGEBODYAS oneormore:constant,cursororvariabledeclarations oneormore:functionorprocedureimplementations [BEGIN] youcancodeaPL/SQLblockcalledaninitializationsectionthat is executedonlyonce,whenthepackageisfirstinstantiatedinto memory [EXCEPTION] youcancodeanexceptionhandlingsectionfortheinitialization section END; /

Beneficios de los Paquetes

Cualquier usuario que tenga privilegios de ejecucin sobre un paquete puede ver cualquier cosa declarada en dicho pa quete. La especificacin de un paquete reduce los casos de invalidacin de dependencias.

La invalidacin de dependencias se produce cuando se modifica una fun cin o procedimiento del que depende otra funcin o procedimiento; la f/p modificada se invalida, as como las f/p que dependen de ella, de forma que es necesario compilar todas las dependencias, adems de lo modificado. Esto no ocurre si las dependencias son entre f/p de distintos paquetes, siempre y cuando se modifique la implementacin, no la especifica cin.

Apuntes de PL/SQL

Pgina 11

Memoria: Declaracin de Tipos y Variables


Tipos de Datos
PL/SQL puede manejar cualquier tipo que uso la base de datos y algunos propios suyos, adems de alguna diferencia: VARCHAR2 Puede almacenar hasta 32,767 caracteres, mientras que el mismo tipo en la base de datos puede almacenar nada ms hasta 4,000. NUMBER PL/SQL tiene tipos numricos adicionales, como el PLS_INTEGER, que almacena un rango de -2,147,483,648 a 2,147,483,647 y para los clculos usa el hardware del ordenador en lugar de libreras, por lo que es ms rpido. DATE PL/SQL tiene tipos adicionales.

BOOLEAN Almacena FALSE y TRUE y no tiene equivalente en la base de datos.


Para los tipos adicionales y mayores referencias, ver el libro Oracles PL/SQL Users Guide and Reference.

Apuntes de PL/SQL

Pgina 12

Variables
Se deben declarar en la seccin de declaracin de un bloque PL/SQL. La nomenclatura de las variables (y en general cualquier identificador) debe seguir las siguientes reglas:

Su longitud debe ser menor a 31 caracteres. Debe comenzar con una letra. Despus de esa letra, puede haber letras, nmeros, guiones bajos o signos de nmero (#) o moneda ($).

La sintaxis DDL para declarar una variable es <variable_name> <data_type>;. Se puede usar la palabra reservada %TYPE para anclar la definicin de tipo de dato de una variable a la definicin de tipo de dato correspondiente a una columna de una tabla. Para usarlo, la sintaxis es <table_name>.<column_name>%TYPE. Usando anclas, nos aseguramos de que las variables siempre van a tener el mismo tipo de dato que la columna de la que almacenan el valor. El operador de asignacin es :=. En la seccin de declaracin se pueden realizar asignaciones de valores iniciales. Esa sera la forma normal de asignar valores a variables, pero tambin se puede hacer mediante una clausula INTO en una sentencia SELECT. Por defecto las variables no estn inicializadas, por lo que contienen el valor NULL. Dicho valor tiene las siguientes caractersticas:

No son iguales a nada, ni siquiera a otro NULL. No son menores ni mayores que nada, ni siquiera otro NULL. No significa nada conocido, ni siquiera NULL.

Apuntes de PL/SQL

Pgina 13

Por todo esto, las comparaciones directas con NULL no son buena idea; mejor usar IS NULL y IS NOT NULL.

mbito

Ilustracin 1: mbito de los elementos Tenemos las siguientes reglas para el mbito:

Cualquier elemento que est declarado en la seccin de declaracin de una funcin o procedimiento es visible nada ms en dicha funcin o procedimiento. Cualquier elemento que est declarado en la seccin de declaracin del cuerpo de un paquete es visible nada ms en cualquier otro elemento del mismo cuerpo.

Apuntes de PL/SQL

Pgina 14

Cualquier elemento que est declarado en la especificacin de un paquete es visible para cualquier funcin, procedimiento almacenado o paquete para los que el propietario del mtodo llamante tenga permisos de ejecucin.

Tipos
PL/SQL posee tres tipos de colecciones (arrays); uno de estos tipos es arrays asociativos, llamados originalmente tablas PL/SQL y que consisten en arrays unidimensionales. La declaracin de un array asociativo consta de las siguientes partes:

Declarar el nuevo tipo. Declarar una nueva variable de ese tipo.

La sintaxis es: TYPE<plsql_table_type_name>ISTABLEOF<data_type> INDEXBY[BINARY_INTEGER|VARCHAR2];

Se pueden aadir elementos en cualquier orden, no es necesario que se siga una secuencia. Se puede acceder a los elementos de la lista a travs de una iteracin, mediante los comandos FIRST y NEXT1, o bien aleatoriamente mediante los ndices (que, como se puede apreciar en la sintaxis, puede ser mediante enteros o varchar2). En la Tabla 3 se pueden ver las funciones y procedimientos para manejo de arrays asociativos. 1 Ms informacin en el libro PL/SQL Users Guide and Reference Apuntes de PL/SQL Pgina 15

Mtodo count() delete(index_in Inbinary_integer) delete() exists(index_in Inbinary_integer) first() last() prior(index_in Inbinary_integer) next(index_in Inbinary_integer)

Descripcin Nmero de elementos Elimina el elemento especificado Elimina todos los elementos Devuelve TRUE o FALSE, dependiendo de si existe el elemento Devuelve el ndice del primer elemento Devuelve el ndice del ltima elemento Devuelve el ndice del elemento anterior al especificado Devuelve el ndice del elemento despus del especificado

Tabla 3: Funciones para el acceso a arrays asociativos Una forma de recorrer arrays asociativos es mediante un bucle FOR IN LOOP: FOR<index>IN<from_index>..<through_index>LOOP PutyourPL/SQLcodetoexecuteduringtheloophere. ENDLOOP;

En el caso de arrays asociativos, <from_index> y <through_index> <plsql_table_name>.first pueden ser y <plsql_table_name>.last. Hay una forma en la que se pueden almacenar tipos compuestos en arra ys asociativos: usando la palabra reservada %ROWTYPE. Esta palabra, al igual que %TYPE, es un ancla a un tipo, en este caso un tipo compuesto Apuntes de PL/SQL Pgina 16

basado en las columnas de una tabla. La sintaxis para usarlo es <table_name>%ROWTYPE. Para hacer referencia a una columna de un registro determinado se usa la sintaxis <variable_name>.<column_name>. La palabra reservada TYPE tambin puede usarse para crear un nuevo tipo de registro. La sintaxis en este caso es: TYPE<plsql_record_type_name>ISRECORD( <field_name_1><data_type_1>, <field_name_2><data_type_2>,... <field_name_N><data_type_N>);

Por ejemplo, podemos hacer lo siguiente: TYPEname_recordISRECORD( first_nameworker_t.first_name%TYPE, middle_nameworker_t.middle_name%TYPE, last_nameworker_t.last_name%TYPE); TYPEname_tableISTABLEOFname_record INDEXBYBINARY_INTEGER;

Dado que se llama registro, en lugar de fila, lo correcto es llamar a las columnas campos; para acceder a stos, como en el caso de los arrays asociativos, se debe hacer en la forma <variable_name>.<column_name>.

Apuntes de PL/SQL

Pgina 17

Por ltimo, un truco para conseguir arrays multidimensionales es usar registros de arrays unidimensionales. Por ejemplo: DECLARE TYPEname_tableISTABLEOFworker_t.name%TYPE INDEXBYBINARY_INTEGER; TYPEname_recordISRECORD( dim2name_table); TYPEdim1ISTABLEOFname_record INDEXBYBINARY_INTEGER; t_dim1dim1; BEGIN t_dim1(1).dim2(1):='DOE,JOHN'; t_dim1(1).dim2(2):='DOE,JANE'; t_dim1(2).dim2(1):='DOUGH,JAYNE'; END; /

Parmetros
Los parmetros permiten pasar valores en ( IN), fuera de (OUT) y los dos (IN OUT), un cursor, una funcin o un procedimiento. Los parmetros se

Apuntes de PL/SQL

Pgina 18

declaran de una forma muy parecida a las variables, siendo igual las reglas para nombrarlos. La sintaxis para declararlos es <parameter_name> [IN][OUT] <data_type>. La accesibilidad de un parmetro la marca: IN Hace que el parmetro est disponible en el cursor, funcin o procedimiento; no se puede escribir. OUT Permite que la funcin o procedimiento llamante establezca el valor den tro del bloque PL/SQL; no se puede leer. IN OUT Permite ambos niveles de accesibilidad. <data_type>

Apuntes de PL/SQL

Pgina 19

Singletons
Inserciones
La sintaxis para realizar una insercin simple es: INSERTINTO<table_name>( <column_name_1>, <column_name_2>,... <column_name_N>) VALUES( <column_value_1>, <column_value_2>,... <column_value_N>);

Una buena prctica es usar siempre una lista de columnas, para mantener la validacin del cdigo en caso de que alguien aada columnas en la tabla. En cuanto a los valores de las columnas, pueden ser literales, variables, resultados de funciones o valores de columnas SQL. Hay tres opciones para tratar la posibilidad de que haya un duplicado, indicadas a continuacin de buena a mejor. Para saber el nmero de filas que devuelve una sentencia SQL se puede usar la variable sql%rowcount.

Interceptar la excepcin DUP_VAL_ON_INDEX


Al ejecutar un INSERT, lo primero que har Oracle es comprobar la existencia de duplicados en ndices y claves nicas; si lo hay, lanzar una excepcin. Esto indica que hay un duplicado al intentar la insercin, Apuntes de PL/SQL

Pgina 20

pero puede que mientras se trata la excepcin el duplicado deje de existir. Se puede intentar hacer un UPDATE dentro de la excepcin interceptada: si sql%rowcount es 1, entonces ha funcionado; si sql%rowcount es 0, entonces regresamos al punto de inicio, tratando de hacer una insercin de nuevo. Aunque esta solucin es legtima, hace que no siempre tengamos el control de la situacin. Se puede interceptar la excepcin y no hacer la actua lizacin nombrada, dejar que el programa contine insertando 0 filas.

Aunque no se use para predecir un duplicado, siempre es necesario interceptar la excepcin.

Usar cdigo PL/SQL adicional para predecirlo


Se mantiene el control de la ejecucin del programa PL/SQL. Se puede decidir condicionalmente cmo manejar los valores duplicados. Se puede usar el esquema de deteccin para obtener la clave primaria de la fila que est duplicada, para despus actualizar esa fila.

Si primero se hace un SELECT, puede que en ese momento no exista la fila pero que s exista cuando se intente hacer el INSERT, por lo que de todas formas se deber interceptar la excepcin y actuar en consecuencia.

Usar cdigo SQL adicional para predecirlo


Casi siempre la mejor opcin es dejar que SQL haga su trabajo; muchas veces un programa PL/SQL complejo se puede sustituir por una nica orden SQL.

Apuntes de PL/SQL

Pgina 21

Usando un INSERT...SELECT, con un EXISTS en la clausula WHERE, podemos hacer en una nica orden que inserte en caso de que no exista. A pesar de todo, tal y como indicaba en la seccin Interceptar la excepcin DUP_VAL_ON_INDEX, siempre debemos interceptar la excepcin, dado que puede darse que cambie el estado entre que SQL comprueba la existencia y hace efectiva la insercin. La sintaxis a usar es:

Se puede ver la orden DML MERGE, que hace lo que se ha visto, con las limitaciones de la predeteccin.

INSERTINTO<table_name>( <column_name_1>, <column_name_2>,... <column_name_N>) SELECT<column_name_or_value_1>, <column_name_or_value_2>,... <column_name_or_value_N> FROM<select_table_name_1><select_table_alias_1>, <select_table_name_2><select_table_alias_2>,... <select_table_name_N><select_table_alias_N> WHERE<where_clause>;

Actualizaciones
La sintaxis para una actualizacin simple es:

Apuntes de PL/SQL

Pgina 22

UPDATE<table_name> SET<column_name_1>=<column_value_1>, <column_name_2>=<column_value_2>,... <column_name_n>=<column_value_n> WHERE<where_clause>;

Para actualizar mltiples columnas: UPDATE<update_table_name> SET(<update_column_name_1>,<update_column_name_2>,... <update_column_name_N>)= SELECT<select_column_name_1>,<select_column_name_2>,... <select_column_name_N> FROM<select_table_name_1>, <select_table_name_2>,... <select_table_name_N> WHERE<select_column_name_3>=<update_column_name_3> AND<select_column_name_4>=<update_column_name_4> AND<select_column_name_N>=<update_column_name_N>) WHERE<update_column_name_4>=...;

Es muy importante que, para prevenir accidentes, una sentencia UPDATE lleve siempre una clausula WHERE.

Borrados
La sintaxis de un borrado es:

Apuntes de PL/SQL

Pgina 23

DELETE[FROM]<delete_table_name> WHERE<where_clause>;

Igual que en el caso de las actualizaciones, es muy importante que un bo rrado lleve siempre una clausula WHERE.

Selecciones
La sintaxis de una seleccin singleton es: SELECT<column_name_1>,<column_name_2>,...<column_name_N> INTO<plsql_variable_1>,<plsql_variable_2>,...<plsql_variable_N> FROM<table_name_1>,<table_name_2>,...<table_name_N> WHERE<where_clause>...;

Cuando una sentencia SELECT no devuelve registros, se produce una excepcin de tipo NO_DATA_FOUND. En el caso de que devuelva ms filas de las esperadas1, entonces se produce una excepcin de tipo TOO_MANY_ROWS. Igual que en el caso de las inserciones de duplicados, tambin se puede usar PL/SQL para predecir el caso de que haya demasiadas filas, aunque dada la complejidad de programacin se suele usar la excepcin.

1 Ms de una si se trata de una sentencia SELECT singleton. Apuntes de PL/SQL Pgina 24

Cursores
Cursor Sentencia SELECT con nombre, que se puede usar en un programa PL/SQL para acceder a mltiples filas de una tabla y operar sobre ellas una por una. Se declara en la seccin de declaracin de un bloque, igual que los procedimientos, funciones y variables, con parmetros si es necesario. La sintaxis es: CURSOR<cursor_name>[( <parameter_name_1>[IN]<parameter_data_type_1>, <parameter_name_2>[IN]<parameter_data_type_2>,... <parameter_name_N>[IN]<parameter_data_type_N>)]IS <select_statement>;

Uso manual de cursores


Un ejemplo de uso manual sera:

Apuntes de PL/SQL

Pgina 25

OPENc_worker('DOE'); LOOP FETCHc_workerINTOv_first_name; IFc_worker%NOTFOUNDTHEN CLOSEc_worker; EXIT; ENDIF; pl(v_first_name); ENDLOOP; Es mejor si declaramos una variable para almacenar todas las columnas que devuelva el cursor, usando para ello <nombre_cursor> %ROWTYPE.

Una de las ventajas de los cursores es que nunca elevan una excepcin de tipo NO_DATA_FOUND, por lo que se pueden usar para no ceder el control del programa cuando esto ocurre.

Apuntes de PL/SQL

Pgina 26

Uso automtico de cursores


Se puede usar la estructura CURSOR FOR LOOP para que realice de manera automtica lo que hasta ahora se realizaba de manera manual:

En el caso de singletons, el usar un cursor para acceder a FOR<record_name>IN<cursor_name>[(<cursor_parameters>)]LOOP una nica fila cuesta ms en PutyourPL/SQLtobeexecutedforeachrowhere cdigo de lo que vale. ENDLOOP;

Dado que el bucle realiza internamente la declaracin del registro, no es necesario que se haga manualmente en la seccin de declaraciones.

Bulk Collect
Cada vez que se ejecuta SQL desde un programa PL/SQL, PL/SQL debe ceder las sentencias SQL al motor SQL de Oracle. Cuando ste ha terminado, devuelve los resultados al motor de PL/SQL. Todo esto toma tiempo. Desde la versin 8 de Oracle, se puede reducir el nmero de transiciones usando el comando BULK COLLECT. En lugar de acceder a una fila cada vez desde el motor SQL, se puede acceder quiz a 100 de vez en una co leccin PL/SQL, que puede ser una tabla (o array). La sintaxis para usarlo es: FETCH<cursor_name>BULKCOLLECTINTO<plsql_table_name>LIMIT <limit>;

Apuntes de PL/SQL

Pgina 27

El lmite puede ser cualquier cantidad; nada ms hay que tener en cuenta que, cuantos ms registros, ms memoria se ocupar, por lo que se recomienda usar un lmite razonable. Adems, el uso de BULK COLLECT requiere un poco ms de programacin, por lo que hay que sopesar si merece la pena. Una buena prctica es comenzar con un CURSOR FOR LOOP y ver si se forma un cuello de botella o si las exigencias de negocio indican que necesita correr ms rpido; si es as, entonces se modifica para usar BULK COLLECT, aunque comprobando que la ganancia supere a la prdida de rendimiento causado por el mayor gasto de memoria. Si se sabe que una sentencia SELECT siempre devuelve pocas filas, se puede sustituir un cursor por un SELECT con BULK COLLECT: SELECT<column_list> BULKCOLLECT INTO<plsql_table_name> FROM<table_name> WHERE<where_clause> ORDERBY<order_by_colunmn_list>; Oracle Database 10g introduce auto bulk collect. Conviene investigarlo leyendo la Oracles PL/SQL Users Guide and Reference.

FORALL
Es lo contrario del BULK COLLECT; teniendo una coleccin de registros, como un array asociativo, se puede ejecutar la misma sentencia en masa para todos los elementos de la coleccin. El problema es que una sentencia SQL compleja puede hacer lo mismo que un FORALL, pero consumiendo menos memoria.

Apuntes de PL/SQL

Pgina 28

Tecnologa Objeto-Relacional
La precisin de un modelo del mundo real depende del uso de:

Datos actuales: Datos acerca de lo ltimo que ha ocurrido. Datos jerrquicos: Datos acerca de relaciones. Datos histricos: Mltiples ocurrencias de datos actuales. Comportamiento actual: Mtodos utilizados para cumplir la ltima accin de trabajo. Comportamiento jerrquico: Mtodos utilizados en datos jerrquicos. Comportamiento histrico: Mltiples ocurrencias de mtodos actuales.

Para tener un modelo exacto del mundo real, ste debe emplear las seis facetas de informacin. Generalmente no se usan, dado que el comporta miento se suele programar en la capa de presentacin, adems del uso de herramientas de mapeo que, aunque convenientes a la hora de pasar los datos, no generan un modelo exacto del mundo real. Por qu no se usan bases de datos objeto-relacionales, si ya se tienen desde hace un tiempo? Por lo siguiente: 1. Todo el mundo usa bases de datos relacionales, as que todo el mundo va a continuar usndolas mientras no haya una razn suficientemente convincente para moverse en una direccin diferente. 2. Ignorancia (negocio). La gente de negocio generalmente no entiende que el mundo real es una combinacin de hechos y acciones, datos y mtodos.

Apuntes de PL/SQL

Pgina 29

3. Ignorancia (tcnicos). El nivel de conciencia que los desarrolladores han logrado generalmente no incluye la tecnologa objeto-relacional.

Orientacin a Objetos
Es sobre modelar el mundo real.

Principios Clave
Encapsulacin Empaquetar juntos datos y mtodos (atributos y comportamiento) relacionados. Herencia Habilidad para reutilizar los datos y mtodos de un tipo ms abstracto. Polimorfismo Esconder diferentes comportamientos detrs de un interfaz comn.

Reutilizacin
Cada vez que se abstraen mltiples lneas de cdigo en un bloque ms grande al que llamar ms de un actor. Hay diferentes niveles: Reutilizacin a nivel de mtodo Crear un mtodo para sustituir a un cdigo que se ejecuta para realizar la misma tarea ms de una vez. En POO se debe crear en la entidad que tiene ese comportamiento. Reutilizacin a nivel de componente

Apuntes de PL/SQL

Pgina 30

Cuando se puede reutilizar una misma clase de una entidad, o en SQL un mismo tipo, ya sea mediante la aplicacin directa (composicin) o mediante herencia. Reutilizacin a nivel de aplicacin Cuando se disea un conjunto de aplicaciones de manera que usen los mismos tipos abstractos.

Orientacin a Servicios
Se construyen componentes independientes que proporcionan servicios a travs de llamadas a sus mtodos, se prueban y ya no es necesario recodificarlos de nuevo. Incluso si se trata de una base de datos relacional, se puede hacer orientada a servicios creando un paquete para cada entidad, con mtodos que pertenezcan lgicamente a los datos que estn almacenados en ella. De esta forma, no hay que recodificar el comportamiento si se cambia de lenguaje de programacin.

Mapa de Carreteras a la Realidad


Se pueden implementar cuatro niveles de orientacin a objetos en una base de datos, cada uno con una ganancia de consistencia y reutilizacin igual al nivel de implementacin.

Paquetes de Tabla
Organizar datos y mtodos de una manera relacionada, de manera que se puede emplear encapsulacin y polimorfismo.

Apuntes de PL/SQL

Pgina 31

Encapsulacin, reuniendo el comportamiento y escondindolo detrs de una llamada a mtodo pblica. Para cada tabla que ejecuta ms de una vez la misma sentencia SQL, se crea un paquete con un mtodo que ejecute esa sentencia. Despus, se aade cualquier otro mtodo para realizar clculos, concatenaciones o cualquier otro comportamiento. Polimorfismo, reconociendo los patrones de uso de los mtodos de los paquetes de tabla y utilizando el mismo nombre para un determinado patrn de uso en todos los paquetes.

Tipos Definidos por el Usuario


Crear nuevos tipos que encapsulen los datos y especificaciones de llamadas a mtodos en un nuevo tipo de objeto en la base de datos. Este nue vo tipo se crear a partir de una lista de nombres de columna de la tabla relacional y los mtodos que se especifican en la especificacin de cada paquete de tabla, junto con la palabra reservada TYPE. Al revs que en la especificacin del paquete de tabla, donde todos los mtodos son STATIC (disponibles siempre), se necesita decidir si los mtodos actuarn sobre una instancia de un objeto ( MEMBER) o estarn disponibles a travs de la definicin del tipo ( STATIC). Adems, se puede aadir un mtodo CONSTRUCTOR o definir un mtodo MAP MEMBER, para especificar cmo se ordenan los objetos. Con tipos definidos por el usuario se emplean la encapsulacin y el polimorfismo, pero adems tambin se puede emplear la herencia, al definir subtipos. Si se detecta un patrn de un nivel superior, defina un supertipo y despus herede en subtipos similares.

Apuntes de PL/SQL

Pgina 32

Vistas de Objetos
Representa los datos subyacentes de una tabla relacional como una tabla del tipo de objeto definido por el usuario. Si se usa ms de una tabla en una vista de objeto, se pueden crear triggers de tipo INSTEAD OF para actualizar satisfactoriamente los datos al ejecutar un DML contra sta. En este nivel todava se puede acceder a las tablas relacionales mediante herramientas convencionales, pero es mejor seguir hasta el siguiente nivel.

Tablas de Objetos
Los nicos elementos que deberan existir en una objectbase (base de datos objeto-relacional) son las entidades, con sus atributos y mtodos que estn en el alcance de la aplicacin en particular. Cualquier cdigo que presente la base de datos objeto-relacional (pantallas, informes, grficos, etc.) debe continuar siendo externos, mientras que los datos con sus reglas de negocio asociadas deben estar en la objectbase.

Un Cambio en el Orden
Al crear una base de datos relacional se suele seguir el siguiente orden: 1. Creacin de tablas con columnas. 2. Creacin de paquetes de tablas con mtodos. 3. Presentacin de cdigo accediendo a los datos en las tablas y los comportamientos en sus paquetes asociados.

Apuntes de PL/SQL

Pgina 33

Al construir una base de datos objeto-relacional se sigue el siguiente or den: 1. Creacin de tipos definidos por el usuario con atributos y comportamiento. 2. Creacin de tablas basadas en los tipos definidos por el usuario. 3. Presentacin del cdigo accediendo a los atributos y comportamiento de las tablas de los tipos definidos por el usuario.

Tipos de Objetos
Definen atributos de datos y los mtodos relacionados. La forma de crearlos, al igual que los paquetes, es mediante una especificacin y un cuerpo. La sintaxis para crear la especificacin de un tipo de objeto es:

Apuntes de PL/SQL

Pgina 34

CREATE[ORREPLACE]TYPE<type_name>ASOBJECT( <attribute_name_1><attribute_type_1>, <attribute_name_2><attribute_type_2>,... <attribute_name_N><attribute_type_N>, [MAP]MEMBERorSTATICFUNCTIONorPROCEDURE<method_name>[( SELF[INOUT][NOCOPY]<type_name>, <parameter_name_1>[INOUT]<parameter_type_1>, <parameter_name_2>[INOUT]<parameter_type_2>,... <parameter_name_N>[INOUT]<parameter_type_N>)] [RETURN<return_type>], CONSTRUCTORFUNCTION<type_name>( SELF[INOUT][NOCOPY]<type_name>,[ <parameter_name_1>[INOUT]<parameter_type_1>, <parameter_name_2>[INOUT]<parameter_type_2>,... <parameter_name_N>[INOUT]<parameter_type_N>)], );

Para la implementacin o cuerpo, la sintaxis es:

Apuntes de PL/SQL

Pgina 35

CREATE[ORREPLACE]TYPEBODY<type_name>AS [MAP]MEMBERorSTATICFUNCTIONorPROCEDURE<method_name>[( SELF[INOUT][NOCOPY]<type_name>, <parameter_name_1>[INOUT]<parameter_type_1>, <parameter_name_2>[INOUT]<parameter_type_2>,... <parameter_name_N>[INOUT]<parameter_type_N>),] [RETURN<return_type>], CONSTRUCTORFUNCTION<type_name>( SELF[INOUT][NOCOPY]<type_name>,[ <parameter_name_1>[INOUT]<parameter_type_1>, <parameter_name_2>[INOUT]<parameter_type_2>,... <parameter_name_N>[INOUT]<parameter_type_N>),] END;

En el caso de que el cdigo contenga dependencias con la tabla fsica, se puede resolver de dos formas:

Compilar la especificacin, crear la tabla segn esa especificacin y compilar el cuerpo. Esta es la mejor solucin en trminos de rendimiento. Usar SQL dinmicas en los mtodos estticos, de forma que no se resuelva el nombre de las tablas dependientes hasta el tiempo de ejecucin.

La forma en que se crea una nueva instancia es mediante <variable_name> := new <type_name>(<argument_1>, <argument_2>,, <argument_n>).

Apuntes de PL/SQL

Pgina 36

Vistas de Objetos
Una vista de objeto toma las columnas de una o ms tablas y las transforma en una pseudotabla de objetos definidos por el usuario, con atributos y comportamiento. La sintaxis para crear una vista de objeto es la siguiente: CREATE[ORREPLACE]VIEW<view_name>OF<type_name> WITHOBJECTIDENTIFIER(<primary_key_attributes>)AS SELECT<column_name_1>, <column_name_2>,... <column_name_N> FROM<table_name>;

Se puede ejecutar cualquier sentencia DML, adems de cualquier SELECT, como si fuese una tabla relacional, de forma que se puede usar la base de datos como si fuese relacional u orientada a objetos.

Tablas de Objetos
La sintaxis principal para crear una tabla de objeto es: CREATE TABLE <table_name> OF <type_name>;. Fuera de eso, el resto de la sintaxis es como para cualquier otra tabla. Por ejemplo:

Apuntes de PL/SQL

Pgina 37

CREATETABLEgender_otOFgender_o TABLESPACEusersPCTFREE20 STORAGE(INITIAL10KNEXT10KPCTINCREASE0); ALTERTABLEgender_otADD CONSTRAINTgender_ot_pk PRIMARYKEY(id) USINGINDEX TABLESPACEusersPCTFREE20 STORAGE(INITIAL10KNEXT10KPCTINCREASE0); ALTERTABLEgender_otADD CONSTRAINTgender_ot_uk UNIQUE(code) USINGINDEX TABLESPACEusersPCTFREE20 STORAGE(INITIAL10KNEXT10KPCTINCREASE0);

Desajuste Entre Lenguaje y Base de Datos


No debe haber mucho desajuste entre un lenguaje de programacin orientado a objetos (como Java) y una base de datos objeto-relacional; de haberlo, suele deberse a un anlisis impropio vs. la realidad del dominio del problema. Generalmente se produce cuando:

Se usan clases cajn de sastre en la capa de presentacin, que hacen fcil el mover objetos en esa capa pero no modelan en absoluto el mundo real.

Apuntes de PL/SQL

Pgina 38

Atributos desnormalizados en clases que hacen que sea fcil trabajar con ellos en la capa de presentacin pero ni siquiera representan la cardinalidad del mundo real. No se toma el suficiente tiempo para realizar un anlisis en condiciones. Las bases de datos objetivo usan un lenguaje de programacin distinto del usado en el ambiente de programacin orientado a objetos de la capa de presentacin, de forma que no se entiende el lenguaje de programacin de la base de datos, no se usa o se ignora.

Tipos Anidados y Colecciones


Se puede crear un tipo anidado, esto es, un tipo dentro de otro tipo, como un tipo DIRECCION dentro de un tipo CONTACTO; este tipo se puede implementar como tabla anidada o como array, aunque lo ltimo no es ptimo, dado que los array son de longitud fija y esto no se lleva bien con lo relacional.

Apuntes de PL/SQL

Pgina 39

Resolucin de Problemas
Mtodos de depuracin ordenados de ms antiguo a ms reciente: 1. SYS.DBMS_OUTPUT.put_line() para obtener muchos mensajes al terminar el procedimiento. 2. SYS.DBMS_PIPE para escribir utilidades para monitorizar desde una segunda sesin un procedimiento que se est ejecutando. 3. pragma autonomous transaction para escribir utilidades que desde una segunda sesin monitoricen y escriban los mensajes en una tabla. 4.

Apuntes de PL/SQL

Pgina 40

Pruebas Unitarias

Apuntes de PL/SQL

Pgina 41

Documentar Programas

Apuntes de PL/SQL

Pgina 42

Cuentos de Hadas

Apuntes de PL/SQL

Pgina 43

You might also like