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.

Tipos de objetos en PL/SQL

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.

  1. Atributos
  2. 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.

Crear objeto en OracleCrear objeto en Oracle

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.

Inicializaciรณn de declaraciรณn de tipo de objeto

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.

Inicializaciรณn de declaraciรณn de 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

Constructores

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);
/

Constructores

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

Constructores

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

Constructores

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.

Herencia en tipo de objeto

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.

Herencia en tipo de objeto

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.

Herencia en 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(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.

Herencia en tipo de objeto

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

Herencia en tipo de objeto

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.

Igualdad de objetos PL/SQL

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.

Igualdad de objetos PL/SQL

Igualdad de objetos PL/SQL

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.

Igualdad de objetos PL/SQL

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.

Resumir este post con: