Oracle Tipos de objetos PL/SQL: CREATE TYPE con ejemplos
โก Resumen inteligente
Los tipos de objetos en PL/SQL traen la programaciรณn orientada a objetos a Oracle, lo que permite modelar entidades del mundo real con atributos y mรฉtodos. Admiten constructores, herencia y comparaciรณn de igualdad, de modo que un รบnico tipo a nivel de esquema puede almacenar y procesar datos estructurados.

ยฟQuรฉ es el tipo de objeto en PL/SQL?
La programaciรณn orientada a objetos es especialmente adecuada para crear componentes reutilizables y aplicaciones complejas. Los programas se organizan en torno a "objetos" en lugar de "acciones"; es decir, estรกn diseรฑados para trabajar e interactuar con un objeto completo en lugar de con una sola acciรณn. Este enfoque permite al programador completar y manipular detalles a nivel de objeto-entidad.
La imagen que aparece a continuaciรณn muestra un ejemplo de un tipo de objeto en el que una cuenta bancaria se trata como una entidad. Los atributos del objeto contienen valores (en el caso de una cuenta bancaria, estos son el nรบmero de cuenta, el saldo, etc.), mientras que los mรฉtodos del objeto describen acciones como calcular el tipo de interรฉs o generar un extracto bancario, cada una de las cuales requiere la finalizaciรณn de un proceso.
In PL / SQLLa programaciรณn orientada a objetos se basa en tipos de objetos. Un tipo de objeto puede representar cualquier entidad del mundo real. Las siguientes secciones exploran los tipos de objetos, sus componentes y cรณmo crearlos y utilizarlos.
Componentes de tipos de objetos
Un tipo de objeto PL/SQL contiene principalmente dos componentes.
- Atributos
- Miembros/Mรฉtodos
Atributos
Los atributos son las columnas o campos en los que se almacenan los datos. Cada atributo se asigna al tipo de dato que define el tipo de procesamiento y almacenamiento para ese atributo. Un atributo puede ser de cualquier tipo vรกlido. tipo de datos PL/SQL, o puede ser de otro tipo de objeto.
Miembros/Mรฉtodos
Los miembros o mรฉtodos son subprogramas Se definen dentro del tipo de objeto. No se utilizan para almacenar datos; en cambio, definen el procesamiento que se realiza dentro del tipo de objeto, por ejemplo, la validaciรณn de datos antes de rellenar el objeto. Se declaran en la especificaciรณn del tipo de objeto y se definen en el cuerpo del mismo. El cuerpo es opcional: si no contiene miembros, el tipo de objeto carece de cuerpo.
Crear objeto en Oracle
Un tipo de objeto no se puede crear a nivel de subprograma; solo se puede crear a nivel de esquema. Una vez definido en el esquema, se puede utilizar en subprogramas. El tipo de objeto se crea mediante la instrucciรณn "CREATE TYPE", y el cuerpo del tipo solo se puede crear despuรฉs de que exista el tipo de objeto.
Las capturas de pantalla que aparecen a continuaciรณn muestran la sintaxis CREATE TYPE para la especificaciรณn del objeto y la sintaxis CREATE TYPE BODY que define sus mรฉtodos.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la creaciรณn de un OBJETO con atributos y un CUERPO DE OBJETO con mรฉtodos.
- Los mรฉtodos tambiรฉn pueden sobrecargarse en el cuerpo del objeto.
Inicializaciรณn de declaraciรณn de tipo de objeto
Al igual que otros componentes de PL/SQL, los tipos de objeto deben declararse antes de usarse en un programa. Una vez creado el tipo de objeto, se puede usar en la secciรณn declarativa de un subprograma para declarar una variable de ese tipo.
Cuando una variable se declara como un tipo de objeto, en tiempo de ejecuciรณn se crea una nueva instancia de dicho tipo, a la que se hace referencia mediante el nombre de la variable. De esta forma, un รบnico tipo de objeto puede almacenar mรบltiples valores en diferentes instancias.
La captura de pantalla a continuaciรณn muestra una variable que se declara como un tipo de objeto dentro de un Bloque PL / SQL.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la declaraciรณn de un variable como un tipo de objeto en la secciรณn declarativa.
Una vez que la variable se declara como un objeto en una subrutina, es atรณmicamente nula; el objeto en sรญ mismo es nulo. Debe inicializarse con valores antes de poder usarse en el programa. Los objetos se inicializan mediante constructores.
Los constructores son el mรฉtodo implรญcito de un objeto, al que se puede hacer referencia con el mismo nombre que el tipo de objeto. La siguiente captura de pantalla muestra la inicializaciรณn de una instancia de un tipo de objeto.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la inicializaciรณn de la instancia del tipo de objeto con un valor nulo.
- Una vez inicializado, el objeto en sรญ deja de ser nulo, pero los atributos que contiene permanecen nulos hasta que se les asignan valores.
Constructores
Los constructores son el mรฉtodo implรญcito de un objeto al que se puede hacer referencia con el mismo nombre que el tipo de objeto. Siempre que se hace referencia al objeto por primera vez, este constructor se llama implรญcitamente.
Tambiรฉn puede inicializar objetos utilizando estos constructores. Un constructor se puede definir explรญcitamente definiendo un miembro en el cuerpo del tipo de objeto con el mismo nombre que el tipo de objeto.
Ejemplo 1: En el siguiente ejemplo, utilizamos el miembro de tipo objeto para insertar registros en la tabla emp con los valores ('RRR', 1005, 20000, 1000) y ('PPP', 1006, 20000, 1001). Una vez insertados los datos, los mostramos utilizando el miembro de tipo objeto. Tambiรฉn utilizamos un constructor explรญcito para asignar el ID del gerente al valor predeterminado 1001 para el segundo registro.
Lo ejecutamos siguiendo los siguientes pasos.
- Paso 1: Cree el tipo de objeto y el cuerpo del tipo de objeto.
- Paso 2: Cree un bloque anรณnimo para llamar al tipo de objeto a travรฉs del constructor implรญcito para emp_no 1005.
- Paso 3: Cree un bloque anรณnimo para llamar al tipo de objeto a travรฉs del constructor explรญcito para emp_no 1006.
Paso 1) Cree el tipo de objeto y el cuerpo del tipo de objeto.
La captura de pantalla que aparece a continuaciรณn muestra la creaciรณn de la especificaciรณn del tipo de objeto emp_object con sus atributos y miembros.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
La captura de pantalla que aparece a continuaciรณn muestra cรณmo se crea el cuerpo del tipo emp_object con el constructor explรญcito y los procedimientos miembro.
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line('Constructor fired..'); SELF.emp_no:=p_emp_no; SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary:'||salary); Dbms_output.put_line('Manager:'||manager); END; END; /
Code Explicaciรณn
- Code lรญneas 1-9: Se crea el tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definiciรณn de un constructor con solo 3 parรกmetros. (El constructor implรญcito real contiene un nรบmero de parรกmetros igual al nรบmero de atributos presentes en el tipo de objeto).
- Code lรญnea 10: Creando el cuerpo del texto.
- Code lรญneas 11-21: Definir el constructor explรญcito. Asignar los valores de los parรกmetros a los atributos y asignar al atributo 'manager' el valor predeterminado '1001'.
- Code lรญneas 22-26: Definir el miembro 'insert_records', en el que se insertan los valores de los atributos en la tabla 'emp'.
- Code lรญneas 27-34: Definir el miembro 'display_records', que muestra los valores de los atributos del tipo de objeto.
Salida:
Tipo creado
Tipo cuerpo creado
Paso 2) Creando un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor implรญcito para emp_no 1005.
La captura de pantalla que aparece a continuaciรณn muestra el bloque anรณnimo que llama a emp_object a travรฉs del constructor implรญcito.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,'RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Code Explicaciรณn
- Code lรญneas 37-45: Insertar los registros usando el constructor implรญcito. La llamada al constructor contiene el nรบmero real de valores de atributos.
- Code lรญnea 38: Declara 'guru_emp_det' como tipo de objeto 'emp_object'.
- Code lรญnea 41: La instrucciรณn 'guru_emp_det.display_records' llama al miembro 'display_records' y se muestran los valores de los atributos.
- Code lรญnea 42: La instrucciรณn 'guru_emp_det.insert_records' llama al miembro 'insert_records' y los valores de los atributos se insertan en la tabla. Luego, el bloque confirma la transacciรณn. transaccional.
Salida:
Nombre del empleado: RRR
Nรบmero de empleado: 1005
Salario: 20000
Gerente: 1000
Paso 3) Creando un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor explรญcito para emp_no 1006.
La captura de pantalla que aparece a continuaciรณn muestra el bloque anรณnimo que llama a emp_object a travรฉs del constructor explรญcito con tres argumentos.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
Resultado
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Explicaciรณn:
- Code lรญneas 46-53: Insertar el registro utilizando el constructor explรญcito.
- Code lรญnea 46: Declara 'guru_emp_det' como tipo de objeto 'emp_object'.
- Code lรญnea 50: La instrucciรณn 'guru_emp_det.display_records' llama al miembro 'display_records' y se muestran los valores de los atributos.
- Code lรญnea 51: La instrucciรณn 'guru_emp_det.insert_records' llama al miembro 'insert_records' y los valores de los atributos se insertan en la tabla. Dado que solo se pasan tres argumentos, el constructor explรญcito establece el ID del gerente a su valor predeterminado 1001.
Herencia en tipo de objeto
La propiedad de herencia permite que un subtipo de objeto acceda a todos los atributos y miembros del supertipo de objeto, o tipo de objeto padre.
El tipo de subobjeto se denomina tipo de objeto heredado, y el tipo de superobjeto se denomina tipo de objeto padre. La sintaxis que se muestra a continuaciรณn ilustra cรณmo crear tipos de objeto padre e heredado. La siguiente captura de pantalla muestra la sintaxis del tipo padre (SUPER) marcada como NO DEFINITIVA.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la creaciรณn del tipo SUPER. La clรกusula NOT FINAL permite que el tipo se herede.
La captura de pantalla que aparece a continuaciรณn muestra la sintaxis del tipo heredado (SUB) creada con la palabra clave UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la creaciรณn del tipo SUB. Este contiene todos los miembros y atributos del tipo de objeto padre.
Ejemplo 1: En el siguiente ejemplo, usamos la propiedad de herencia para insertar un registro con el ID de administrador '1002' para el registro ('RRR', 1007, 20000). Ejecutamos el programa en los siguientes pasos.
- Paso 1: Crear el tipo SUPER.
- Paso 2: Cree el tipo SUB y el cuerpo.
- Paso 3: Crea un bloque anรณnimo para llamar al tipo SUB.
Paso 1) Cree un tipo SUPER o un tipo Padre.
La captura de pantalla que aparece a continuaciรณn muestra cรณmo se crea el supertipo emp_object con la clรกusula NOT FINAL.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Code Explicaciรณn:
- Code lรญneas 1-9: Se crea el tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definiciรณn de un constructor con solo 3 parรกmetros. Se ha declarado como 'NOT FINAL', por lo que es un tipo padre.
Paso 2) Cree un tipo SUB dentro del tipo SUPER.
La captura de pantalla que aparece a continuaciรณn muestra el tipo heredado sub_emp_object y la creaciรณn de su cuerpo.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; END; /
Code Explicaciรณn:
- Code lรญneas 10-13: Se crea 'sub_emp_object' como tipo heredado con un atributo adicional 'default_manager' y una declaraciรณn de procedimiento miembro.
- Code lรญnea 14: Creando el cuerpo para el tipo de objeto heredado.
- Code lรญneas 16-21: Definir el procedimiento miembro que inserta registros en la tabla 'emp' con los valores del tipo de objeto SUPER, excepto el valor del gerente. Para el valor del gerente, se utiliza 'default_manager' del tipo SUB.
Paso 3) Crear un bloque anรณnimo para llamar al tipo SUB.
La captura de pantalla que aparece a continuaciรณn muestra el bloque anรณnimo que llama al tipo SUB e inserta el ID de administrador predeterminado.
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Code Explicaciรณn:
- Code lรญnea 25: Declarando 'guru_emp_det' como tipo 'sub_emp_object'.
- Code lรญnea 27: Inicializando el objeto con el constructor implรญcito. El constructor tiene 5 parรกmetros (4 atributos del tipo PARENT y 1 atributo del tipo SUB). El รบltimo parรกmetro (1002) define el valor del atributo default_manager.
- Code lรญnea 28: Se llama al miembro 'insert_default_mgr' para insertar el registro con el ID de administrador predeterminado pasado en el constructor.
Igualdad de objetos PL/SQL
Se pueden comparar instancias de objetos que pertenecen al mismo tipo de objeto para comprobar si son iguales. Para ello, el tipo de objeto necesita un mรฉtodo especial llamado mรฉtodo ORDER.
Este mรฉtodo ORDER debe ser una funciรณn que devuelva un tipo numรฉrico. Recibe dos parรกmetros como entrada (primer parรกmetro: el ID de la instancia del objeto mismo; segundo parรกmetro: el ID de otra instancia de objeto).
Se comparan los identificadores de las dos instancias de objeto y el resultado se devuelve como un nรบmero.
- Un valor positivo indica que la instancia del objeto SELF es mayor que la otra instancia.
- Un valor negativo indica que la instancia del objeto SELF es menor que la otra instancia.
- El valor cero indica que la instancia del objeto SELF es igual a la otra instancia.
- Si alguna de las instancias es nula, la funciรณn devuelve nulo.
La captura de pantalla que aparece a continuaciรณn muestra la sintaxis de la funciรณn miembro ORDER que debe incluirse en el cuerpo del tipo para la comprobaciรณn de igualdad.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; --any positive number will do ELSE RETURN 0; END IF; END; . . ); /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la funciรณn ORDER que debe incluirse en el cuerpo del tipo para la comprobaciรณn de igualdad.
- El parรกmetro para esta funciรณn debe ser una instancia del mismo tipo de objeto.
- La funciรณn se puede llamar como โobj_instance_1.match(obj_instance_2)โ, y esta expresiรณn devuelve el valor numรฉrico mostrado, donde obj_instance_1 y obj_instance_2 son instancias del tipo de objeto.
Ejemplo 1: En el siguiente ejemplo, comparamos dos objetos. Creamos dos instancias y comparamos el atributo 'salario' entre ellas. Lo hacemos en dos pasos.
- Paso 1: Cree el tipo de objeto y el cuerpo.
- Paso 2: Crea el bloque anรณnimo para comparar las instancias de objetos.
Paso 1) Creaciรณn del tipo de objeto y del cuerpo.
Las capturas de pantalla que aparecen a continuaciรณn muestran la especificaciรณn emp_object_equality y su cuerpo, que define la funciรณn ORDER que compara el atributo salary.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF; END; END; /
Code Explicaciรณn:
- Code lรญneas 1-4: Creaciรณn del tipo de objeto 'emp_object_equality' con 1 atributo y 1 miembro.
- Code lรญneas 6-16: Se define la funciรณn ORDER que compara el atributo 'salario' de la instancia SELF con el de la instancia del parรกmetro. Devuelve un valor negativo si el salario de SELF es menor, un valor positivo si es mayor y 0 si son iguales.
Code Salida:
Tipo creado
Paso 2) Crear el bloque anรณnimo para comparar las instancias de objetos.
La captura de pantalla que aparece a continuaciรณn muestra el bloque anรณnimo que compara dos instancias de emp_object_equality por salario.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equals(l_obj_2)>0 THEN Dbms_output.put_line('Salary of first instance is greater'); ELSIF l_obj_1.equals(l_obj_2)<0 THEN Dbms_output.put_line('Salary of second instance is greater'); ELSE Dbms_output.put_line('Salaries are equal'); END IF; END; /
Resultado
Salary of second instance is greater
Code Explicaciรณn:
- Code lรญnea 20: Declarando 'l_obj_1' de tipo 'emp_object_equality'.
- Code lรญnea 21: Declarando 'l_obj_2' de tipo 'emp_object_equality'.
- Code lรญnea 23: Inicializando 'l_obj_1' con el valor salarial '15000'.
- Code lรญnea 24: Inicializando 'l_obj_2' con el valor salarial '17000'.
- Code lรญneas 25-33: Imprimir el mensaje en funciรณn del nรบmero devuelto por la funciรณn ORDER.


















