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.



















