Está en la página 1de 70

1 Introduccin a los objetos de Oracle

Este captulo describe las ventajas y caractersticas clave del modelo objetorelacional de Oracle. El captulo contiene los siguientes temas: Acerca de Objetos Oracle Ventajas de los Objetos Caractersticas principales del modelo objeto-relacional

Acerca de Objetos Oracle


Los objetos de Oracle son tipos definidos por el usuario, tipos que hacen posible modelar entidades del mundo real, tales como clientes y rdenes de compra, como objetos de la base de datos. Los nuevos tipos de objetos se pueden crear desde cualquier tipo de la base de datos o cualquier otro tipo de objeto creado anteriormente, referencias de objetos y tipos de coleccin. Los tipos de objetos pueden trabajar con datos complejos, tales como imgenes, audio y vdeo. Oracle almacena la base de datos de metadatos para los tipos definidos por el usuario en un esquema que est disponible para lenguajes SQL, PL / SQL, Java y otros. Los tipos de objeto-relacionales con caractersticas orientadas a objetos, tales como varrays y tablas anidadas, proporcionan un mayor nivel para organizar y acceder a los datos en la base de datos. Debajo de la capa de objetos, los datos an se almacenan en las columnas y tablas, pero se puede trabajar con los datos en trminos de las entidades del mundo real, lo que hace que los datos sean ms significativos. En lugar de pensar en trminos de las columnas y las tablas cuando se consulta la base de datos, slo tiene que seleccionar las entidades que se han creado, como clientes y pedidos. Usted puede comenzar a utilizar caractersticas orientadas a objetos y trabajar con la mayora de sus datos en modo relacional. Los tipos de objetos son tambin conocidos como tipos definidos por el usuario o TADs (tipo abstracto de Datos). El manual de Referencia del lenguaje PL / SQL en general se refiere a ellos como ADT.

Ventajas de los Objetos


En general, el modelo de tipo de objeto es similar al mecanismo de la clase que se encuentra en C + + y Java. Al igual que las clases, la reutilizacin de los objetos hace que sea posible desarrollar aplicaciones de bases de datos ms rpidas y eficientes. Al soportar de forma nativa los tipos de objeto en la base de datos, Oracle permite a los desarrolladores de aplicaciones acceder directamente a las estructuras de datos utilizadas por sus aplicaciones.

Los objetos ofrecen otras ventajas sobre un enfoque puramente relacional, tales como: Los objetos pueden encapsular operaciones, junto con los datos Objetos son eficientes Los objetos pueden representar relaciones parte-todo (uno-varios)

Los objetos pueden encapsular operaciones, junto con los datos


Las tablas de la base de datos contienen slo los datos. Los objetos pueden incluir la capacidad de realizar operaciones que puedan llevarse a cabo con esos datos. Por lo tanto, un objeto de orden de compra podra incluir un mtodo para calcular el costo de todos los artculos comprados. O un objeto de cliente podra tener mtodos para devolver el historial del cliente. Una aplicacin slo puede llamar a los mtodos para recuperar la informacin.

Objetos son eficientes


Uso de los tipos de objetos permite una mayor eficiencia:

Los tipos de objeto y sus mtodos son almacenados con los datos en la base de datos, para que estn disponibles para cualquier aplicacin a utilizar. Los desarrolladores no necesitan volver a crear las estructuras y mtodos similares en cada aplicacin. Esto tambin asegura que los desarrolladores estn utilizando normas coherentes. Usted puede obtener y manipular un conjunto de objetos relacionados como una sola unidad. Con una peticin nica en busca de un objeto desde el servidor puede recuperar otros objetos que estn conectados a l. Al hacer referencia a una columna de un tipo de objeto SQL, recuperar el objeto entero.

Los objetos pueden representar relaciones parte-todo


Los tipos de objetos le permiten representar relaciones parte-todo. Por ejemplo: en una tabla relacional para los tems de artculos, un pistn y un motor puede tener el mismo estatus. El uso de objetos puede reducir la necesidad de representar los pistones como partes de motores con esquemas complicados de varias tablas con clave primaria y relaciones de clave externa. Un objeto puede tener otros objetos como atributos, y los objetos de atributos pueden tener sus propios atributos objeto tambin. Se puede construir toda una lista de jerarqua de las piezas de esta manera entrelazando tipos de objetos.

Caractersticas principales del modelo objeto-relacional


Oracle implementa el modelo de tipo objeto como una extensin del modelo relacional, sin dejar de soportar la funcionalidad estndar de una base de

datos relacional, como las consultas, backup y recuperacin, conectividad escalable, nivel de bloqueo, consistencia, y mucho ms. SQL y varias interfaces de programacin y lenguajes, incluyendo PL / SQL, Java, Oracle Call Interface, Pro * C / C + +, OO4O, y C # se han mejorado con extensiones para soportar los objetos de Oracle. El resultado es un modelo objeto-relacional que ofrece la intuicin y la economa de una interfaz de objeto mientras que preserva el alto nivel de concurrencia y el rendimiento de una base de datos relacional.

Esta seccin contiene los siguientes temas:


Caractersticas de base de datos de objetos de Oracle Lenguaje y caractersticas de los objetos de Oracle

Caractersticas de las bases de datos de objetos de Oracle


En esta seccin se describen las caractersticas y los conceptos del modelo relacional de objetos que estn relacionados con la base de datos. Esta seccin contiene los siguientes temas: Acerca de los tipos de objetos Acerca de instancias de objetos Acerca de los mtodos de objetos Cmo se almacenan los objetos en tablas Usar los identificadores de objeto para identificar los objetos de fila Usar referencias a la fila de objetos Uso de colecciones de Oracle Uso de las vistas de objeto para acceder a los datos relacionales Utilizando la herencia de tipo Uso de Evolution tipo de cambiar un tipo de objeto existente

Acerca de los tipos de objetos Un tipo de objeto es una especie de tipo de datos. Usted puede utilizarlo de la misma manera que se utilizan los tipos de datos estndar, como NUMBER o VARCHAR2. Por ejemplo, puede especificar un tipo de objeto como el tipo de datos de una columna en una tabla relacional, y se puede declarar

variables de un tipo de objeto. El valor es una variable o una instancia de ese tipo. Una instancia de un objeto se llama tambin un objeto. A continuacin se muestra un tipo de objeto, tipo de objeto.
person_typ

, y dos instancias del

Un tipo de objeto e instancias de objeto

Los tipos de objeto sirven como modelos o plantillas que definen la estructura y el comportamiento. Los tipos de objetos son objetos del esquema de la base de datos, sujetos al mismo tipo de control administrativo como los otros objetos del esquema. El cdigo de aplicacin puede recuperar y manipular estos objetos, como veremos mas adelante. Puede utilizar la instruccin SQL
CREATE TYPE

para definir tipos de objetos.

En el ejemplo siguiente se muestra cmo crear un tipo de objeto llamado person_typ. , se define una especificacin de objeto y el cuerpo objeto. . Nota: Ejemplos: La ejecucin de muchos ejemplos de esta gua se puede ejecutar con el esquema de ejemplo HR.

Creacin del tipo de objeto person_typ

CREATE TYPE person_typ AS OBJECT ( idno NUMBER, first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details (SELF IN OUT NOCOPY person_typ)); / CREATE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; MEMBER PROCEDURE display_details (SELF IN OUT NOCOPY person_typ) IS BEGIN -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name); DBMS_OUTPUT.PUT_LINE(email || ' ' || phone); END; END; /

Los tipos de objetos son distintos de los tipos de datos estndar que son nativos de una base de datos relacional:

Oracle no proporciona tipos predefinidos de objetos. Se definen los tipos de objeto que desea mediante la combinacin de tipos incorporados con los definidos por el usuario como se muestra en el ejemplo anterior.

Los tipos de objetos se componen de atributos y mtodos. o Los atributos contienen los datos acerca de un objeto.

Los mtodos son procedimientos o funciones que pueden utilizar para realizar operaciones en los atributos del objeto. Los mtodos son opcionales. Ellos definen el comportamiento de los objetos de ese tipo.

Atributos y mtodos del objeto

Acerca de instancias de objetos Una variable de un tipo de objeto es una instancia de la clase, o un objeto. Un objeto tiene los atributos y los mtodos definidos para su tipo. Una instancia de objeto es una cosa concreta, se puede asignar valores a sus atributos y llamar a sus mtodos. En la definicin de un tipo de objeto no se asigna ningn almacenamiento. Despus de que se definan, los tipos de objetos se pueden utilizar en sentencias de SQL en la mayor parte de los mismos sitios que utilizan tipos como NUMBER o VARCHAR2. El espacio de almacenamiento se asigna una vez que se crea una instancia del tipo de objeto. Veamos cmo crear instancias de objetos de la person_typ creado anteriormente, y definir una tabla relacional para realizar un seguimiento de estos casos, los contactos.

Creacin de la tabla de contactos con una columna de tipo de objeto


CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (65, 'Verna', 'Mills', 'vmills@example.com', '1-650-555-0125'), '24 Jun 2003' );

La tabla contacts es una tabla relacional con un tipo de objeto como el tipo de datos de la columna de contact. Los objetos que ocupan las columnas de las tablas relacionales se llaman columna de objeto Acerca de los mtodos de objetos Mtodos de los objetos son funciones o procedimientos que se puede declarar en una definicin de tipo de objeto para implementar el comportamiento que desea llevar a cabo con los objetos de ese tipo. Los tipos generales de mtodos que pueden ser declaradas en una definicin de tipo son:

Mtodos de miembros El uso de mtodos miembros, puede proporcionar acceso a los datos de un objeto, y de otra manera definir las operaciones que una aplicacin realiza sobre los datos. Para realizar una operacin, la aplicacin llama al mtodo apropiado en el objeto apropiado.

Los mtodos estticos

Los mtodos estticos se utilizan para comparar instancias de objetos y realizar operaciones que no utilizan los datos del objeto particular, pero, en cambio, son globales para un tipo de objeto.

Los mtodos constructores Un mtodo constructor por defecto se define implcitamente para cada tipo de objeto, a menos que se sobrescriba con un constructor definido por el usuario. Se llama a un mtodo constructor de un tipo para construir o crear una instancia de objeto del tipo.

El ejemplo muestra el mtodo get_idno () , creado en el antes , para visualizar el nmero de identificacin de las personas en la tabla contacts:

Usando el mtodo del objeto get_idno


SELECT c.contact.get_idno() FROM contacts c;

Cmo se almacenan los objetos en las tablas Los objetos pueden ser almacenados en dos tipos de tablas:

Tablas de objetos: almacena solo objetos En una tabla de objetos, cada fila representa un objeto, que se conoce como un objeto de fila .

Tablas relacionales: almacena objetos con otros datos de la tabla Los objetos que se almacenan como columnas de una tabla relacional, se llama columna objeto . Antes hemos visto la tabla contacts en la que se almacena una instancia del objeto person_typ.

Creacin y uso de tablas de objetos

Veamos un

CREATE TABLE

que crea una tabla de objetos de

person_typ

Creacin de la tabla de objetos person_obj_table


CREATE TABLE person_obj_table OF person_typ;

Usted puede ver esta tabla de dos maneras:

Como una tabla de una sola columna, en la que cada fila es un objeto person_typ , lo que permite realizar operaciones orientadas a objetos.

Como una tabla de varias columnas, en la que cada atributo del tipo de objeto person_typ como idno , nombre apellido , apellido , y as sucesivamente, ocupa una columna, lo que le permite realizar operaciones relacionales.

operaciones en una tabla de objetos.

Operaciones en la tabla de objetos person_obj_table


INSERT INTO person_obj_table VALUES ( person_typ(101, 'John', 'Smith', 'jsmith@example.com', '1-650-5550135') ); SELECT VALUE (p) FROM person_obj_table p WHERE p.last_name = 'Smith'; DECLARE Person person_typ; BEGIN -- PL/SQL block for selecting a person and displaying details SELECT VALUE (p) INTO person FROM person_obj_table p WHERE p.idno = 101; person.display_details(); END; /

El

INSERT INTO

person_obj_table

inserta un objeto person_typ en person_obj_table , trata como una tabla de varias columnas.

La instruccin SQL SELECT selecciona person_obj_table como una tabla de una sola columna, con valor para devolver las filas que sean instancias de los objetos. El bloque de PL / SQL selecciona a una persona especfica y ejecuta una funcin miembro de person_typ para mostrar los detalles acerca de la persona indicada. Usar los identificadores de objeto para identificar los objetos de fila Los identificadores de objetos (OID) identifican de forma nica los objetos de fila en las tablas de objetos. Usted no puede acceder directamente a los identificadores de objetos, pero se puede hacer referencias ( REF ) a los identificadores de objetos y acceder directamente a la REF , como se explica en "Uso de referencias a los objetos de fila" . Hay dos tipos de objeto identificador.

Generadas por el sistema, identificadores de objeto (por defecto) Oracle crea automticamente identificadores de objetos generados por el sistema de para los objetos de fila en tablas de objetos a menos que elija la opcin basada en la clave principal.

identificadores de objetos basados en la clave primaria

Usted tiene la opcin de crear una clave primaria basada en OID cuando se crea la tabla con el CREATE TABLE. Nota: Los objetos de columna se identifican con la clave principal de la fila, y, por tanto, no es necesario un identificador de objeto especfico.

Usar referencias a la fila de objetos Un REF es un puntero lgico o referencia a un objeto de fila que se puede construir a partir de un identificador de objeto (OID). Usted puede utilizar el REF para obtener, examinar o actualizar el objeto. Puede cambiar un REF para que apunte a un objeto diferente de la jerarqua de objetos del mismo tipo o asignarle un valor nulo. es un tipo que incorpora la base de datos Oracle . Las relaciones entre REFs y las colecciones de REF , reduce la necesidad de claves externas en relaciones de 1 a n . REF proporcionan un mecanismo sencillo para navegar entre los objetos.
REF

Ejemplo 1-6 muestra un uso simple de un

REF

Ejemplo 1.6 Usando un REF con el objeto emp_person_typ


CREATE TYPE emp_person_typ AS OBJECT ( name VARCHAR2(30), manager REF emp_person_typ ); / CREATE TABLE emp_person_obj_table OF emp_person_typ; INSERT INTO emp_person_obj_table VALUES ( emp_person_typ ('John Smith', NULL)); INSERT INTO emp_person_obj_table SELECT emp_person_typ ('Bob Jones', REF(e)) FROM emp_person_obj_table e WHERE e.name = 'John Smith';

En este ejemplo se crea primero la emp_person_typ John Smith, con nulo valor para un gerente. A continuacin, se aade el emp_person_typ Bob Jones supervisado de John Smith. La siguiente consulta y su resultado se muestra el efecto:
COLUMN name FORMAT A10 COLUMN manager FORMAT A50 select * from emp_person_obj_table e;

NAME MANAGER

---------- -------------------------------------------------John Smith Bob Jones 0000220208424E801067C2EABBE040578CE70A0707424E8010 67C1EABBE040578CE70A0707

Usando SCOPE DE REF

Puede restringir un tipo de columna, elemento de la coleccin, o un atributo de tipo de objeto para hacer referencia a una tabla de objeto especificado mediante el uso de la restriccin SCOPE IS cuando se declara el REF . El SCOPE en tipos REF requieren menos espacio de almacenamiento y permitir un acceso ms eficiente que sin SCOPE en tipos REF El ejemplo muestra la columna REF contact_ref SCOPE IS person_obj_table que es una tabla de objetos de tipo person_typ .

Ejemplo 1-7 Creacin de la tabla contacts_ref Usando un REF de mbito


