Oracle Tutorial de tipos de objetos PL/SQL con EJEMPLOS
ยฟ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. Se organizan en torno a โobjetosโ en lugar de โaccionesโ, es decir, los programas estรกn diseรฑados para funcionar e interactuar con el objeto en su totalidad en lugar de con una sola acciรณn. Este concepto permite al programador completar y manipular los detalles a nivel de entidades de objetos.
La siguiente imagen muestra un ejemplo del tipo de objeto en el que una cuenta bancaria se considera una entidad objeto. Los atributos del objeto incluyen cosas que contienen algunos valores de atributos, por ejemplo en la cuenta bancaria; es el nรบmero de cuenta, el saldo bancario, etc., mientras que los mรฉtodos de objeto describen cosas como calcular la tasa de interรฉs, generar un extracto bancario, etc., lo que requiere que se complete cierto proceso.
En PL/SQL la programaciรณn orientada a objetos se basa en tipos de objetos.
Un tipo de objeto puede representar cualquier entidad del mundo real. Vamos a discutir mรกs tipos de objetos en este capรญtulo.
Componentes de tipos de objetos
PL / SQL El tipo de objeto contiene principalmente dos componentes.
- Atributos
- Miembros/Mรฉtodos
Atributos
Los atributos son la columna o campo en el que se almacenan los datos. Cada atributo se asignarรก al tipo de datos que define el tipo de procesamiento y almacenamiento de ese atributo. El atributo puede ser de cualquier valor 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 que se definen en el tipo de objeto. No se utilizan para almacenar ningรบn dato. Se utilizan principalmente para definir procesos dentro del tipo de objeto. Para ver ejemplos de validaciรณn de datos antes de completar el tipo de objeto. Se declaran en la secciรณn de tipo de objeto y se definen en la secciรณn del cuerpo del tipo de objeto del tipo de objeto. La secciรณn del cuerpo en el tipo de objeto es una parte opcional. Si no hay miembros presentes, entonces un tipo de objeto no contendrรก ninguna parte del cuerpo.
Crear objeto en Oracle
Un tipo de objeto no se puede crear a nivel de subprograma. Solo se pueden crear a nivel de esquema. Una vez que el tipo de objeto estรก definido en el esquema, el mismo se puede utilizar en subprogramas. El tipo de objeto se puede crear usando 'CREAR TIPO'. El cuerpo del tipo se puede crear sรณlo despuรฉs de crear su tipo de objeto.
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 'OBJECT' con atributos y 'OBJECT-BODY' 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 en PL/SQL, los tipos de objetos tambiรฉn deben declararse antes de usarlos en el programa.
Una vez creado el tipo de objeto, se puede utilizar en la secciรณn declarativa del subprograma para declarar una variable de ese tipo de objeto.
Siempre que se declara una variable en el subprograma como tipo de objeto, en tiempo de ejecuciรณn se crearรก una nueva instancia del tipo de objeto, y esta instancia reciรฉn creada se puede referir al nombre de la variable. De esta manera, un รบnico tipo de objeto puede almacenar mรบltiples valores en diferentes instancias.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Explicaciรณn de sintaxis:
- La sintaxis anterior muestra la declaraciรณn de una variable como tipo de objeto en la secciรณn declarativa.
Una vez que la variable se declara como un tipo de objeto en un subprograma, serรก nula de forma atรณmica, es decir, el objeto entero serรก nulo. Debe inicializarse con valores para poder usarlos en el programa. Se pueden inicializar 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 del tipo de objeto. La siguiente sintaxis muestra la inicializaciรณn del 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.
- Ahora el objeto en sรญ no es nulo porque se ha inicializado, pero los atributos dentro del objeto serรกn nulos ya que no hemos asignado ningรบn valor a estos atributos.
Constructores
Los constructores son el mรฉtodo implรญcito de un objeto al que se puede hacer referencia con el mismo nombre que el del tipo de objeto. Siempre que se haga referencia al objeto por primera vez, se llamarรก implรญcitamente a este constructor.
Tambiรฉn podemos inicializar los objetos usando este constructor. El constructor se puede definir explรญcitamente definiendo el miembro en el cuerpo del tipo de objeto con el mismo nombre del tipo de objeto.
Ejemplo :En el siguiente ejemplo, vamos a utilizar el miembro de tipo objeto para insertar el registro en la tabla emp con los valores ('RRR', 1005, 20000, 1000) y ('PPP', 1006, 20000, 1001). Una vez que se insertan los datos, los mostraremos utilizando el miembro de tipo objeto. Tambiรฉn vamos a utilizar el constructor explรญcito para completar el ID del administrador de forma predeterminada con el valor 1001 para el segundo registro.
Lo ejecutaremos en los pasos siguientes.
- Step1:
- Crear tipo de objeto
- Cuerpo tipo objeto
- Paso 2: Crear un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor implรญcito para emp_no 1005.
- Paso 3: Crear un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor explรญcito para emp_no 1006.
Paso 1) Crear tipo de objeto y cuerpo de tipo de objeto
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); /
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.managerial:=1001;
RETURN;
END:
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_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:
/
Explicaciรณn del cรณdigo
- Lรญnea de cรณdigo 1-9: Creando el tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definiciรณn de constructores con sรณlo 3 parรกmetros. (El constructor implรญcito real contendrรก la cantidad de parรกmetros igual a la cantidad de atributos presentes en el tipo de objeto)
- Lรญnea de cรณdigo 10: Creaciรณn del cuerpo tipogrรกfico.
- Lรญnea de cรณdigo 11-21: Definiciรณn del constructor explรญcito. Asignar el valor del parรกmetro a los atributos y asignar el valor del atributo 'gerente' con el valor predeterminado '1001'.
- Lรญnea de cรณdigo 22-26: Definir el miembro 'insert_records' en el que los valores de los atributos se insertan en la tabla 'emp'.
- Lรญnea de cรณdigo 27-34: Definir el miembro 'display_records' en el que se muestran los valores de los atributos del tipo de objeto.
Salida
Tipo creado
Tipo cuerpo creado
Paso 2) Creaciรณn de un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor implรญcito para emp_no 1005
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;
Explicaciรณn del cรณdigo
- Lรญnea de cรณdigo 37-45: Insertar los registros usando el constructor implรญcito. La llamada al constructor contiene el nรบmero real de valores de atributos.
- Lรญnea de cรณdigo 38:Declara guru_emp_det como tipo de objeto de 'emp_object'.
- Lรญnea de cรณdigo 41: La declaraciรณn 'guru_emp_det.display_records' se llama funciรณn miembro 'diplay_records' y se muestran los valores de los atributos
- Lรญnea de cรณdigo 42: La declaraciรณn 'guru_emp_det.insert_records' se llama funciรณn miembro 'insert_records' y los valores de los atributos se insertan en la tabla.
Salida
Nombre del empleado: RRR
Nรบmero de empleado: 1005
Salario: 20000
Gerente: 1000
Paso 3) Creaciรณn de un bloque anรณnimo para llamar al tipo de objeto creado a travรฉs del constructor explรญcito para emp_no 1006
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; /
Salida
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 46-53: Insertar los registros usando el constructor explรญcito.
- Lรญnea de cรณdigo 46:Declara guru_emp_det como tipo de objeto de 'emp_object'.
- Lรญnea de cรณdigo 50: La declaraciรณn 'guru_emp_det.display_records' se llama funciรณn miembro 'display_records' y se muestran los valores de los atributos
- Lรญnea de cรณdigo 51: La declaraciรณn 'guru_emp_det.insert_records' se llama funciรณn miembro 'insert_records' y los valores de los atributos se insertan en la tabla.
Herencia en tipo de objeto
La propiedad de herencia permite que el tipo de subobjeto acceda a todos los atributos y miembros del tipo de superobjeto o del tipo de objeto principal.
El tipo de subobjeto se denomina tipo de objeto heredado y el tipo de superobjeto se denomina tipo de objeto principal. La siguiente sintaxis muestra cรณmo crear un tipo de objeto principal y heredado.
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.
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. Contiene todos los miembros y atributos del tipo de objeto principal.
Example1: En el siguiente ejemplo, vamos a utilizar la propiedad de herencia para insertar el registro con el ID de administrador como '1002' para el siguiente registro ('RRR', 1007, 20000).
Vamos a ejecutar el programa anterior en los siguientes pasos
- Paso 1: crea el tipo SUPER.
- Paso 2: crea el tipo SUB y el cuerpo.
- Paso 3: crear un bloque anรณnimo para llamar al tipo SUB.
Paso 1) Cree tipo SUPER o tipo padre.
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; /
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 1-9: Creando el tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definiciรณn de constructores con sรณlo 3 parรกmetros. Se ha declarado como "NO FINAL", por lo que es de tipo padre.
Paso 2) Cree el tipo SUB en el tipo SUPER.
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; /
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 10-13: Crear sub_emp_object como tipo heredado con un atributo adicional 'default_manager' y una declaraciรณn de procedimiento miembro.
- Lรญnea de cรณdigo 14: Crear el cuerpo para el tipo de objeto heredado.
- Lรญnea de cรณdigo 16-21: Definir el procedimiento miembro que inserta los registros en la tabla "emp" con los valores del tipo de objeto "SUPER", excepto el valor del administrador. Para el valor del administrador, se utiliza el tipo "default_manager" del tipo "SUB".
Paso 3) Creando un bloque anรณnimo para llamar al tipo SUB
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; /
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 25: Declarar 'guru_emp_det' como tipo 'sub_emp_object'.
- Lรญnea de cรณdigo 27: Inicializando el objeto con el constructor implรญcito. El constructor tiene 5 parรกmetros (4 atributos del tipo PARENT y 2 atributos del tipo SUB). El รบltimo parรกmetro (1002) define el valor del atributo default_manager
- Lรญnea de cรณdigo 28: Llamar al miembro 'insert_default_mgr' para insertar los registros con la identificaciรณn del administrador predeterminada pasada en el constructor.
Igualdad de objetos PL/SQL
La instancia de objeto que pertenece a los mismos objetos se puede comparar para determinar su igualdad. Para esto, necesitamos tener el mรฉtodo especial en el tipo de objeto llamado mรฉtodo 'ORDER'.
Este mรฉtodo 'ORDEN' deberรญa ser la funciรณn que devuelva el tipo numรฉrico. Toma dos parรกmetros como entrada (primer parรกmetro: identificaciรณn de la instancia del objeto propio, segundo parรกmetro: identificaciรณn de otra instancia del objeto).
Se compara la identificaciรณn de la instancia de dos objetos y el resultado se devuelve en formato numรฉrico.
- El valor positivo representa que la instancia del objeto SELF es mayor que otra instancia.
- El valor negativo representa que la instancia del objeto SELF es menor que otra instancia.
- Cero representa que la instancia del objeto SELF es igual a otra instancia.
- Si alguna de las instancias es nula, esta funciรณn devolverรก nulo.
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 PEDIDO que debe incluirse en el cuerpo del tipo para verificar la igualdad.
- El parรกmetro para esta funciรณn debe ser una instancia del mismo tipo de objeto.
- La funciรณn anterior se puede llamar como "obj_instance_1.match(obj_instance_2)" y esta expresiรณn devolverรก el valor numรฉrico como se muestra, donde obj_instance_1 y obj_instance_2 son la instancia de object_type_name.
Ejemplo1:En el siguiente ejemplo vamos a ver cรณmo comparar dos objetos. Vamos a crear dos instancias y vamos a comparar el atributo 'salario' entre ellas. Vamos a realizar dos pasos int.
- Paso 1: Crear el tipo de objeto y el cuerpo.
- Paso 2: Crear el bloque anรณnimo para llamar a comparar la instancia del objeto.
Paso 1) Creando el tipo de objeto y el cuerpo.
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; /
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 1-4: Creando el tipo de objeto 'emp_object_equality' con 1 atributo y 1 miembro.
- Lรญnea de cรณdigo 6-16: Definiciรณn de la funciรณn ORDER que compara el atributo 'salary' de la instancia SELF y el tipo de instancia del parรกmetro. Devuelve un valor negativo si el salario de SELF es menor o positivo si el salario de SELF es mayor y 0 si los salarios son iguales.
Salida de cรณdigo:
Tipo creado
Paso 2) Creando el bloque anรณnimo para llamar a comparar la instancia del objeto.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=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_l.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; /
Salida
Salary of second instance is greater
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 20: Declarar l_obj_1 de tipo emp_object_equality.
- Lรญnea de cรณdigo 21: Declarar l_obj_2 de tipo emp_object_equality.
- Lรญnea de cรณdigo 23: Inicializando l_obj_1 con valor de salario como '15000'
- Lรญnea de cรณdigo 24: Inicializando l_obj_1 con valor de salario como '17000'
- Lรญnea de cรณdigo 25-33: Imprime el mensaje segรบn el nรบmero de devoluciรณn de la funciรณn PEDIDO.
Resumen
En este capรญtulo, hemos visto el tipo de objeto y sus propiedades. Tambiรฉn hemos hablado sobre constructores, miembros, atributos, herencia e igualdad en objetos PL/SQL.


















