Professional Documents
Culture Documents
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
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.
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
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
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; /
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
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:
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.
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.
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.
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
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.
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>;
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
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.
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.
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>)], );
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);
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.
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