CREATE TABLE contacts_ref ( contact_ref REF person_typ SCOPE IS person_obj_table, contact_date DATE );

Para insertar una fila en la tabla, se puede usar el siguiente:


INSERT INTO contacts_ref SELECT REF(p), '26 Jun 2003' FROM person_obj_table p WHERE p.idno = 101;

Un REF puede estar al alcance (SCOPE) de una tabla de objetos del tipo declarado ( person_typ en el ejemplo) o de cualquier subtipo del tipo declarado. Si el REF est SCOPE de un subtipo de una tabla de objetos, la columna REF est efectivamente limitada para mantener nicamente las referencias a las instancias del subtipo (y sus subtipos, en su caso) en la tabla.
Comprobacin de REFs colgantes

Es posible que el objeto identificado por un REF deje de estar disponible si el objeto se ha eliminado o se ha eliminado algn privilegio necesario. Este es un REF colgante. Puede utilizar el comando IS DANGLING de Oracle SQL para probar esta condicin. Las REF s colgadas pueden ser evitadas mediante la definicin de restricciones de integridad referencial.
DEREFs (eliminacin de referencias)

DEREF Implicito
SELECT e.name, e.manager.name FROM emp_person_obj_table e WHERE e.name = 'Bob Jones';

En SQl se permite de esta manera, pero PL / SQL requiere la palabra


La obtencin de un REF para un objeto de fila

DEREF

Usted puede obtener una REF a un objeto de fila, seleccione el objeto de su tabla de objetos y la aplicacin del REF del operador. Ejemplo que muestra cmo obtener un REF a la persona con una idno igual a 101.

Obtencin de un REF para un objeto de fila


DECLARE person_ref REF person_typ; person person_typ; BEGIN SELECT REF(p) INTO person_ref FROM person_obj_table p WHERE p.idno = 101; select deref(person_ref) into person from dual; person.display_details(); END; /

La consulta devuelve exactamente una fila.


Al comparar las variables REF

Dos variables REF pueden ser comparadas si, y slo si, los objetos a los que referencia son del mismo tipo, o uno es un subtipo de la otro. Slo pueden ser comparados por la igualdad.

Uso de colecciones de Oracle Para modelar atributos de mltiples valores y relaciones de muchos a muchos, la base de datos Oracle es compatible con dos tipos de coleccin de datos: varrays y tablas anidadas(nested tables). Puede utilizar los tipos de coleccin como se utiliza cualquier otro tipo de datos. Usted puede tener atributos de los objetos de un tipo de coleccin, adems de columnas de un tipo de coleccin. Por ejemplo, el tipo de objeto de una orden de compra puede contener un atributo de tabla anidada que contiene la coleccin de elementos de lnea de la orden de compra.

Para definir un tipo de coleccin, utilice el

CREATE TYPE . . . AS TABLE OF

Creacin del tipo de datos de la Coleccin people_typ


CREATE TYPE people_typ AS TABLE OF person_typ; / CREATE TYPE dept_persons_typ AS OBJECT ( dept_no CHAR(5), dept_name CHAR(20), dept_mgr person_typ, dept_emps people_typ); / /

Tenga en cuenta lo siguiente acerca de este ejemplo:


El tipo de coleccin, people_typ , es especficamente un tipo de tabla anidada. El tipo de objeto dept_persons_typ tiene un atributo dept_emps de people_typ . Cada fila de la tabla anidada dept_emps es un objeto de tipo person_typ que se defini al principio del capitulo.

Uso de las vistas para acceder a los datos relacionales Una vista de objetos es una forma de acceder a los datos relacionales usando las caractersticas objeto_relacionales. Se le permite desarrollar aplicaciones orientadas a objetos sin tener que cambiar el esquema relacional subyacente. Puede acceder a los objetos que pertenecen a una vista de objetos de la misma manera que acceder a los objetos de fila en una tabla de objetos. Oracle tambin soporta vistas materializadas de objetos definidos por el usuario los tipos de datos almacenados en esquemas relacionales y tablas. Las Vistas de objetos le permiten explotar el polimorfismo que posibilita una jerarqua de tipos. Una expresin polimrfica toma un valor de tipo declarado de la expresin o de cualquiera de los subtipos del tipo. Utilizando la herencia de tipo La herencia le permite crear jerarquas de tipos. Una jerarqua de tipos es un conjunto de niveles sucesivos de los subtipos cada vez ms especializados que se derivan de un ancestro tipo de objeto comn, que se llama un supertipo. Subtipos derivadas heredan las caractersticas de los padres el tipo de objeto y se puede extender la definicin de tipo matriz. Los tipos especializados pueden agregar nuevos atributos o mtodos, o redefinir los mtodos heredados de los padres. La jerarqua de tipos resultante proporciona un mayor nivel de abstraccin para la gestin de la complejidad de un modelo de aplicacin. Por ejemplo, tipos especiales de las personas, como un tipo de

estudiante o de un tipo de estudiante a tiempo parcial con los atributos o mtodos adicionales, podra ser derivado de un tipo de persona objeto general.

La figura ilustra dos subtipos, Student_t y Employee_t , creado bajo el PartTimeStudent_t , un subtipo en Student_t .

Person_t

,y

Figura 1-3 una jerarqua de tipos

Uso de Evolucin de Tipo, cambiar un tipo de objeto existente La evolucin de tipo le permite modificar, o evolucionar, un tipo de objeto existente, incluso los ya utilizados en las tablas. Funciona a travs de la instruccin ALTER TYPE, lo que le permite propagar los cambios a travs de todas las instancias del tipo de objeto. Los ALTER TYPE comprueban las dependencias del tipo que se altera, utilizando esencialmente las mismas validaciones que un CREATE Type . Si un tipo o cualquiera de sus tipos dependientes dan error en las validaciones de tipo, el ALTER TYPE se deshace. Los metadatos para todas las tablas y columnas que utilizan un tipo de alteracin se actualizan para la definicin de tipo nuevo, as que los datos se pueden almacenar en el nuevo formato. Los datos existentes se pueden convertir en el nuevo formato ya sea de una sola vez o por partes. En cualquier caso, los datos se presentan siempre en la nueva definicin de tipo, incluso si todava est almacenado en el formato de la anterior.

2 Componentes bsicos de los objetos de Oracle

Create Type
CREATE [OR REPLACE] TYPE [ schema. ] type_name [ FORCE ] [ OID 'object_identifier' ]

[ object_type | | { IS | AS } { varray_type_def | nested_table_type_def } ];

object_type_def ::=
[ invoker_rights_clause ] { { IS | AS } OBJECT | UNDER [schema.]supertype } [ sqlj_object_type ] [ ( { attribute datatype [ sqlj_object_type_attr ] }... [, element_spec [, element_spec ]...] ) [ [NOT] { FINAL | INSTANTIABLE } ]...

sqlj_object_type ::=
EXTERNAL NAME java_ext_name LANGUAGE JAVA USING (SQLData | CustomDatum | OraData)

element_spec ::=
[ inheritance_clauses ] { subprogram_spec | constructor_spec | map_order_function_spec }... [, restrict_references_pragma ]

inheritance_clauses ::=
{ [ NOT ] { OVERRIDING | FINAL | INSTANTIABLE } }...

subprogram_spec ::=
{ MEMBER | STATIC } { procedure_spec | function_spec }

procedure_spec ::=
PROCEDURE procedure_name (parameter datatype [, parameter datatype ]...) [ { IS | AS } call_spec ]

function_spec ::=
FUNCTION name (parameter datatype [, parameter datatype ]...) return_clause

return_clause ::=
{ RETURN datatype [ { IS | AS } call_spec ]| sqlj_object_type_sig }

constructor_spec ::=
[ FINAL ] [ INSTANTIABLE ] CONSTRUCTOR FUNCTION datatype [ ([ SELF IN OUT datatype, ] parameter datatype [, parameter datatype ]... ) ] RETURN SELF AS RESULT [ { IS | AS } call_spec ]

map_order_function_spec ::=
{ MAP | ORDER } MEMBER function_spec

sqlj_object_type_sig ::=
RETURN { datatype | SELF AS RESULT } EXTERNAL { VARIABLE NAME 'java_static_field_name' | NAME 'java_method_sig' }

SQL Tipos de objetos y referencias


En esta seccin se describen los tipos de objetos SQL y las referencias, incluyendo: Objetos nulos y atributos Restricciones para las tablas de objetos Los ndices para tablas de objetos Los disparadores para tablas de objetos Reglas para las columnas y los atributos REF resolucin de nombres

Objetos nulos y atributos

Un objeto cuyo valor es NULL se llama atmicamente nulo. Un objeto atmicamente nulo es diferente de un objeto que tiene valores nulos para todos sus atributos. En un objeto con valores nulos, una columna de tabla, atributo de objeto, coleccin o coleccin de elementos podra ser nulo si se ha inicializado a NULL o no se ha inicializado en absoluto. Por lo general, un valor nulo se sustituye por un valor real ms adelante. Cuando todos los atributos son nulos, puede cambiar estos atributos y llamar a los subprogramas del objeto o mtodos. Con un objeto atmicamente nulo, no se puede hacer ninguna de estas cosas.

CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) ); / CREATE OR REPLACE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN

RETURN idno; END; MEMBER PROCEDURE display_details ( SELF IN OUT NOCOPY person_typ ) IS BEGIN -- use the PUT_LINE procedure of the DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' - ' || name || ' - ' || phone); END; END; / CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES ( person_typ (NULL, NULL, NULL), '24 Jun 2003' ); INSERT INTO contacts VALUES ( NULL, '24 Jun 2003' );

Dos casos de person_typ se insertan en la tabla y dan dos resultados diferentes. En ambos casos, la base de datos Oracle asigna espacio en la tabla contacts para una nueva fila y se establece su columna fecha para el valor dado. Pero en el primer caso, la base de datos Oracle asigna espacio para un objeto en la columna contacto y pone a cada uno de los atributos del objeto a NULL . En el segundo caso, la base de datos Oracle establece la columna person_typ a NULL y no asignar espacio para un objeto.
Restricciones para las tablas de objetos

Puede definir restricciones en una tabla de objetos del mismo modo que en otras tablas. Puede definir restricciones en el escalar de nivel hoja atributo s de un objeto de columna, con la excepcin de REF que no estn en el mbito. Los siguientes ejemplos ilustran las limitaciones que definen.
CREATE OR REPLACE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40) ); / CREATE OR REPLACE TYPE office_typ AS OBJECT ( office_id VARCHAR(10), office_loc location_typ, occupant person_typ );/ CREATE TABLE office_tab OF office_typ ( office_id PRIMARY KEY ); CREATE TABLE department_mgrs ( dept_no NUMBER PRIMARY KEY, dept_name CHAR(20), dept_mgr person_typ, dept_loc location_typ, CONSTRAINT dept_loc_cons1 UNIQUE (dept_loc.building_no, dept_loc.city), CONSTRAINT dept_loc_cons2 CHECK (dept_loc.city IS NOT NULL) );

INSERT INTO department_mgrs VALUES ( 101, 'Physical Sciences', person_typ(65,'Vrinda Mills', '1-1-650-555-0125'), location_typ(300, 'Palo Alto'));

Los ndices para tablas de objetos

Se pueden definir ndices en una tabla de objetos o en la tabla de almacenamiento para una columna o atributo de tabla anidada del mismo modo que en otras tablas. Para un ejemplo de un ndice en una tabla anidada, vea
CREATE TABLE students ( graduation DATE, math_majors people_typ, -- nested tables (empty) chem_majors people_typ, physics_majors people_typ) NESTED TABLE math_majors STORE AS math_majors_nt -- storage tables NESTED TABLE chem_majors STORE AS chem_majors_nt NESTED TABLE physics_majors STORE AS physics_majors_nt; CREATE INDEX math_idno_idx ON math_majors_nt(idno); CREATE INDEX chem_idno_idx ON chem_majors_nt(idno); CREATE INDEX physics_idno_idx ON physics_majors_nt(idno); INSERT INTO students (graduation) VALUES ('01-JUN-03'); UPDATE students SET math_majors = people_typ (person_typ(12, 'Bob Jones', '650-555-0130'), person_typ(31, 'Sarah Chen', '415-555-0120'), person_typ(45, 'Chris Woods', '415-555-0124')), chem_majors = people_typ (person_typ(51, 'Joe Lane', '650-555-0140'), person_typ(31, 'Sarah Chen', '415-555-0120'), person_typ(52, 'Kim Patel', '650-555-0135')), physics_majors = people_typ (person_typ(12, 'Bob Jones', '650-555-0130'), person_typ(45, 'Chris Woods', '415-555-0124')) WHERE graduation = '01-JUN-03'; SELECT m.idno math_id, c.idno chem_id, p.idno physics_id FROM students s, TABLE(s.math_majors) m, TABLE(s.chem_majors) c, TABLE(s.physics_majors) p;

Se pueden definir los ndices de nivel hoja escalar atributo s de objetos de columna, como se muestra en el Ejemplo. Slo se pueden definir ndices en atributos o columnas ref si el REF est en el mbito (SCOPE) . Este ejemplo, los ndices city, que es un atributo escalar de nivel de hoja del objeto de columna dept_addr .
CREATE OR REPLACE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40) ); /

CREATE TABLE department_loc ( dept_no NUMBER PRIMARY KEY, dept_name CHAR(20), dept_addr location_typ ); CREATE INDEX i_dept_addr1

ON

department_loc (dept_addr.city);

INSERT INTO department_loc VALUES ( 101, 'Physical Sciences', location_typ(300, 'Palo Alto')); INSERT INTO department_loc VALUES ( 104, 'Life Sciences', location_typ(400, 'Menlo Park')); INSERT INTO department_loc VALUES ( 103, 'Biological Sciences', location_typ(500, 'Redwood Shores'));

Siempre que sea base de datos Oracle espera un nombre de columna en una definicin de ndice, tambin se puede especificar un atributo escalar de un objeto de columna. Los disparadores para tablas de objetos

Se pueden definir disparadores de una tabla de objetos del mismo modo que en otras tablas. No se puede definir un disparador en la tabla de almacenamiento de una columna o atributo de tabla anidada. No se puede modificar valores LOB en un cuerpo de disparador. Por otra parte, no hay restricciones especiales sobre el uso de disparadores con tipos de objetos.
CREATE OR REPLACE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40) ); / CREATE OR REPLACE TYPE office_typ AS OBJECT ( office_id VARCHAR(10), office_loc location_typ, occupant person_typ );/ CREATE TABLE office_tab OF office_typ ( office_id PRIMARY KEY );

CREATE TABLE movement ( idno NUMBER, old_office location_typ, new_office location_typ );

CREATE TRIGGER trigger1 BEFORE UPDATE OF office_loc ON office_tab FOR EACH ROW WHEN (new.office_loc.city = 'Redwood Shores') BEGIN IF :new.office_loc.building_no = 600 THEN INSERT INTO movement (idno, old_office, new_office) VALUES (:old.occupant.idno, :old.office_loc, :new.office_loc); END IF; END;/ INSERT INTO office_tab VALUES ('BE32', location_typ(300, 'Palo Alto' ),person_typ(280, 'John Chan', '415-555-0101')); UPDATE office_tab set office_loc =location_typ(600, 'Redwood Shores')

where office_id = 'BE32'; select * from office_tab; select * from movement;

Reglas para las columnas y los atributos REF

En la base de datos Oracle, una columna o atributo REF puede ser restringida o limitada mediante una clusula SCOPE o una clusula de restriccin de referencia. Cuando una columna REF no tiene restricciones, se pueden almacenar referencias a objetos a la fila de objetos contenidos en cualquier tabla de objetos del tipo de objeto correspondiente. Oracle no garantiza que las referencias a objetos almacenados en estas columnas apunten a objetos de fila vlidos y existentes. Por lo tanto, las columnas REF puede contener referencias a objetos que no apuntan a ningn objeto fila existente. Tales valores REF se conocen como referencias colgadas. Una restriccin SCOPE se puede aplicar a una tabla de objeto especfico. Todos los valores REF almacenados en una columna con una restriccin SCOPE apuntaran a objetos de fila de la tabla especificada en la clusula SCOPE. Una columna REF puede verse limitada con una restriccin REFERENTIAL similar a la especificacin de las claves ajenas. Las reglas para las restricciones de referencia aplicables a dichas columnas. Es decir, la referencia de los objetos almacenados en estas columnas debe apuntar a un objeto de fila vlido y existente en la tabla de objeto especificado. La restriccin PRIMARY KEY no se puede especificar para columnas REF. Sin embargo, se puede especificar NOT NULL para las columnas de este tipo.
Resolucin de nombres

El uso de un alias de tabla es opcional al hacer referencia a los atributos de nivel superior de una tabla de objetos directamente, sin utilizar la notacin de punto. Por ejemplo, las siguientes afirmaciones define dos tablas que contienen el tipo de objeto person_typ. person_obj_table es una tabla de objetos de objetos de tipo person_typ y contactos es una tabla relacional que contiene una columna del objeto person_typ . Las siguientes consultas muestran algunas formas correctas e incorrectas a atributo de referencia idno : #1
SELECT idno FROM person_obj_table; --Correcto

#2 SELECT contact.idno FROM contacts; --Ilegal

#3 SELECT contacts.contact.idno FROM contacts; --Ilegal #4 SELECT p.contact.idno FROM contacts p; --Correcto

En # 1, idno es el nombre de una columna de person_obj_table . Hace referencia a este atributo de alto nivel directamente, sin utilizar la notacin de puntos, por lo que no se requiere alias de la tabla. En la # 2, idno es el nombre de un atributo de la person_typ objeto en la columna denominada contacto .Esta referencia se utiliza la notacin de puntos y por ello requiere un alias de tabla, como se muestra en # 4. # 3 utiliza el mismo nombre de la tabla para calificar la referencia. Esto es incorrecto, se necesita un alias de tabla.

Mtodos del objeto


Mtodos de los objetos, tambin conocidos como los subprogramas, son funciones o procedimientos que se puede declarar en una definicin de tipo de objeto para implementar el comportamiento que desea que los objetos de ese tipo para llevar a cabo. Los subprogramas pueden ser escritas en PL / SQL o prcticamente cualquier otro tipo de lenguaje de programacin. Mtodos escritos en PL / SQL o Java se almacenan en la base de datos. Los mtodos escritos en otros idiomas, tales como C, se almacenan de forma externa. Nota: EN SQL se requiere parntesis para todas las llamadas de subprogramas, incluso los que no tienen argumentos. Esto no es cierto para PL / SQL.

Las siguientes consultas muestran algunas formas correctas e incorrectas a atributo de referencia idno : #1
SELECT idno FROM person_obj_table; --Correcto

#2 SELECT contact.idno FROM contacts; --Ilegal #3 SELECT contacts.contact.idno FROM contacts; --Ilegal #4 SELECT p.contact.idno FROM contacts p; --Correcto

En # 1, idno es el nombre de una columna de person_obj_table . Hace referencia a este atributo de alto nivel directamente, sin utilizar la notacin de puntos, por lo que no se requiere alias de la tabla. En la # 2, idno es el nombre de un atributo del objeto person_typ en la columna denominada contact .Esta referencia se utiliza la notacin de puntos y por ello requiere un alias de tabla, como se muestra en # 4. # 3 utiliza el mismo nombre de la tabla para calificar la referencia. Esto es incorrecto, se necesita un alias de tabla.

Mtodos del objeto


Mtodos de los objetos, tambin conocidos como los subprogramas, son funciones o procedimientos que se puede declarar en una definicin de tipo de objeto para implementar el comportamiento que desea que los objetos de ese tipo para llevar a cabo. Los subprogramas pueden ser escritas en PL / SQL o prcticamente cualquier otro tipo de lenguaje de programacin. Mtodos escritos en PL / SQL o Java se almacenan en la base de datos. Los mtodos escritos en otros idiomas, tales como C, se almacenan de forma externa. Nota: EN SQL se requiere parntesis para todas las llamadas de subprogramas, incluso los que no tienen argumentos. Esto no es cierto para PL / SQL. Esta seccin describe los mtodos siguientes: Mtodos de miembros Los mtodos estticos Los mtodos constructores Metodos Externos

Mtodos de miembros

Mtodos de miembros prevn una aplicacin con acceso a los datos de una instancia del objeto. Se define un mtodo miembro en el tipo de objeto para cada operacin que usted desea que se lleve a cabo con una instancia de un objeto de ese tipo. Los mtodos miembros no son mtodos de comparacin se declaran, ya sea como MEMBER FUNCTION o MEMBER PROCEDURE. Los mtodos de comparacin son MAP MEMBER FUNCTION o ORDER MEMBER FUNCTION como se describe en "Mtodos de miembros para comparar objetos" . Como ejemplo de un mtodo miembro, usted puede declarar una funcin get_sum () que resume el costo total de las partidas de una orden de compra. La siguiente lnea de cdigo llama a esta funcin de la orden de compra po y devuelve el importe en sum_line_items .
sum_line_items: = po.get_sum ();

Notacin punto especifica el objeto actual y el mtodo de la llama. Los parntesis son obligatorios, aunque no hay parmetros.
Parmetros SELF en los mtodos miembros

Los mtodos miembros tienen un parmetro integrado llamada SELF que denota la instancia del objeto de la instancia en la invocacin al mtodo. puede ser declarado explcitamente, pero que no es necesario. Es ms sencillo que escribir mtodos Miembros que hacer referencia a los atributos y los mtodos de SELF implcito sin el calificador SELF . En Ejemplo , el cdigo y los comentarios demuestran llamadas a mtodos que utilizan una parmetro SELF implcito en lugar de calificar los atributos HGT , len , y wth .
SELF CREATE OR REPLACE TYPE solid_typ AS OBJECT ( len INTEGER, wth INTEGER, hgt INTEGER, MEMBER FUNCTION surface RETURN INTEGER, MEMBER FUNCTION volume RETURN INTEGER, MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) ); / CREATE OR REPLACE TYPE BODY solid_typ AS MEMBER FUNCTION volume RETURN INTEGER IS BEGIN RETURN len * wth * hgt; -- RETURN SELF.len * SELF.wth * SELF.hgt; -- equivalent to previous line END; MEMBER FUNCTION surface RETURN INTEGER IS BEGIN -- not necessary to include SELF in following line RETURN 2 * (len * wth + len * hgt + wth * hgt); END; MEMBER PROCEDURE display (SELF IN OUT NOCOPY solid_typ) IS BEGIN DBMS_OUTPUT.PUT_LINE('Length: ' || len || ' - ' || 'Width: ' || wth || ' - ' || 'Height: ' || hgt); DBMS_OUTPUT.PUT_LINE('Volume: ' || volume || ' - ' || 'Surface area: '

|| surface); END; END; / CREATE TABLE solids of solid_typ; INSERT INTO solids VALUES(10, 10, 10); INSERT INTO solids VALUES(3, 4, 5); SELECT * FROM solids; SELECT s.volume(), s.surface() FROM solids s WHERE s.len = 10; DECLARE solid solid_typ; BEGIN -- PL/SQL block for selecting a solid and displaying details SELECT VALUE(s) INTO solid FROM solids s WHERE s.len = 10; solid.display(); END; / SELF

es siempre el primer parmetro pasado al mtodo. En las funciones miembro, si SELF no se declara, los valores predeterminados de parmetros son de modo IN . En los procedimientos de miembros, si SELF no se declara, a sus valores predeterminados de parmetros de modo a IN OUT . El comportamiento por defecto no incluye el NOCOPY como informacin al compilador.

Mtodos de miembros para comparar objetos

Para comparar y ordenar las variables de un tipo de objeto, se debe especificar una base para la comparacin .Los valores de un tipo de datos escalar, como CHAR o Real tienen un orden predefinido, lo que les permite ser comparado. Pero un tipo de objeto, tal como un person_typ , que puede tener varios atributos de varios tipos de datos, no tiene una base predefinida de comparacin. Usted tiene la opcin de definir un mtodo de MAP o mtodo ORDER para comparar objetos, pero no ambos.
Mtodo Map

Un mtodo MAP devuelve valores que pueden ser utilizados para comparar y clasificar. Los valores de retorno puede ser cualquier tipo de dato Oracle (excepto los LOB y BFILE ) y ANSI SQL, tales como tipos Carcter o REAL. En general, los mtodos MAP realizan clculos con los atributos del objeto para producir el valor de retorno. Los Metodos MAP se llaman de forma automtica para evaluar este tipo de comparaciones como obj_1 > obj_2 y las comparaciones que implica el DISTINCT , group by , unin , y ORDEr By clusulas que requieren la clasificacin por filas. Si obj_1 y obj_2 son dos variables de objeto que pueden ser comparadas con un mtodo map map(), la comparacin:

obj_1> obj_2

es equivalente a:
obj_1.map ()> obj_2.map ()

Las comparaciones son similares para los otros operadores relacionales. En el ejemplo siguiente se define un mtodo MAP rea() que proporciona una base para comparar los objetos rectngulo por su rea:
CREATE OR REPLACE TYPE rectangle_typ AS OBJECT ( len NUMBER, wid NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER); / CREATE OR REPLACE TYPE BODY rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area; END;

/
DECLARE po rectangle_typ; BEGIN po :=NEW rectangle_typ(10,5); DBMS_OUTPUT.PUT_LINE('AREA:' || po.area()); -- prints AREA:50 END;

Mtodos ORDER

Son mtodos para comparar uno a uno los objetos . A diferencia de los mtodos del mapa, no puede determinar el orden de un nmero de objetos. Simplemente dice que el objeto actual es menor, igual o mayor que el objeto con el que est siendo comparado, basadose en un criterio utilizado. Un mtodo orden es una funcin de un objeto ( SELF ), con un parmetro declarado que es un objeto del mismo tipo. El mtodo debe devolver un nmero negativo, cero o un nmero positivo. Este valor significa que el objeto (el implcito declarado como parmetro SELF) es menor que, igual a, o mayor que el objeto parmetro declarado. Al igual que con los mtodos MAP, un mtodo ORDER, si se ha definido, se llama automticamente cada vez que dos objetos de ese tipo deben ser comparados.

Los mtodos ORDER son tiles cuando la semntica de comparacin puede ser demasiado complejo como para utilizar un mtodo MAP.

DROP TYPE location_typ FORCE; -- above necessary if you have previously created object CREATE OR REPLACE TYPE location_typ AS OBJECT ( building_no NUMBER, city VARCHAR2(40), ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER );/ CREATE OR REPLACE TYPE BODY location_typ AS ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS BEGIN IF building_no < l.building_no THEN RETURN -1; -- any negative number will do ELSIF building_no > l.building_no THEN RETURN 1; -- any positive number will do ELSE RETURN 0; END IF; END; END;/ -- invoking match method DECLARE loc location_typ; secloc location_typ; a number; BEGIN loc :=NEW location_typ(300, 'San Francisco'); secloc :=NEW location_typ(200, 'Redwood Shores'); a := loc.match(secloc); DBMS_OUTPUT.PUT_LINE('order (1 is greater, -1 is lesser):' ||a); -- prints order:1 END; /

Nota: Slo en un tipo que no se deriva de otro tipo se puede declarar un mtodo ORDER, en un subtipo no se puede definir.
Directrices para los mtodos de comparacin

Se puede declarar un mtodo MAP o un mtodo ORDER, pero no los dos . Para cualquier tipo de mtodo, se puede comparar objetos con sentencias SQL y PL / SQL. Sin embargo, si usted no declara uno de estos mtodos, slo se puede comparar objetos en sentencias SQL, y slo por la igualdad o por desigualdad. Dos objetos del mismo tipo se consideran iguales si los valores de sus atributos son iguales.

Al ordenar un gran nmero de objetos, utilice un mtodo MAP, que asigne todos los objetos a valores escalares, y a continuacin, ordena los escalares. Un mtodo ORDER es menos eficiente, ya que debe ser llamado en varias ocasiones (se puede comparar solamente dos objetos a la vez). Consulte "Realizacin de comparaciones de objetos" .

Mtodos de comparacin en jerarquas de tipo En una jerarqua de tipos, si el tipo de raz (supertipo) no especifica un MAP o un mtodo ORDER, tampoco los subtipos.

El mtodo MAP en una jerarqua de tipos Si el tipo de raz especifica un mtodo MAP, cualquiera de sus subtipos puede sustituirlo. Si el tipo de raz no se especifica un mtodo MAP, no se puede especificar en un subtipo.

Mtodo ORDER en una jerarqua de tipos Slo el tipo de raz puede definir un mtodo ORDER. Si el tipo de raz no se define uno, en sus subtipos no se puede aadir uno.

Los mtodos estticos

Los mtodos estticos se invocan en el tipo de objeto no en sus instancias. Se utiliza un mtodo esttico para las operaciones que son globales para el tipo y no es necesario hacer referencia a los datos de una instancia de objeto en particular. Un mtodo esttico no tiene parmetro SELF. Los mtodos estticos se declaran utilizando
STATIC FUNCTION

STATIC PROCEDURE.

Para invocar a un mtodo esttico mediante el uso de la notacin de puntos para calificar la llamada al mtodo con el nombre del tipo de objeto, por ejemplo:
type_name.method ()

Ver "mtodos estticos" para obtener informacin sobre las consideraciones de diseo.
Ejemplo:
CREATE TYPE atype AS OBJECT(

a1 NUMBER, STATIC PROCEDURE newa ( p1 NUMBER, tabname VARCHAR2, schname VARCHAR2)); / CREATE TYPE BODY atype AS STATIC PROCEDURE newa (p1 NUMBER, tabname VARCHAR2, schname VARCHAR2) IS sqlstmt VARCHAR2(100); BEGIN sqlstmt := 'INSERT INTO '||schname||'.'||tabname|| ' VALUES (atype(:1))'; EXECUTE IMMEDIATE sqlstmt USING p1; END; END; / CREATE TABLE atab OF atype; BEGIN atype.newa(1, 'atab', 'HR'); END; /

Los mtodos constructores


Un mtodo constructor es una funcin que devuelve una nueva instancia del tipo definido por el usuario y establece los valores de sus atributos. Los mtodos constructores estn bien definidos por el sistema o definidas por el usuario. Para llamar a un constructor, se usa la palabra clave Ejemplo1:
DECLARE po rectangle_typ; BEGIN po :=NEW rectangle_typ(10,5); DBMS_OUTPUT.PUT_LINE('AREA:' || po.area()); -- prints AREA:50 END; NEW,

pero no es necesario.

Ejemplo2:
DECLARE emp employee_typ; BEGIN INSERT INTO employee_tab VALUES (employee_typ(310, 'Evers', 'Boston', 'EBOSTON', '617.555.0100', '01-AUG-04', 'SA_REP', 9000, .15, 101, 110, address_typ('123 Main', 'San Francisco', 'CA', '94111')) ); INSERT INTO employee_tab VALUES (employee_typ(320, 'Martha', 'Dunn', 'MDUNN', '650.555.0150', '30-SEP-04', 'AC_MGR', 12500, 0, 101, 110, address_typ('123 Broadway', 'Redwood City', 'CA', '94065')) ); END; / SELECT VALUE(e) from employee_tab e;

