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.

Resum

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.