Constructores Definidos por el sistema Por defecto, el sistema define implcitamente una funcin constructor para todos los tipos de objetos que tienen atributos. Este constructor es a veces conocido como el constructor de valor del atributo. Para el person_typ tipo de objeto definido anteriormente el nombre del mtodo constructor es el nombre del tipo de objeto, como se muestra en la siguiente invocacin:
person_typ (1, 'John Smith', '1 -650-555-0135 '),

Constructores definidos por el usuario Tambin se pueden definir funciones constructoras propias para crear e inicializar los tipos definidos por el usuario. El valor predeterminado constructores definidos por el sistema (o los constructores de valores de atributos) son fciles de usar porque ya existen, pero los constructores definidos por el usuario tienen algunas ventajas importantes con respecto al tipo evolucin.

CREATE TYPE person_type AS OBJECT (name VARCHAR(30), ssn NUMBER(9)) not final; CREATE TYPE employee_type UNDER person_type (empid NUMBER(5), -- User-defined constructor that looks like an attribute-value constructor CONSTRUCTOR FUNCTION employee_type (name VARCHAR2, ssn NUMBER, empid NUMBER) RETURN SELF AS RESULT); CREATE TYPE BODY employee_type AS CONSTRUCTOR FUNCTION employee_type (name VARCHAR2, ssn NUMBER, empid NUMBER) RETURN SELF AS RESULT AS --User-defined constructor makes sure that the name attribute is uppercase. BEGIN SELF.name := UPPER(name); SELF.ssn := ssn; SELF.empid := empid; RETURN;

END; CREATE TABLE personnel (deptno NUMBER(3), deptname VARCHAR(30), employee employee_type);

Invocacin literal de un mtodo constructor Una invocacin literal de un mtodo constructor es una llamada al mtodo constructor en el que los argumentos son o literales (a diferencia de las bind variables), o las invocaciones ms literales de los mtodos constructores. Por ejemplo:
CREATE TABLE people_tab OF person_typ; INSERT INTO people_tab VALUES ( person_typ(101, 'John Smith', '1-650-555-0135') );

Mtodos externos implementados


Usted puede utilizar PL / SQL para invocar subprogramas externos que se han escrito en otros lenguajes. Esto proporciona acceso a los puntos fuertes y las capacidades de esos lenguajes.

La herencia en Tipos de objetos de SQL


La herencia de objetos de SQL se basa en un rbol genealgico de los tipos de objetos que forman una jerarqua de tipos. La jerarqua de tipo se compone de un tipo objeto primario, llamado un supertipo, y uno o ms niveles de tipos de objetos hijo, llamado subtipos, que se derivan de la matriz. La herencia es el mecanismo que conecta subtipos en una jerarqua de sus supertipos. Los subtipos heredan automticamente los atributos y los mtodos de su tipo primario. Adems, el enlace de la herencia sigue viva. Los subtipos adquieren automticamente los cambios realizados en estos atributos o mtodos en los padres: los atributos o mtodos actualizados en un supertipo se actualizan en los subtipos tambin. Nota: Oracle slo admite herencia nica. Por lo tanto, un subtipo puede derivar directamente de slo un supertipo, no ms de uno. Con los tipos de objetos en una jerarqua de tipos, puede modelar una entidad como un cliente, y tambin definir diferentes subtipos especializados del tipo cliente original. A continuacin, puede realizar operaciones en una jerarqua y hacer que cada tipo implemente y ejecute la operacin de una manera diferente. Los temas descritos en esta seccin son los siguientes: Supertipos y subtipos Definicin de tipos Final NOT Final y Mtodos La creacin de subtipos Declarar Tipos y mtodos NOT INSTANTIABLE La sobrecarga y sobre escritura los mtodos DISPATCH mtodo dinmico Sustituyendo Tipos en una jerarqua de tipos La sustitucin de columna y fila El almacenamiento de los subtipos creados recientemente en las columnas sustituibles Eliminar subtipos despus de crear columnas sustituibles Desactivacin de sustitucin en una nueva tabla Restringir sustitucin Modificacin de sustitucin Restricciones a la Modificacin de la sustitucin Las asignaciones entre tipos

Supertipos y subtipos
Un subtipo puede derivarse de un supertipo ya sea directamente o indirectamente a travs de los niveles intermedios de otros subtipos. Un

supertipo puede tener varios subtipos hermanos, pero un subtipo puede tener como mximo un supertipo primario directo (herencia simple).

supertipos y subtipos de jerarqua de tipos

Para obtener un subtipo de un supertipo, definir una variante especializada del supertipo que aade nuevos atributos y los mtodos para el conjunto heredado de los padres o redefinir (override) los mtodos heredados. Por ejemplo, a partir de un tipo de objeto person_typ que pudiera derivarse tipos especializados student_typ y employee_typ .Cada uno de estos subtipos es todava una person_typ , pero un tipo especial de persona. Lo que distingue a un subtipo de su supertipo los padres es un cambio hecho a los atributos o los mtodos que el subtipo recibido de su padre. A menos que un subtipo redefina un mtodo heredado, siempre contiene el mismo conjunto de atributos y mtodos que estn en el tipo primario, adems de los atributos y los mtodos que se aade. Si un tipo de objeto person_typ tiene los tres atributos idno , los name y phone y el mtodo get_idno () , entonces cualquier tipo de objeto que se deriva de person_typ tendr estos mismos tres atributos y un mtodo get_idno () . Si la definicin de person_typ cambia, tambin lo hacen las definiciones de los subtipos. Los subtipos se crean usando la palabra clave
CREATE TYPE student_typ UNDER person_typ UNDER

de la siguiente manera:

Ver tambin:
CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL; / CREATE TYPE BODY student_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN (self AS person_typ).show || ' -- Major: ' || major; END;

END; /

Usted puede especializar los atributos o mtodos de un subtipo de las siguientes maneras:

Aadir nuevos atributos que su supertipo padre no tienen. Por ejemplo, es posible que se especializan student_typ como un tipo especial de person_typ mediante la adicin de un atributo major. Un subtipo no se puede eliminar o cambiar el tipo de un atributo heredado de su padre, sino que slo se pueden agregar nuevos atributos.

Aadir mtodos totalmente nuevos que el padre no tiene.

Cambiar la aplicacin de algunos de los mtodos que un subtipo hereda de manera que la versin del subtipo ejecuta el cdigo diferente de la de los padres. Por ejemplo, un objeto elipse puede definir un mtodo calculate() . Dos subtipos de ellipse_typ ,circle_typ y sphere_typ , pueden cada uno de implementar este mtodo en una forma diferente.

La relacin de herencia entre un supertipo y sus subtipos es la fuente de gran parte del poder de los objetos y gran parte de su complejidad. Ser capaz de cambiar un mtodo en un supertipo, y que los cambios surtan efecto en todos los subtipos de aguas abajo con slo volver a compilar es muy poderoso. Sin embargo, esta misma capacidad significa que usted tiene que considerar si desea o no permitir que un tipo sea especializado y un mtodo sea redefinido. Del mismo modo, para una tabla o columna para que sea capaz de contener cualquier tipo en una jerarqua es tambin de gran alcance, pero usted debe decidir si desea o no permitir este caso particular. Adems, es posible que necesite restringir las sentencias DML y consultas a fin de seleccionar la gama de tipos que desee en la jerarqua de tipos.

Definicin de tipos Final NOT Final y Mtodos


Para que un tipo de objeto pueda ser heredable, la definicin del tipo de objeto se debe especificar que es heredable. Entonces se pueden derivar subtipos de el. Para que un mtodo, pueda ser o no sobreescrito tambin se debe especificar, se utilizan las palabras clave FINAL o NOT FINAL tanto para tipos como para mtodos.

Para un tipo FINAL , (por defecto) significa que no se pueden derivar de el subtipos. NOT FINAL se pueden derivar subtipos. Para un mtodo, FINAL significa que los subtipos no pueden reescribir el mtodo. NO FINAL (por defecto) significa que usted puede rescribir el mtodo del supertipo.

Creacin del tipo de objeto person_typ que es NO FINAL


DROP TYPE person_typ FORCE; -- above necessary if you have previously created object CREATE OR REPLACE idno name phone NOT FINAL; / TYPE person_typ AS OBJECT ( NUMBER, VARCHAR2(30), VARCHAR2(20))

Creacin de un tipo de objeto que es no final, con una funcin miembro FINAL
DROP TYPE person_typ FORCE; -- above necessary if you have previously created object CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), FINAL MAP MEMBER FUNCTION get_idno RETURN NUMBER) NOT FINAL;

Usted puede cambiar un tipo final a un tipo no final y viceversa con un ALTER TYPE . Por ejemplo:
ALTER TYPE person_typ FINAL ;

Slo se puede modificar un tipo de tiene subtipos.

NO FINAL

FINAL

si el tipo de destino no

La creacin de subtipos
Se crea un subtipo con un CREATE TYPE que especifica el padre inmediato del subtipo con la palabra clave UNDER. Creacin de un objeto padre, o supertipo . Tenga en cuenta el show() . En los ejemplos que siguen en el subtipo, la funcin show() del tipo del padre es reescrito con las especificaciones para cada subtipo con la palabra clave OVERRIDING .

Creacin del Padre o del objeto supertipo person_typ


DROP TYPE person_typ FORCE; -- if created

CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL; / CREATE OR REPLACE TYPE BODY person_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN idno; END; -- function that can be overriden by subtypes MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN 'Id: ' || TO_CHAR(idno) || ', Name: ' || name; END; END; /

Creacin de un objeto Subtipo

Un subtipo hereda lo siguiente:


Todos los atributos declarados en o heredados por el supertipo. Todos los mtodos declarados en o heredados por supertipo.

Creacin de un subtipo student_typ utilizando la clusula UNDER


CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL; / CREATE TYPE BODY student_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN (self AS person_typ).show || ' -- Major: ' || major ; END; END; /

La declaracin que define student_typ especializa person_typ mediante la adicin de dos nuevos atributos, dept_id y major y sobreescribe el mtodo show. Los nuevos atributos declarados en un subtipo deben tener nombres que son diferentes de los nombres de los atributos o mtodos declarados en cualquiera de sus subtipos, ms arriba en la jerarqua de tipos.

Invocacin Generalizada

Invocacin generalizada proporciona un mecanismo para invocar un mtodo de un supertipo o un tipo de matriz, en lugar del mtodo miembro del subtipo especfico.
(SELF AS person_typ).show

El mtodo student_typ show llama al mtodo person_typ show para realizar las acciones comunes y luego hace su propia accin especfica, que es aadir 'Mayor: " al valor devuelto por el mtodo person_type.show . De esta manera, el el mtodo del subtipo puede llamar a los mtodos correspondientes del tipo del padre para realizar las acciones comunes antes de hacer sus propias acciones especficas. Los mtodos se invocan al igual que los mtodos miembros normales, excepto que el nombre del tipo despus del AS debe ser el nombre del tipo del tipo del padre del tipo que evalua la expresin. En el ejemplo , hay un argumento self al igual que el argumento implcito de una invocacin miembro de mtodo normal. En este caso, se invoca el mtodo person_typ show en lugar del metodo especfico student_typ.show.

Uso Invocacin generalizada


DECLARE myvar student_typ := student_typ(100, 'Sam', '6505556666', 100, 'Math'); name VARCHAR2(100); BEGIN name := (myvar AS person_typ).show; --Generalized invocation END;

Expresin generalizada, como invocacin de mtodo, tambin se admite invocar un mtodo con un argumento explicito.

Uso de expresin generalizada


DECLARE myvar2 student_typ := student_typ(101, 'Sam', '6505556666', 100, 'Math'); name2 VARCHAR2(100); BEGIN name2 := person_typ.show((myvar2 AS person_typ)); -- Generalized expression END;

se utilizan parntesis dobles en este ejemplo porque ((MiVar2 AS person_typ)) es una expresin que deben ser resuelta como parmetro de la funcin show. Nota:
Los mtodos constructores no pueden ser invocados utilizando esta sintaxis. Adems, el nombre del tipo que aparece despus de AS en esta sintaxis debe ser uno de los tipos matrices del tipo de la expresin para que el mtodo se invoque.

Esta sintaxis slo se puede utilizar para invocar los mtodos miembros correspondientes de los tipos padre.
Varios subtipos

Un tipo puede tener varios subtipos, y estos subtipos tambin pueden tener subtipos.

Creacin de un subtipo employee_typ utilizando la clusula UNDER


DROP TYPE employee_typ FORCE; -- if previously created CREATE OR REPLACE TYPE employee_typ UNDER person_typ ( emp_id NUMBER, mgr VARCHAR2(30), OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); / CREATE OR REPLACE TYPE BODY employee_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN (SELF AS person_typ).show|| ' -- Employee Id: ' || TO_CHAR(emp_id) || ', Manager: ' || mgr ; END; END; /

Un subtipo puede ser definido en virtud de otro subtipo. Una vez ms, el nuevo subtipo hereda todos los atributos y los mtodos que este tipo tiene, tanto declarados como heredados. Ejemplo define un nuevo subtipo part_time_student_typ de student_typ creado en el Ejemplo anterior . El nuevo subtipo hereda todos los atributos y los mtodos de student_typ y agrega otro atributo, number_hours .

Creacin de un subtipo part_time_student_typ utilizando la clusula UNDER


CREATE TYPE part_time_student_typ UNDER student_typ ( number_hours NUMBER, OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2); / CREATE TYPE BODY part_time_student_typ AS OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN RETURN (SELF AS person_typ).show|| ' -- Major: ' || major || ', Hours: ' || TO_CHAR (number_hours); END; END; /

Creacin de una tabla que contiene los objetos supertipo y subtipo

Puede crear una tabla que contiene instancias de supertipo y subtipo y rellenar la tabla como se muestra con la tabla person_obj_table en el Ejemplo :

Insercin de valores en filas sustituibles de una tabla de objetos


CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', '650-555-0130')); INSERT INTO person_obj_table VALUES (student_typ(51, 'Joe Lane', '1-650-555-0140', 12, 'HISTORY')); INSERT INTO person_obj_table VALUES (employee_typ(55, 'Jane Smith', '1-650-555-0144', 100, 'Jennifer Nelson')); INSERT INTO person_obj_table VALUES (part_time_student_typ(52, 'Kim Patel', '1-650-555-0135', 14, 'PHYSICS', 20));

Usted puede llamar a la funcin tabla con la siguiente:

show()

para el supertipo y los subtipos de la

SELECT p.show() FROM person_obj_table p;

La salida es similar a:

Id: Id: Id: Id:

12, 51, 55, 52,

Name: Name: Name: Name:

Bob Jones Joe Lane -- Major: HISTORY Jane Smith -- Employee Id: 100, Manager: Jennifer Nelson Kim Patel -- Major: PHYSICS, Hours: 20

Tenga en cuenta que los datos que muestra el mtodo show() depende de si el objeto es un supertipo o subtipo, y si el mtodo show() del subtipo se invalida. Por ejemplo, Bob Jones es un person_typ , es decir, un supertipo. Slo se muestran su name y si id . Para Joe Lane, un student_typ el mtodo show () ,proporciona su name y la id , y su major pues el mtodo show () esta sobreescrito por la funcin del subtipo.
Declarar Tipos y mtodos NO instanciable

Tipos y mtodos pueden ser declarados

NOT INSTANTIABLE

NOT INSTANTIABLE

cuando se crean.

Type

Si un tipo no es instanciable, no puede crear instancias de ese tipo. No hay constructores (por defecto o definidos por el usuario) para ello. Puede utilizar este tipo con la intencin de servir nicamente como supertipos especializados de los que se crean subtipos.

NOT INSTANTIABLE

Mtodos

Un mtodo no instanciable sirve como un marcador de posicin. Se declara pero no se implementa en el tipo. Es posible definir un mtodo no instanciable cuando se espera que cada subtipo reemplace el mtodo de una manera diferente. En este caso, no hay una definicin del mtodo en el supertipo. Un tipo que contiene un mtodo no instanciable tiene que ser declarado no instanciable, como se muestra en el Ejemplo.

Creacin de un tipo de objeto que no se pueden crear instancias


DROP TYPE person_typ FORCE; -- if previously created CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20), NOT INSTANTIABLE MEMBER FUNCTION get_idno RETURN NUMBER) NOT INSTANTIABLE NOT FINAL;/

Si un subtipo no proporciona una implementacin para todos los mtodos no instanciables, el mismo subtipo, al igual que el supertipo, se declarar no instanciable. Un subtipo no instanciable se puede definir bajo un supertipo instanciable. Se puede modificar un tipo de viceversa con un ALTER Type
INSTANTIABLE

a un tipo

NOT INSTANTIABLE

La alteracin de un tipo de objeto de crear instancias


CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20)) NOT INSTANTIABLE NOT FINAL;/ ALTER TYPE person_typ INSTANTIABLE;

Se puede modificar un tipo de instanciable a un tipo no instanciable slo si el tipo no tiene columnas, vistas, tablas, o instancias que hacen referencia a ese tipo, ya sea directa o indirectamente a travs de otro tipo o subtipo. No se puede declarar un tipo todos modos.
NOT INSTANTIABLE

como

FINAL,

que sera intil de

La sobrecarga y remplazar los mtodos

Un subtipo puede redefinir los mtodos que hereda, y tambin puede aadir nuevos mtodos, incluidos los mtodos con el mismo nombre.
CREATE TYPE shape AS OBJECT ( name VARCHAR2(30), area NUMBER, CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2) RETURN SELF AS RESULT,

CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, area NUMBER) RETURN SELF AS RESULT ) NOT FINAL; / CREATE TYPE BODY shape AS CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2) RETURN SELF AS RESULT IS BEGIN SELF.name := name; SELF.area := 0; RETURN; END; CONSTRUCTOR FUNCTION shape(SELF IN OUT NOCOPY shape, name VARCHAR2, area NUMBER) RETURN SELF AS RESULT IS BEGIN SELF.name := name; SELF.area := area; RETURN; END; END; /

.
Mtodos de sobrecarga

A la adicin de nuevos mtodos que tienen los mismos nombres que los mtodos heredados con el subtipo se llama sobrecarga. Cuando existen en el mismo tipo definido por el usuario, los mtodos que tienen el mismo nombre, pero firmas diferentes se llaman sobrecargas. Una firma del mtodo consiste en el nombre del mtodo y el nmero, tipo, y el orden de los parmetros formales del mtodo, incluido el parmetro SELF implicito. La sobrecarga es til cuando se desea proporcionar una variedad de maneras de hacer algo. Por ejemplo, un objeto elipse puede sobrecargar un mtodo clculo() con otro mtodo clculo() para permitir el clculo de una forma diferente. El compilador utiliza las firmas de los mtodos para determinar qu mtodo va a llamar cuando un tipo tiene varios mtodos sobrecargados. En el siguiente pseudocdigo, subtipo de calculate() :
circle_typ

crea una sobrecarga

CREATE TYPE ellipse_typ AS OBJECT (..., MEMBER PROCEDURE calculate(x NUMBER, x NUMBER), ) NOT FINAL; CREATE TYPE circle_typ UNDER ellipse_typ (..., MEMBER PROCEDURE calculate(x NUMBER), ...);

El circle_typ contiene dos versiones de calculate() . Una de ellas es la versin heredada con dos parmetros NUMBER y el otro es el mtodo de nueva creacin con un parmetro NUMBER.
Anulacin y ocultacin de mtodos

Redefinir un mtodo heredado para personalizar su comportamiento en un subtipo se llama anular, en el caso de los mtodos miembros, u ocultar, en el caso de los mtodos estticos. A diferencia de la sobrecarga, no se crea un nuevo mtodo, slo redefinir una existente, utilizando la palabra clave OVERRIDING . Anulacin y ocultacin redefinen un mtodo heredado para que haga algo diferente en el subtipo. Por ejemplo, un subtipo circle_typ derivado de un ellipse_typ supertipo podra reemplazar un mtodo miembro calcular () para personalizar especficamente para el clculo del rea de un crculo. Anulacin y ocultacin son similares en que, en cualquier caso, la versin del mtodo redefinido en el subtipo eclipsa a la versin original del mismo nombre y la firma para que la nueva versin se ejecuta en lugar de la original siempre que sea una instancia de subtipo invoca el mtodo . Si el mismo subtipo tiene subtipos, estos heredan el mtodo redefinido en lugar de la versin original. Con overriding, el sistema se basa en la informacin contenida en el tipo de argumento del mtodo miembro implcitamente y elige dinmicamente la versin correcta del mtodo a ejecutar. Con la anulacin, la versin correcta se identifica en tiempo de compilacin. . Para anular u ocultar un mtodo, debe preservar su firma. Las sobrecargas de un mtodo tienen el mismo nombre, por lo que el compilador utiliza la firma del mtodo del subtipo para identificar la versin especial en el supertipo que es reemplazado. Se indica la sobreescritura con la palabra clave OVERRIDING en el CREATE TYPE BODY. Esto no es necesario cuando un subtipo esconde un mtodo esttico. En el siguiente pseudocdigo, EL subtipo seala que est anulando el mtodo CALCULATE() :

CREATE TYPE ellipse_typ AS OBJECT (..., MEMBER PROCEDURE calculate(), FINAL MEMBER FUNCTION function_mytype(x NUMBER)... ) NOT FINAL; CREATE TYPE circle_typ UNDER ellipse_typ (..., OVERRIDING MEMBER PROCEDURE calculate(),

...);

Restricciones a los mtodos Overriding

Los siguientes son restricciones a los mtodos overriding:


Slo los mtodos que no son declarados como final en el supertipo puede ser overriding. Mtodos Order pueden aparecer slo en el tipo raz de una jerarqua de tipos: y no pueden ser redefinidos (overriding) en los subtipos. Un mtodo esttico en un subtipo no puede redefinir un mtodo miembro del supertipo. Un mtodo de miembro de un subtipo no puede redefinir un mtodo esttico en el supertipo. Si un mtodo que va a ser overriding provee valores por defecto de los parmetros, el mtodo principal debe proporcionar los mismos valores por defecto para los mismos parmetros.

Distribucion mtodo dinmico

La distribucin del mtodo dinmico se refiere a la forma en que las llamadas a mtodos se envan a la aplicacin en tiempo de ejecucin, su funcionamiento en la jerarqua de tipos desde el tipo especifico o el tipo actual. Esta funcin slo est disponible cuando se reescriben mtodos miembros y no se aplica a los mtodos estticos. Con el reemplazo de mtodos, en una jerarqua de tipos se pueden definir mltiples implementaciones del mismo mtodo. En la siguiente jerarqua de tipos ellipse_typ , circle_typ y sphere_typ , cada tipo puede definir un mtodo calculate()diferente.

Figura 2.2 Jerarqua de los tipos de

Cuando uno de estos mtodos se invoca, el tipo de la instancia del objeto que invoca determina que la aplicacin del mtodo a utilizar. La llamada se enva a la aplicacin para su ejecucin. Este proceso de seleccin de una implementacin del mtodo se llama mtodo virtual o dinmico, ya que el envo se realiza en tiempo de ejecucin, no en tiempo de compilacin.

La llamada al mtodo funciona para arriba en la jerarqua de tipos: nunca hacia abajo. Si la llamada invoca un mtodo miembro de una instancia de objeto, el tipo de esa instancia es el tipo en curso, y la aplicacin definida o heredada por ese tipo la que se usa. Si en la llamada invoca un mtodo esttico de un tipo, se utiliza la implementacin definida o heredada por ese tipo especificado.
Sustituyendo tipos en una jerarqua de tipos

Cuando se trabaja con tipos en una jerarqua de tipos, a veces es necesario trabajar a nivel ms general, por ejemplo, para seleccionar o actualizar todas las personas. Pero en otras ocasiones, es necesario seleccionar o actualizar slo un subtipo especfico, como un estudiante, o slo a las personas que no son estudiantes. La capacidad (polimrfica) para seleccionar todas las personas y conseguir no slo los objetos cuyo nuevo tipo es declarado como objeto person_typ, sino tambin declarado cuyo subtipo student_typ o employee_typ se llama sustitucin. Un supertipo es sustituible, si uno de sus subtipos puede sustituirlo o almacenarlo en una variable o una columna cuyo tipo declarado es el supertipo. En general, los tipos son sustituibles. Los atributos del objeto, los elementos de coleccin y REF son sustituibles. Un atributo definido como un REF , un tipo, o una coleccin de tipo person_typ puede tener un REF a una instancia o las instancias de una instancia de person_typ , o una instancia de cualquier subtipo de person_typ . Esto lo podemos hacer, dado que es un subtipo, despus de todo, solo es una clase especializada de uno de sus supertipos.Formalmente, sin embargo, un subtipo es un tipo en s mismo: no se trata del mismo tipo que su supertipo. Una columna que sostiene a todas las personas, incluyendo a todas las personas que son estudiantes y todas las personas que son empleados, en realidad contiene los datos de varios tipos. En principio, los atributos de los objetos, colecciones y REF s siempre son sustituibles entre s: no hay sintaxis en el nivel de la definicin de tipo para limitar la posibilidad de sustitucin de algn subtipo. Puede, sin embargo, desactivar o limitar sustitucin a nivel de almacenamiento, para las tablas y columnas concretas.
La sustituibilidad de columna y fila

Las columnas de tipo de objeto y el tipo de objeto filas en tablas de objetos son sustituibles, o sea: una columna o fila de un tipo especfico puede contener instancias de ese tipo y cualquiera de sus subtipos. Por ejemplo, considere la jerarqua de tipos person_typ como el que se introdujo anteriormente. Puede crear una tabla de objetos de person_typ que

contiene filas de todo tipo. Para ello, se inserta una instancia de un tipo determinado en una tabla de objeto con el constructor de ese tipo en el VALUES clusula de la INSERT declaracin como se muestra en el ejemplo.

CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', '650-555-0130')); INSERT INTO person_obj_table VALUES (student_typ(51, 'Joe Lane', '1-650-555-0140', 12, 'HISTORY')); INSERT INTO person_obj_table VALUES (employee_typ(55, 'Jane Smith', '1-650-555-0144', 100, 'Jennifer Nelson')); INSERT INTO person_obj_table VALUES (part_time_student_typ(52, 'Kim Patel', '1-650-555-0135', 14, 'PHYSICS', 20));

Usted puede llamar al show () funcin para el supertipo y los subtipos de la tabla con la siguiente:
SELECT p.show() FROM person_obj_table p;

Del mismo modo, en el ejemplo siguiente se muestra como una columna de tipo sustituible person_typ puede contener instancias de los tres tipos, en una tabla relacional o una vista. El ejemplo recrea objetos person, student, y de part_time_student de esa jerarqua de tipos y los inserta en el person_typ columna contact.

Insertar valores en las columnas de una tabla sustituible


DROP TYPE person_typ FORCE; -- If previously created DROP TYPE student_typ FORCE; -- if previously created DROP TYPE part_time_student_typ FORCE; -- if previously created DROP TABLE contacts; if previously created CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20)) NOT FINAL;/ CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30)) NOT FINAL; / CREATE TYPE part_time_student_typ UNDER student_typ ( number_hours NUMBER); /

CREATE TABLE contacts ( contact person_typ, contact_date DATE ); INSERT INTO contacts VALUES (person_typ (12, 'Bob Jones', '650-555-0130'), '24 Jun 2003); INSERT INTO contacts VALUES (student_typ (51, 'Joe Lane', '1-650-555-0178', 12, 'HISTORY'), '24 Jun 2003); INSERT INTO contacts VALUES (part_time_student_typ(52, 'Kim Patel', '1-650-555-0190', 14, 'PHYSICS', 20), '24 Jun 2003' );

Un subtipo de nueva creacin se puede almacenar en las tablas y columnas sustituibles de su supertipo, incluyendo tablas y columnas que existan antes de que el subtipo se haya creado. En general, se puede acceder a los atributos usando la notacin de puntos. Para acceder a los atributos de un subtipo de una fila o una columna de tipo declarado, puede utilizar la funcin TREAT. Por ejemplo:
SELECT TREAT (contact AS student_typ).major FROM contacts;

Usando OBJECT_VALUE y OBJECT_ID con filas sustituibles

Las pseudocolumnas OBJECT_VALUE y OBJECT_ID le permiten acceder e identificar el valor y el identificador de objeto (OID) de una fila sustituible en una tabla de objetos, como se muestra en el ejemplo

Uso de OBJECT_VALUE y OBJECT_ID


DROP TABLE person_obj_table; -- required if previously created CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(20, 'Bob Jones', '650-555-0130')); SELECT p.object_id, p.object_value FROM person_obj_table p;

Los subtipos con los atributos de un supertipo

Un subtipo puede tener un atributo cuyo tipo es el tipo de un supertipo. Por ejemplo:

Creacin de un subtipo con un atributo supertipo


CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30), advisor person_typ);

Sin embargo, las columnas de estos tipos no son sustituibles. Del mismo modo, un subtipo puede tener un atributo de la coleccin cuyo tipo de elemento es uno de sus supertipos, pero, de nuevo, las columnas de estos tipos no son

sustituibles. Por ejemplo, si student_typ tena una tabla anidada o VARRAY de person_typ , la columna student_typ no es sustituible. Sin embargo, puede definir columnas sustituibles de los subtipos que tienen atributos REF de los supertipos de referencia. Por ejemplo, el subtipo composite_category_typ que se muestra en el ejemplo siguiente contiene la tabla anidada subcategory_ref_list . Esta tabla contiene subcategory_ref_list_typ que son REF a category_typ . El subtipo fue creado como sigue:

Definicin de las columnas de subtipos que tienen atributos REF


-- not to be executed CREATE TYPE subcategory_ref_list_typ AS TABLE OF REF category_typ; / CREATE TYPE composite_category_typ UNDER category_typ ( subcategory_ref_list subcategory_ref_list_typ ... ...

La sustitucin de las columnas y los atributos REF

Las columnas y los atributos REF son sustituibles en vistas y tablas. Por ejemplo, ya sea en una vista o una tabla, una columna declarada REF person_typ puede contener referencias a instancias de person_typ o cualquiera de sus subtipos.
La sustitucin de elementos de la coleccin

Los elementos de coleccin son sustituibles en vistas y tablas. Por ejemplo, una tabla anidada de person_typ puede contener instancias de objetos de person_typ o cualquiera de sus subtipos.
El almacenamiento de los subtipos creados recientemente en las columnas sustituibles

Si se crea un subtipo, cualquier tabla que ya tiene columnas sustituibles del supertipo puede almacenar el nuevo subtipo tambin. Esto significa que sus opciones para la creacin de subtipos se ven afectadas por la existencia de dichas tablas. Si por ejemplo existe una tabla, slo se pueden crear subtipos que son sustituibles, es decir, los subtipos que no violen los lmites o limitaciones de la tabla. En el ejemplo siguiente se crea un person_typ y luego muestra varios intentos para crear un subtipo student_typ en person_typ .

Creacin de un subtipo despus de crear columnas sustituibles


DROP TYPE person_typ FORCE; DROP TABLE person_obj_table;

DROP TYPE student_typ; -- perform above drops if objects/tables created CREATE OR REPLACE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20)) NOT FINAL;/ CREATE TABLE person_obj_table (p person_typ);

La siguiente declaracin da un error porque student_typ tiene un atributo supertipo, y la tabla person_obj_table tiene una columna sustituible p del supertipo.
CREATE TYPE student_typ UNDER person_typ ( -- incorrect CREATE subtype advisor person_typ); /

El prximo intento tiene xito. Esta versin del subtipo student_typ es sustituible. Oracle Database habilita automticamente la tabla person_obj_table para almacenar instancias de este nuevo tipo.
CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30));/ INSERT INTO person_obj_table VALUES (student_typ(51, 'Joe Lane', '1-650-555-0178', 12, 'HISTORY'));

Borrado de subtipos despus de crear columnas sustituibles

Al borrar un subtipo con la opcin validate, comprueba que no hay instancias del subtipo que se almacenen en una columna sustituible del supertipo. Si no hay tales casos, la operacin DROP se completa. La siguiente declaracin falla debido a que una instancia de student_typ se almacena en la columna sustituible p de la tabla person_obj_table :
DROP TYPE student_typ VALIDATE - incorrecto: una instancia an existe;

Para quitar el tipo, en primer lugar eliminar cualquiera de sus instancias en las columnas de la supertipo sustituibles:
DELETE FROM person_obj_table WHERE p IS OF (student_typ); DROP TYPE student_typ VALIDATE; Otros ejemplos de is of
SELECT * FROM persons p WHERE VALUE(p) IS OF TYPE (employee_t); -- y sus subtipos SELECT * FROM persons p WHERE VALUE(p) IS OF (ONLY part_time_emp_t);

Desactivacin de sustitucin en una nueva tabla

Cuando se crea una tabla, puede desactivar toda posibilidad de sustitucin en una columna o atributo, incluidos los atributos y colecciones integradas anidados a cualquier nivel, con la clusula de NOT SUBSTITUTABLE AT ALL LEVELS. En el siguiente ejemplo, la clusula limita a la columna office de una tabla relacional para almacenar slo instancias office_typ y evita que se almacenen las instancias de subtipos:

Desactivacin de sustituibilidad al crear una tabla


DROP TYPE location_typ FORCE; -- required if previously created DROP TYPE office_typ FORCE; -- required if previously created CREATE OR REPLACE TYPE location_typ AS OBJECT ( building_no city / CREATE TYPE people_typ AS TABLE OF person_typ; / CREATE TYPE office_typ AS OBJECT ( office_id location occupant NOT FINAL;/ CREATE TABLE dept_office ( dept_no office NUMBER, office_typ) VARCHAR(10), location_typ, person_typ ) NUMBER, VARCHAR2(40) );

COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS;

Con tablas de objetos, la clusula se puede aplicar a la tabla en su conjunto, tales como:
DROP TABLE office_tab; -- if previously created CREATE TABLE office_tab OF office_typ NOT SUBSTITUTABLE AT ALL LEVELS;

La clusula tambin puede desactivar la posibilidad de sustitucin en una columna en particular, es decir, para un atributo particular del tipo de objeto de la tabla:
DROP TABLE office_tab; -- if previously created CREATE TABLE office_tab OF office_typ COLUMN occupant NOT SUBSTITUTABLE AT ALL LEVELS;

Puede especificar que el tipo de elemento de una coleccin no se puede sustituir con una sintaxis como la siguiente:
DROP TABLE people_tab;

-- required if previously created CREATE TABLE people_tab ( people_column people_typ ) NESTED TABLE people_column NOT SUBSTITUTABLE AT ALL LEVELS STORE AS people_column_nt;

No existe un mecanismo para desactivar la sustituibilidad de las columnas

REF

Puede utilizar cualquiera NOT SUBSTITUTABLE AT ALL LEVELS, o IS OF TYPE para limitar un objeto de columna , pero no se puede utilizar los dos.

Restringir sustitucion
Se puede imponer una restriccin que limite el rango de subtipos permitidos en una columna de objeto o atributo de un subtipo en particular en la jerarqua del tipo declarado. Para ello, utilice la restriccin IS OF TYPE. La siguiente sentencia crea una tabla de office_typ en el que los ocupantes se ven limitadas a slo aquellas personas que son empleados:

Restringir sustitucion al crear una tabla


DROP TABLE office_tab; -- If previously created CREATE TABLE office_tab OF office_typ COLUMN occupant IS OF (ONLY employee_typ);

Aunque el tipo office_typ permite a los autores a ser de tipo person_typ , la declaracin de la columna impone una restriccin para almacenar nicamente las instancias de employee_typ . Slo se puede utilizar el operador IS OF TYPE para limitar la fila y la columna de los objetos de un solo subtipo (no varios), y se debe utilizar la palabra ONLY, como en el ejemplo anterior
Puede utilizar cualquiera NOT SUBSTITUTABLE AT ALL LEVELS, o IS OF TYPE para limitar un objeto de columna , pero no se puede utilizar los dos.

Modificacin de sustitucion
En una tabla existente, puede cambiar una columna de objeto de SUBSTITUTABLE a NOT SUBSTITUTABLE (o de NOT SUBSTITUTABLE a SUBSTITUTABLE ) mediante el uso de un ALTER TABLE . Para ello, se especifica la clusula [NOT] SUBSTITUTABLE AT ALL LEVELS de la columna en particular. Puede modificar sustitucin slo para una columna especfica, no para una tabla de objetos como un todo.

La siguiente declaracin hace que la columna

office

sustituible:

Modificacin de sustituibilidad en una tabla


ALTER TABLE dept_office MODIFY COLUMN office SUBSTITUTABLE AT ALL LEVELS;

La siguiente declaracin hace que la columna no sustituible. Tenga en cuenta que tambin utiliza la palabra clave FORCE. Esta palabra clave hace que las columnas ocultas que contengan informacin o datos typeid de atributos de subtipos que se borren:
ALTER TABLE dept_office MODIFY COLUMN office NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

Si usted no utiliza FORCE para hacer una columna no sustituible, la columna y todos los atributos del tipo debe ser FINAL o el ALTER TABLE da un error. Un columna VARRAY se puede modificar de SUBSTITUTABLE a NOT SUBSTITUTABLE slo si el tipo de elemento de la VARRAY es FINAL y no tiene tipos incorporados (en sus atributos o en los atributos de sus atributos, y as sucesivamente) que no son FINALES. .

Restricciones a la Modificacin de la sustitucion


Puede cambiar la sustitucin de una sola columna cada la vez con un ALTER TABLE. Para cambiar la sustitucion de varias columnas, debe emitir varias instrucciones. En una tabla de objetos, slo se puede modificar la sustitucin de una columna si la sustitucion no se ha establecido explcitamente en el nivel de la tabla, cuando se cre la tabla. Por ejemplo, el siguiente intento de modificar la sustitucion de la columna direccin tiene xito porque la sustitucin no ha sido explcitamente activada o desactivada en el nivel de tabla en el CREATE TABLE:
DROP TABLE office_tab; -- If previously created CREATE TABLE office_tab OF office_typ; ALTER TABLE office_tab MODIFY COLUMN occupant NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

Sin embargo, en el siguiente ejemplo, la sustitucin se establece explcitamente en el nivel de tabla, por lo que falla el intento de modificar la configuracin para la columna direccin:
DROP TABLE office_tab;

-- if previously created CREATE TABLE office_tab OF office_typ NOT SUBSTITUTABLE AT ALL LEVELS; /* Following SQL statement generates an error: */ ALTER TABLE office_tab MODIFY COLUMN occupant SUBSTITUTABLE AT ALL LEVELS FORCE ALTER;

-- incorrect

Una columna cuya sustitucin ha sido establecida por un operador IS OF no puede modificar su sustitucin con un [NOT] SUBSTITUTABLE AT ALL LEVELS .

TYPE

Las asignaciones entre tipos


Las reglas de asignacin que se describen en esta seccin se aplican a INSERT UPDATE , la clusula RETURNING , parmetros de funcin y las variables PL / SQL. Objeto tpico de asignacin de objetos Sustitucion es la capacidad de un subtipo para sustituir a uno de sus supertipos. La sustitucin en la otra direccin, para sustituir un supertipo a un subtipo, genera un error en tiempo de compilacin. Asignacin de un tipo fuente source_typ a un tipo destino de uno de los siguientes dos patrones:

target_typ /

debe ser

Caso 1: Caso 2:

source_typ source_typ

y target_typ son del mismo tipo es un subtipo de target_typ (ampliacin)

Caso 2 ilustra la ampliacion. Ampliacin de una asignacin en la que el tipo declarado fuente es ms especfico que el tipo declarado destino. Por ejemplo, la asignacin de una instancia empleado a una variable de tipo persona. Un empleado es una definicin ms limitada, tipo especial de persona, puedes poner a un empleado en el sitio destinado a una persona si no te importa que se omita lo que sea especfico de la especializacin, que hace que la persona sea un empleado. Todos los empleados son personas, por lo que una asignacin de ampliacin siempre funciona. Para ilustrar la ampliacin, suponga que tiene la siguiente tabla:

TABLE T (pers_col person_typ, emp_col employee_typ, stu_col student_typ)

En las tareas siguientes se muestra la ampliacin. Las asignaciones son vlidas menos perscol que ha sido definida como no sustituible.
UPDATE T set pers_col = emp_col;

El siguiente es un ejemplo de PL / SQL, lo que requiere en primer lugar crear una person_typ y un employee_typ :

PL / SQL Asignacin
DROP TYPE person_typ FORCE; -- if previously created CREATE TYPE person_typ AS OBJECT ( idno NUMBER, name VARCHAR2(30), phone VARCHAR2(20)) NOT FINAL; / DROP TYPE employee_typ FORCE; -- if previously created CREATE TYPE employee_typ UNDER person_typ ( emp_id NUMBER, mgr VARCHAR2(30)); / -- PL/SQL assignment example DECLARE var1 person_typ; var2 employee_typ; BEGIN var2:= employee_typ(55, 'Jane Smith', '1-650-555-0144', 100, 'Jennifer Nelson'); var1:= var2; END;

La reduccin de Asignacin Una asignacin de estrechamiento es la inversa de ensanchamiento. Se trata de una relacin ms general, el tipo menos especializado, como una persona, a un tipo ms restringido, como un empleado. No todas las personas son empleados, por lo que una tarea en particular como esta slo funciona si la persona en cuestin en realidad pasa a ser un empleado. Por lo tanto, al final, las asignaciones de estrechamiento slo funcionan en casos como el caso 1 Para hacer un trabajo de reduccin, se debe utilizar la funcin TREAT para probar que la instancia del tipo de origen ms general tiene declarado como un subtipo el tipo de destino ms especializado y por lo tanto puede ser operado como tal. La funcin TREAT realiza una comprobacin en tiempo de ejecucin para confirmar esto y devuelve NULL si el valor fuente, la persona en cuestin, no es del tipo de destino o uno de sus subtipos. Por ejemplo, el siguiente update establece los valores de person_typ en la columna perscol en la columna empcol de employee_typ . Para cada valor de perscol, la asignacin se realiza correctamente si esa persona tambin es un empleado. Si la persona no es un empleado, TREAT devuelve NULL , y la asignacin devuelve NULL .

UPDATE T set emp_col = TREAT (pers_col AS employee_typ);

La declaracin siguiente se intenta hacer un trabajo de estrechamiento de forma explcita, sin cambiar el tipo declarado del valor de origen. La declaracin se devolver un error:
UPDATE T set emp_col = pers_col;

Asignaciones de la coleccin En las asignaciones de las expresiones de un tipo de coleccin, el origen y destino deben ser del mismo tipo declarado. Ni ampliacin ni reduccin est permitido. Sin embargo, un valor subtipo puede ser asignado a una coleccin supertipo. Por ejemplo, despus de crear un nuevo student_typ , supongamos que tenemos los siguientes tipos de colecciones:

Creacin de la coleccin person_set


DROP student_typ; -- if previously created CREATE TYPE student_typ UNDER person_typ ( dept_id NUMBER, major VARCHAR2(30)) NOT FINAL; / CREATE TYPE person_set AS TABLE OF person_typ; / CREATE TYPE student_set AS TABLE OF student_typ; / /

Las expresiones de estos tipos diferentes de colecciones no se pueden asignar de uno a otro, pero un elemento de coleccin de student_typ puede ser asignado a una coleccin de person_set tipo:
DECLARE var1 person_set; var2 student_set; elem1 person_typ; elem2 student_typ; Begin - Var1: = var2; / * ILEGAL - colecciones no del mismo tipo * / var1: = person_set (elem1, elem2); / * LEGAL: El elemento es del subtipo * / END; /

Funciones y operadores tiles con objetos


Varias de las funciones y los operadores son especialmente tiles para trabajar con los objetos y las referencias a objetos: CAST CURSOR DEREF IS OF type REF SYS_TYPEID TABLE() TREAT VALUE
VALUE

En PL / SQL las funciones sentencia SQL. .

REF

DEREF

slo puede aparecer en una

CAST
CAST convierte un tipo de datos incorporado o valor especificado de la coleccin en otro tipo de datos integrados o valor especificado de la coleccin. Por ejemplo:

Uso de la funcin CAST


CREATE TYPE person_list_typ AS TABLE OF person_typ;/ SELECT CAST (COLLECT (contact) AS person_list_typ) FROM contacts; ;

CURSOR
Un expresin CURSOR devuelve un cursor anidado. Esta forma de expresin es equivalente a la de PL / SQL REF CURSORy se pueden pasar como un argumento REF CURSOR de una funcin.

DEREF
La funcin DEREF en una instruccin SQL devuelve la instancia del objeto que corresponde a un REF . La instancia de objeto devuelto por DEREF puede ser del tipo declarado de la REF , o cualquiera de sus subtipos. Por ejemplo, la instruccin siguiente devuelve mesa contact_ref .
person_typ

objetos de la

Uso de la funcin DEREF


SELECT DEREF(c.contact_ref), c.contact_date FROM contacts_ref c;

IS OF TYPE
Las instancias IS OF TYPE de objetos determinan el nivel de especializacin de su tipo. Por ejemplo, la siguiente consulta se recuperan todas las instancias de los estudiantes (incluidos los subtipos de los estudiantes) que se almacenan en la tabla person_obj_table

Uso de la IS OF TYPE para Consultar valor de un subtipo


SELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (student_typ);

Para cualquier objeto que no es de un subtipo especificado, o un subtipo de un subtipo especificado, IS OF regresa FALSE .Los subtipos de un subtipo especfico son simplemente versiones ms especializadas del subtipo especificado. Si desea excluir estos subtipos, puede utilizar la palabra clave ONLY. Esto hace que la palabra clave IS OF devuelva FALSE para todos los tipos, excepto los tipos especificados. En el siguiente ejemplo, las pruebas de declaracin de los objetos en objeto de tabla person_obj_table , que contiene las personas, empleados y estudiantes, y devuelve REF s slo para los objetos de los dos subtipos de persona especificado employee_typ , student_typ , y sus subtipos, si procede:
SELECT REF(p) FROM person_obj_table p WHERE VALUE(p) IS OF (employee_typ, student_typ);

Aqu hay un ejemplo similar en PL / SQL. El cdigo hace algo si la persona es un empleado o estudiante:
DECLARE var person_typ; BEGIN var := employee_typ(55, 'Jane Smith', '1-650-555-0144', 100, 'Jennifer Nelson'); IF var IS OF (employee_typ, student_typ) THEN DBMS_OUTPUT.PUT_LINE('Var is an employee_typ or student_typ object.'); ELSE DBMS_OUTPUT.PUT_LINE('Var is not an employee_typ or student_typ object.'); END IF; END; /

La siguiente instruccin devuelve slo los estudiantes cuyo tipo ms especfico o especializado tipo es student_typ . Si la tabla o vista contiene todos los objetos de un subtipo de student_typ , como part_time_student_typ , stos quedan excluidos. El ejemplo se utiliza el TREAT funcin para convertir los objetos que estn a los estudiantes a student_typ del tipo declarado de la vista, person_typ :
SELECT TREAT(VALUE(p) AS student_typ) FROM person_obj_table p WHERE VALUE(p) IS OF(ONLY student_typ);

Para probar el tipo de objeto que un REF apunta , puede utilizar la funcin DEREF para eliminar la referencia al REF antes de probar con la IS OF TYPE. Por ejemplo, si contact_ref se declara REF person_typ , puede obtener slo las filas de los estudiantes de la siguiente manera:
SELECT * FROM contacts_ref WHERE DEREF(contact_ref) IS OF (student_typ);

REF
La funcin REF en una sentencia SQL toma como argumento un nombre de correlacin (o alias de la tabla) para una tabla o vista de objetos y devuelve una referencia (un REF ) de una instancia de objeto de esa tabla o vista. La funcin REF puede devolver referencias a objetos del tipo declarado de la tabla, vista, o cualquiera de sus subtipos. Por ejemplo, la instruccin siguiente devuelve las referencias a todas las personas, incluidas las referencias a los estudiantes y empleados, cuya idno atributo es 12:

Uso de la funcin REF


SELECT REF(p) FROM person_obj_table p WHERE p.idno = 12;

SYS_TYPEID
La funcin SYS_TYPEID se puede utilizar en una consulta para devolver el typeid (un tipo oculto) del tipo ms especfico de la instancia del objeto que se pasa como argumento. El tipo ms especfico de una instancia de objeto es el tipo al que la instancia pertenece, es decir, el ms alejado del tipo de raz. Por ejemplo, si Tim es un estudiante a tiempo parcial, es tambin un estudiante y una persona, pero su tipo ms especfico es estudiante a tiempo parcial.

La funcin devuelve los typeids del tipo discriminante oculto de la columna que est asociado con cada columna sustituible. La funcin devuelve un typeid nula para un tipo de final de la raz. La sintaxis de la funcin es:
SYS_TYPEID (object_type_value)

Funcin SYS_TYPEID slo podrn ser utilizados con argumentos de un tipo de objeto. Su objetivo principal es hacer posible la construccin de un ndice en tipo oculto discriminante de la columna. Todos los tipos que pertenecen a una jerarqua de tipos se les asignan un typeid no nulo que es nico dentro de la jerarqua de tipos. Los tipos que no pertenecen a una jerarqua de tipos tienen un typeid nulo. Todo tipo excepto un tipo de final de la raz pertenece a una jerarqua de tipos. Un tipo final de la raz no tiene ningn tipo relacionadas con ella por herencia:

No puede tener subtipos derivados de ella porque es final. No es en s mismo derivado de algn otro tipo, ya que es un tipo de raz, por lo que no tiene ningn supertipos.

Para un ejemplo de SYS_TYPEID, tenga en cuenta el objeto de tabla sustituible person_obj_table , de person_typ es el tipo raz de una jerarqua que tiene student_typ como un subtipo y part_time_student_typ como un subtipo de student_typ .
CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ (12, 'Bob Jones', '650-555-0130 ')); INSERT INTO person_obj_table VALUES (student_typ (51, 'Joe Lane', '1 -650-555-0140 ', 12,' Historia ')); INSERT INTO person_obj_table VALUES (employee_typ (55, 'Jane Smith', '1 -650-555-0144 ', 100, 'Jennifer Nelson')); INSERT INTO person_obj_table VALUES (part_time_student_typ (52, 'Kim Patel', '1 -650-555-0135 ', 14, Fsica, 20));

La consulta siguiente utiliza SYS_TYPEID. Seleciona el atributo nombre y typeid de las instancias de objetos en la tabla person_obj_table . Cada uno de los casos es de un tipo diferente:

Uso de la funcin SYS_TYPEID

SELECT name, SYS_TYPEID (VALUE(p)) typeid FROM person_obj_table p;

TABLE ()
Las funciones de tabla son funciones que producen una coleccin de filas, una tabla anidada o una VARRAY, que pueden ser consultados como una tabla de base de datos fsica o asignada a una variable coleccin de PL / SQL. Puede utilizar una funcin de tabla como el nombre de una tabla de base de datos, en la clusula FROM de una consulta, o como un nombre de columna en la lista SELECT de una consulta. Una funcin de tabla puede tener una coleccin de filas como entrada. Un parmetro coleccin de entrada puede ser o bien un tipo de coleccin, tales como un VARRAY o una tabla de PL / SQL, o un REF CURSOR. Utilice pipelined para indicar a la base de datos Oracle que devuelva los resultados de una funcin de tabla de forma iterativa. Una funcin de tabla devuelve una tabla anidada o tipo VARRAY. .

TREAT
La funcin TREAT realiza una comprobacin en tiempo de ejecucin para confirmar que una expresin puede ser operada como si se tratara de un tipo diferente especificado en la jerarqua, normalmente un subtipo del tipo declarado de la expresin. En otras palabras, la funcin intenta tratar una Instancia supertipo como una instancia subtipo, por ejemplo, para tratar una persona como estudiante. Si la persona es un estudiante, entonces la persona se devuelve como un estudiante, con los atributos y mtodos adicionales que el estudiante pueda tener. Si la persona no es un estudiante, TREAT devuelve NULL en SQL. Los dos usos principales de

TREAT

son los siguientes:

En las asignaciones de estrechamiento, modificar el tipo de una expresin de manera que la expresin se pueda asignar a una variable de un tipo ms especializado en la jerarqua, es decir, para establecer un valor supertipo en un subtipo. Para acceder a los atributos o mtodos de un subtipo del tipo declarado de una fila o columna.

Uso de TREAT para Funciones de restriccin La funcin TREAT se utiliza para las asignaciones de estrechamiento, es decir, las asignaciones que establezca un valor supertipo en un subtipo. Para una comparacin con las asignaciones de ampliacin,

devuelve todos (y nico) instancias student_typ para person_obj_table de tipo person_typ , un supertipo de student_typ . La sentencia utiliza TREAT para modificar el tipo de p de person_typ a student_typ .
TREAT

En el ejemplo ,

Uso de la funcin TREAT para devolver un subtipo especfico en una consulta


SELECT TREAT(VALUE(p) AS student_typ) FROM person_obj_table p;

Para cada p , la modificacin TREAT tiene xito slo si el tipo ms especfico o especializado del valor de p es student_typ o una de sus subtipos. Si p es una persona que no es un estudiante, o si p es NULL , TREAT devuelve NULL en SQL o, en PL / SQL, se produce una excepcin. Tambin puede utilizar TREAT para modificar el tipo declarado de un REF expresin. Por ejemplo:
SELECT TREAT (REF (p) AS REF student_typ) FROM person_obj_table p;

En el ejemplo anterior devuelve REF s para todos casos student_typ . En SQL devuelve NULL REF s para todas las instancias persona que no son estudiantes, y en PL / SQL se produce una excepcin. Uso de la funcin TREAT acceder a los atributos o mtodos Subtipo Quizs el uso ms importante de TREAT es acceder a los atributos o mtodos de un subtipo de una fila o una columna de un tipo declarado. La consulta siguiente recupera el atributo major de todas las personas, los estudiantes y los estudiantes a tiempo parcial, que tienen este atributo. Se devuelve NULL a las personas que no son estudiantes:

Uso de la funcin TREAT acceder a los atributos de un subtipo especfico


SELECT name, TREAT(VALUE(p) AS student_typ).major major FROM person_obj_table p;

La consulta siguiente no funcionar porque major es un atributo de student_typ pero no de person_typ , el tipo declarado de la tabla de

persons

SELECT name, VALUE(p).major major FROM person_obj_table p -- incorrect;

El siguiente es un ejemplo de PL / SQL:


DECLARE var person_typ; BEGIN var := employee_typ(55, 'Jane Smith', '1-650-555-0144', 100, 'Jennifer Nelson'); DBMS_OUTPUT.PUT_LINE(TREAT(var AS employee_typ).mgr);

END; /

VALUE
En una sentencia SQL, la funcin Value toma como argumento una variable de correlacin (alias de la tabla) para una tabla o vista de objetos y devuelve instancias de objetos correspondientes a las filas de la tabla o vista. La funcin VALUE puede devolver las instancias del tipo declarado de la fila o cualquiera de sus subtipos. Ejemplo, en primer lugar crear un part_time_student_typ , a continuacin, muestra una consulta SELECT que devuelva todas las personas, incluyendo estudiantes y empleados, de la tabla de person_obj_table de person_typ .

Uso de la funcin VALUE


CREATE TYPE part_time_student_typ UNDER student_typ ( number_hours NUMBER); / SELECT VALUE(p) FROM person_obj_table p;

Para recuperar slo los estudiantes a tiempo parcial, es decir, los casos ms especficos cuyo tipo es part_time_student_typ , utilice el ONLY para limitar la seleccin:
SELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (ONLY part_time_student_typ);

En el siguiente ejemplo, en una tabla de objetos:

value

se utiliza para actualizar una instancia de objeto

UPDATE person_obj_table p SET VALUE(p) = person_typ(12, 'Bob Jones', '1-650-555-0130') WHERE p.idno = 12;

3 Uso de PL / SQL con tipos de objetos


En este captulo se describe cmo utilizar los tipos de objetos con PL / SQL Este captulo contiene los siguientes temas: Declarar e inicializar objetos en PL / SQL Manipulacin de objetos en PL / SQL Uso de sobrecarga en PL / SQL con herencia Uso de SQL dinmico con objetos

Declarar e inicializar objetos en PL / SQL


Uso de los tipos de objetos en un bloque PL / SQL, subprograma o paquete es un proceso de dos pasos. 1. Debe definir los tipos de objetos que utilizan la sentencia SQL TYPE en SQL * Plus u otros programas similares.
CREATE

Despus de que un tipo de objeto se define y se instala en el esquema, se puede utilizar en cualquier bloque PL / SQL, subprograma o paquete. 2. A continuacin, en PL / SQL, declarar una variable cuyo tipo de datos es el definido por el usuario o ADT(tipo de datos Abstracto) que acaba de definir. Los objetos o TDAs siguen el mbito de aplicacin habitual y las reglas de instancias.

Definicin de tipos de objetos


El ejemplo proporciona dos tipos de objetos, as como una tabla de tipos de objetos. En ejemplos siguientes se muestra cmo declarar las variables de los tipos de objetos en PL / SQL y realizar otras operaciones con estos objetos.

Trabajo con tipos de objetos


CREATE TYPE address_typ AS OBJECT ( street VARCHAR2(30), city VARCHAR2(20), state CHAR(2), postal_code VARCHAR2(6) ); / CREATE TYPE employee_typ AS OBJECT ( employee_id NUMBER(6), first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25), phone_number VARCHAR2(20),

hire_date DATE, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), address address_typ, MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) ); / CREATE TYPE BODY employee_typ AS MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN RETURN employee_id; END; MEMBER PROCEDURE display_address ( SELF IN OUT NOCOPY employee_typ ) IS BEGIN DBMS_OUTPUT.PUT_LINE(first_name || ' ' || last_name); DBMS_OUTPUT.PUT_LINE(address.street); DBMS_OUTPUT.PUT_LINE(address.city || ', ' || address.state || ' ' || address.postal_code); END; END; / CREATE TABLE employee_tab OF employee_typ;

Objetos que se declaran en un bloque PL / SQL


Puede utilizar los objetos donde se necesiten, igual que
CHAR

NUMBER

En el ejemplo se declara un objeto emp de tipo employee_typ . Entonces, el constructor para el tipo de objeto employee_typ inicializa el objeto.

declarar objetos en un bloque PL / SQL


DECLARE emp employee_typ; -- emp is atomically null BEGIN -- call the constructor for employee_typ emp := employee_typ(315, 'Francis', 'Logan', 'FLOGAN', '415.555.0100', '01-MAY-04', 'SA_MAN', 11000, .15, 101, 110, address_typ('376 Mission', 'San Francisco', 'CA', '94222')); DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name); -- display details emp.display_address(); -- call object method to display details END; /

El parmetro formal de un subprograma PL / SQL pueden tener tipos de datos de tipos definidos por el usuario. Por lo tanto, se pueden pasar objetos a los subprogramas almacenados y de un subprograma a otro. En el siguiente ejemplo, el tipo de objeto employee_typ especifica el tipo de datos de un parmetro formal:
PROCEDURE open_acct (new_acct IN OUT employee_typ) IS ...

En el siguiente ejemplo, el tipo de objeto retorno de una funcin:

employee_typ

especifica el tipo de

FUNCTION get_acct (acct_id IN NUMBER) RETURN employee_typ IS ...

Cmo trata PL / SQL a los objetos sin inicializar


Los tipos definidos por el usuario, al igual que las colecciones, son atmicamente nulos, hasta que se inicialice el objeto mediante una llamada al constructor de su tipo de objeto. Es decir, el propio objeto es nulo, no slo sus atributos. La comparacin de un objeto nulo con cualquier otro objeto siempre produce NULL. Adems, si se asigna un objeto atmicamente nulo a otro objeto, el otro objeto se convierte en atmicamente nulo (y deben reinicializarse). Del mismo modo, si se asigna el no-valor NULL a un objeto, el objeto se convierte en atmicamente nulo. En una expresin, los atributos de un objeto no inicializado se evalan como NULL. Cuando se aplica a un objeto no inicializado o sus atributos, el operador IS NULL de comparacin devuelve VERDADERO .

Manipulacin de objetos en PL / SQL


En esta seccin se describe cmo manipular atributos de los objetos y mtodos de PL / SQL. Esta seccin incluye los siguientes temas: Acceso a los atributos de objetos con notacin de puntos Llamar a constructores y mtodos del objeto Actualizacin y eliminacin de objetos Manipulacin de objetos a travs de modificadores Ref.

Acceso a los atributos de objetos con notacin de puntos


Usted se refiere a un atributo por su nombre. Para acceder o cambiar el valor de un atributo, se utiliza la notacin de puntos. Los nombres de atributos se pueden encadenar, lo que le permite acceder a los atributos de un tipo de objeto anidado.

Acceso a Atributos de Objetos


DECLARE emp employee_typ; BEGIN emp := employee_typ(315, 'Francis', 'Logan', 'FLOGAN', '415.555.0100', '01-MAY-04', 'SA_MAN', 11000, .15, 101, 110, address_typ('376 Mission', 'San Francisco', 'CA', '94222')); DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name); DBMS_OUTPUT.PUT_LINE(emp.address.street); DBMS_OUTPUT.PUT_LINE(emp.address.city || ', ' ||emp. address.state || ' ' || emp.address.postal_code); END;

Llamar a constructores y mtodos del objeto


Las llamadas a un constructor se permiten siempre que las llamadas a funciones estn permitidas. Como todas las funciones, un constructor se llama como parte de una expresin, como se muestra en el ejemplo.

Insertar filas en una tabla de objetos


DECLARE emp employee_typ; BEGIN INSERT INTO employee_tab VALUES (employee_typ(310, 'Evers', 'Boston', 'EBOSTON', '617.555.0100', '01-AUG-04', 'SA_REP', 9000, .15, 101, 110, address_typ('123 Main', 'San Francisco', 'CA', '94111')) ); INSERT INTO employee_tab VALUES (employee_typ(320, 'Martha', 'Dunn', 'MDUNN', '650.555.0150', '30-SEP-04', 'AC_MGR', 12500, 0, 101, 110, address_typ('123 Broadway', 'Redwood City', 'CA', '94065')) ); END; / SELECT VALUE(e) from employee_tab e;

Cuando se pasan parmetros a un constructor, la llamada asigna valores iniciales a los atributos del objeto y se crea una instancia. Cuando se llama al constructor por defecto para rellenar todos los valores de los atributos, debe proporcionar un parmetro para cada atributo, a diferencia de constantes y variables, los atributos no pueden tener valores predeterminados. Usted puede llamar a un constructor usando la notacin de llamada nominal en lugar de la notacin posicional. Al igual que los subprogramas empaquetados, los mtodos se llaman utilizando notacin de puntos. En el Ejemplo, se llama al mtodo display_address para mostrar los atributos de un objeto. Observe el uso de la funcin VALUE que devuelve el valor de un objeto. VALUE toma como argumento una variable de correlacin. En este contexto, una variable de correlacin es una variable de fila o alias de tabla asociado a una fila en una tabla de objetos.

Mtodos de Acceso a Objetos


DECLARE emp employee_typ; BEGIN SELECT VALUE(e) INTO emp FROM employee_tab e WHERE e.employee_id = 310; emp.display_address(); END; /

En las sentencias SQL, las llamadas a un mtodo sin parmetros requieren una lista de parmetros vaca. En instrucciones procedurales, una lista de parmetros vaca es opcional.

Si se utiliza una funcin PL / SQL en lugar de un constructor durante una operacin DML, la funcin se puede ejecutar varias veces como parte de la ejecucin DML. Para que la funcin se ejecute slo una vez por ocurrencia, debe ser una funcin determinista.
Cuando sabemos que dados unos parmetros una funcin devolver siempre lo mismo deberamos utilizar la expresin DETERMINISTC. Este hint le va a permitir al optimizador de Oracle evitar hacer llamadas redundantes a la funcin. Slo se puede garantizar que una funcin devolver lo mismo dados unos parmetros cuando no dependa de variables de sesin (como sysdate) y otros objetos de la base de datos (llamadas a funciones no deterministic o consultas). El caso ms simple y ms comn es una funcin que devuelva el valor de una constante. Tambin son comunes funciones de operaciones aritmticas o de concatenacin. CREATE OR REPLACE PACKAGE PPRUEBA IS FUNCTION vValorCte RETURN VARCHAR2 DETERMINISTIC; PRAGMA RESTRICT_REFERENCES( vValorCte, RNDS, RNPS, WNDS, WNPS ); -- Funcin que devuelve el valor de la constante VCONSTANTE FUNCTION nSuma( nValorA NUMBER, nValorB NUMBER ) RETURN NUMBER DETERMINISTIC; PRAGMA RESTRICT_REFERENCES( nSuma, RNDS, RNPS, WNDS, WNPS ); -- Funcin que devuelve la suma de los dos valores que le pasan -- como parmetro. FUNCTION nSumaNoDeterminante( nValorA NUMBER, nValorB NUMBER ) RETURN NUMBER; PRAGMA RESTRICT_REFERENCES( nSumaNoDeterminante, RNPS, WNDS, WNPS ); -- Funcin que devuelve la suma de los dos valores que le pasan -- como parmetro. Como hace una select de dual no puede hacerse -- deterministic END; / SHOW ERRORS -- Cuerpo CREATE OR REPLACE PACKAGE BODY PPRUEBA IS -------------- Constantes ------------VCONSTANTE CONSTANT VARCHAR2(6) := 'PRUEBA'; FUNCTION vValorCte RETURN VARCHAR2 DETERMINISTIC IS -- Funcin que devuelve el valor de la constante VCONSTANTE BEGIN RETURN VCONSTANTE; END vValorCte; FUNCTION nSuma( nValorA NUMBER, nValorB NUMBER ) RETURN NUMBER DETERMINISTIC IS -- Funcin que devuelve la suma de los dos valores que le pasan -- como parmetro. BEGIN RETURN nValorA + nValorB; END nSuma; FUNCTION nSumaNoDeterminante( nValorA NUMBER, nValorB NUMBER ) RETURN NUMBER IS -- Funcin que devuelve la suma de los dos valores que le pasan -- como parmetro. Como hace una select de dual no puede hacerse -- deterministic ------------- Variables

-----------nSumaTotal NUMBER; BEGIN SELECT nValorA + nValorB INTO nSumaTotal FROM DUAL; RETURN nSumaTotal; END nSumaNoDeterminante; END; / SHOW ERRORS

Para las llamadas a los mtodos estticos, se ha de utilizar la notacin type_name. method_name en lugar de especificar una instancia del tipo. Cuando se llama a un mtodo que utiliza una instancia de un subtipo, el mtodo actual que se ejecuta depende de las declaraciones de la jerarqua de tipos. Si el subtipo remplaza el mtodo que hereda de su supertipo, la llamada utiliza la implementacin de subtipo. De lo contrario, la llamada se utiliza la implementacin del supertipo. Esta capacidad se conoce como mtodo expedicin dinmica.

Actualizacin y eliminacin de objetos


Desde el interior de un bloque PL / SQL se pueden modificar y eliminar filas de una tabla de objetos.

Ejemplo de Actualizacin y eliminacin de filas en una tabla de objetos


DECLARE emp employee_typ; BEGIN INSERT INTO employee_tab VALUES (employee_typ(370, 'Robert', 'Myers', 'RMYERS', '415.555.0150', '07-NOV-04', 'SA_REP', 8800, .12, 101, 110, address_typ('540 Fillmore', 'San Francisco', 'CA', '94011')) ); UPDATE employee_tab e SET e.address.street = '1040 California' WHERE e.employee_id = 370; DELETE FROM employee_tab e WHERE e.employee_id = 310; END; / SELECT VALUE(e) from employee_tab e;

Manipulacin de objetos a travs de modificadores Ref.


Puede recuperar REF s utilizando la funcin variable de correlacin o alias.
REF

, que toma como argumento una

Actualizar filas en una tabla de objetos con un modificador ref


DECLARE emp employee_typ; emp_ref REF employee_typ; BEGIN SELECT REF(e) INTO emp_ref FROM employee_tab e WHERE e.employee_id = 370; UPDATE employee_tab e SET e.address = address_typ('8701 College', 'Oakland', 'CA', '94321') WHERE REF (e) = emp_ref; END; /

Se puede declarar como variables REF, parmetros, campos o atributos. Usted puede utilizar REF como entrada o como variables de salida en las instrucciones SQL de manipulacin de datos. No se puede navegar a travs de REF s en PL / SQL. Por ejemplo, la asignacin en Ejemplo siguiente usando una REF no est permitido. En su lugar, utilice la funcin DEREF o hacer llamadas al paquete UTL_REF para acceder al objeto. .

Ejemplo Tratar de utilizar DEREF en una instruccin SELECT INTO, incorrecta


DECLARE emp employee_typ; emp_ref REF employee_typ; emp_name VARCHAR2(50); BEGIN SELECT REF(e) INTO emp_ref FROM employee_tab e WHERE e.employee_id = 370; -- La asignacin siguiente genera un error, no se permiten en PL / SQL emp := DEREF(emp_ref); --No se puede utilizar en las declaraciones de procedimiento DEREF emp_name := emp.first_name || ' ' || emp.last_name; DBMS_OUTPUT.PUT_LINE(emp_name); END; /

Esta asignacin genera un error como se describe a continuacin:


no se permiten en PL / SQL - Emp_Name: = emp_ref.first_name | | '' | | emp_ref.last_name; - EMP: = DEREF (emp_ref), no se les permite, no puede utilizar DEREF en sentencias de procedimiento

Uso de sobrecarga en PL / SQL con herencia


La sobrecarga le permite sustituir un valor subtipo de un parmetro formal que es un supertipo. Esta capacidad se conoce como sustitucin. Esta seccin trata sobre este aspecto de la sobrecarga. Reglas de sustitucin

Si ms de una instancia de un procedimiento de sobrecarga coincide con la llamada al procedimiento, las siguientes reglas de sustitucin determinan el procedimiento que, en su caso, se llama:

Si las firmas de los procedimientos sobrecargados slo se diferencian en que algunos parmetros son los tipos de objetos de la misma jerarquia, se utiliza la coincidencia ms cercana. La coincidencia ms cercana es en la que todos los parmetros son al menos cercanos como cualquier otra instancia sobrecargada, segn lo determina la profundidad de la herencia entre el subtipo y supertipo, y al menos un parmetro es ms cercana. En el caso de dos mtodos sobrecargados que coinciden, y algunos tipos de argumentos estn ms cerca en un procedimiento sobrecargado, mientras que otros estn ms cerca en el segundo procedimiento, se produce un error semntico. Si algunos parmetros difieren en su posicin dentro de la jerarqua de tipos de objeto, y otros parmetros son de diferentes tipos de datos, donde seria necesaria una conversin implcita, entonces se produce un error semntico.

El ejemplo crea una jerarqua de tipos que tiene tres niveles a partir del super_t. Hay un paquete con dos casos sobrecargados de una funcin que son los mismos a excepcin de la posicin del tipo de argumento en la jerarqua de tipos. En la llamada se declara una variable de tipo final_t , y luego llama a la funcin sobrecargada. En el ejemplo la funcin que se ejecuta es el que acepta un parmetro sub_t , porque sub_t est ms cerca de final_t que super_t en la jerarqua. Esto sigue las reglas de sustitucin. Tenga en cuenta que debido a la determinacin de la instancia que se pasa a llamar en tiempo de compilacin, el hecho de que el argumento que se pasa en la era tambin un final_t se ignora. Si la declaracin fuese v super_t : =final_t (1,2,3) , se llamara la funcin sobrecargada con el argumento de super_t.

Resolver PL / SQL Funciones con herencia


CREATE OR REPLACE TYPE super_t AS OBJECT (n NUMBER) NOT final; / CREATE OR REPLACE TYPE sub_t UNDER super_t (n2 NUMBER) NOT final; / CREATE OR REPLACE TYPE final_t UNDER sub_t (n3 NUMBER); / CREATE OR REPLACE PACKAGE p IS FUNCTION func (arg super_t) RETURN NUMBER; FUNCTION func (arg sub_t) RETURN NUMBER; END; /

CREATE OR REPLACE PACKAGE BODY p IS FUNCTION func (arg super_t) RETURN NUMBER IS BEGIN RETURN 1; END; FUNCTION func (arg sub_t) RETURN NUMBER IS BEGIN RETURN 2; END; END; / DECLARE v final_t := final_t(1,2,3); BEGIN DBMS_OUTPUT.PUT_LINE(p.func(v)); END; /

-- prints 2

En el ejemplo siguiente, la instancia que se pasa determina la llamada en tiempo de ejecucin debido a que las funciones miembro se sustituyen en la jerarqua de tipos. Este es el envo mtodo dinmico. A pesar de v es una instancia de super_t , porque el valor de final_t se asigna a v, se llama a la funcin de la instancia sub_t , siguiendo las reglas de sustitucin.

La resolucin de Funciones PL / SQL Con la herencia de forma dinmica


-- DROP PACKAGE p; -- DROP TYPE final_t; -- DROP TYPE _sub_t; -- DROP TYPE super_t FORCE; CREATE OR REPLACE TYPE super_t AS OBJECT (n NUMBER, MEMBER FUNCTION func RETURN NUMBER) NOT final; / CREATE OR REPLACE TYPE BODY super_t AS MEMBER FUNCTION func RETURN NUMBER IS BEGIN RETURN 1; END; END; / CREATE TYPE sub_t UNDER super_t (n2 NUMBER, OVERRIDING MEMBER FUNCTION func RETURN NUMBER) NOT final; / CREATE OR REPLACE TYPE BODY sub_t AS OVERRIDING MEMBER FUNCTION func RETURN NUMBER IS BEGIN RETURN 2; END; END; / CREATE OR REPLACE TYPE final_t UNDER sub_t (n3 NUMBER); / DECLARE v super_t := final_t(1,2,3); BEGIN DBMS_OUTPUT.PUT_LINE('answer:'|| v.func); -- prints 2 END; /

Uso de SQL dinmico con objetos


SQL dinmico es una funcin de PL / SQL que le permite introducir la informacin de SQL en tiempo de ejecucin, tales como: nombre de la tabla, el texto completo de una sentencia SQL, o la informacin variable.

El ejemplo ilustra el uso de objetos y colecciones con SQL dinmico. En primer lugar, el ejemplo se define el tipo de objeto person_typ y el VARRAY tipo hobbies_var , entonces se define el paquete, teams , que utiliza este tipo.Necesita AUTHID CURRENT_USER para ejecutar mtodos dinmicos de paquetes, de lo contrario, estos mtodos producen un error privilegios insuficientes cuando se ejecuta.

Un paquete que utiliza SQL dinmico para los tipos de objetos y colecciones
CREATE OR REPLACE TYPE person_typ AS OBJECT (name VARCHAR2(25), age NUMBER); / CREATE TYPE hobbies_var AS VARRAY(10) OF VARCHAR2(25); / CREATE OR REPLACE PACKAGE teams AUTHID CURRENT_USER AS PROCEDURE create_table (tab_name VARCHAR2); PROCEDURE insert_row (tab_name VARCHAR2, p person_typ, h hobbies_var); PROCEDURE print_table (tab_name VARCHAR2); END; / CREATE OR REPLACE PACKAGE BODY teams AS PROCEDURE create_table (tab_name VARCHAR2) IS BEGIN EXECUTE IMMEDIATE 'CREATE TABLE ' || tab_name || ' (pers person_typ, hobbs hobbies_var)'; END; PROCEDURE insert_row ( tab_name VARCHAR2, p person_typ, h hobbies_var) IS BEGIN EXECUTE IMMEDIATE 'INSERT INTO ' || tab_name || ' VALUES (:1, :2)' USING p, h; END; PROCEDURE print_table (tab_name VARCHAR2) IS TYPE refcurtyp IS REF CURSOR; v_cur refcurtyp; p person_typ; h hobbies_var; BEGIN OPEN v_cur FOR 'SELECT pers, hobbs FROM ' || tab_name; LOOP FETCH v_cur INTO p, h; EXIT WHEN v_cur%NOTFOUND; -- print attributes of 'p' and elements of 'h' DBMS_OUTPUT.PUT_LINE('Name: ' || p.name || ' - Age: ' || p.age); FOR i IN h.FIRST..h.LAST LOOP DBMS_OUTPUT.PUT_LINE('Hobby(' || i || '): ' || h(i)); END LOOP; END LOOP; CLOSE v_cur; END; END; /

Desde un bloque sin nombre, que se podra llamar los procedimientos en paquetes teams :

Llamada a procedimientos desde el paquete EQUIPOS

DECLARE team_name VARCHAR2(15); BEGIN team_name := 'Notables'; TEAMS.create_table(team_name); TEAMS.insert_row(team_name, person_typ('John', 31), hobbies_var('skiing', 'coin collecting', 'tennis')); TEAMS.insert_row(team_name, person_typ('Mary', 28), hobbies_var('golf', 'quilting', 'rock climbing', 'fencing')); TEAMS.print_table (team_name); END; /