Tutorial de tipos de objetos de Oracle 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. Están organizados en torno a "objetos" en lugar de "acciones", es decir, los programas están diseñados para trabajar e interactuar con el objeto completo en lugar de la acción única. Este concepto permite al programador completar y manipular los detalles a nivel de entidades de objeto.

La siguiente imagen muestra un ejemplo del tipo de objeto en el que una cuenta bancaria se considera una entidad de objeto. Los atributos de objeto incluyen cosas que contienen algunos valores de atributo, por ejemplo, en 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.

En este tutorial, aprenderá,

  • Componentes de los tipos de objetos
  • Crear objeto en Oracle
  • Declaración de inicialización del tipo de objeto
  • Constructores
  • Herencia en el tipo de objeto
  • Igualdad de objetos PL / SQL

Componentes de los tipos de objetos

El tipo de objeto PL / SQL contiene principalmente dos componentes.

  1. Atributos
  2. Miembros / Métodos

Atributos

Los atributos son la columna o el campo en el que se almacenan los datos. Cada atributo se asignará al tipo de datos que define el tipo de procesamiento y almacenamiento para ese atributo. El atributo puede ser de cualquier tipo de datos PL / SQL válido 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 de 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, un tipo de objeto no contendrá ninguna parte del cuerpo.

Crear objeto en Oracle

No se puede crear un tipo de objeto a nivel de subprograma. Solo se pueden crear a nivel de esquema. Una vez que se define el tipo de objeto en el esquema, se puede utilizar el mismo en los subprogramas. El tipo de objeto se puede crear usando 'CREAR TIPO'. El cuerpo del tipo se puede crear solo después de crear su tipo de objeto.

CREATE TYPE AS OBJECT(,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION]ISBEGINEND;‭… ‬);/

Explicación de la sintaxis:

  • La sintaxis anterior muestra la creación de 'OBJECT' con atributos y 'OBJECT-BODY' con métodos.
  • Los métodos también se pueden sobrecargar en el cuerpo del objeto.

Declaración de inicialización del 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 que se crea el tipo de objeto, se puede usar en la sección declarativa del subprograma para declarar una variable de ese tipo de objeto.

Siempre que se declare una variable en el subprograma como tipo de objeto, en el 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 solo tipo de objeto puede almacenar múltiples valores en diferentes instancias.

DECLARE ;BEGIN… END;/

Explicación de la sintaxis:

  • La sintaxis anterior muestra la declaración de una variable como un tipo de objeto en la sección declarativa.

Una vez que la variable se declara como un tipo de objeto en un subprograma, será atómicamente nula, es decir, todo el objeto en sí mismo será nulo. Debe inicializarse con valores para 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 ;BEGIN:=();END;/

Explicación de la 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 ya que 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, este constructor se llamará implícitamente.

También podemos inicializar los objetos usando estos constructores. 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 1 : En el siguiente ejemplo, usaremos el miembro de tipo de objeto para insertar el registro en la tabla emp con valores ('RRR', 1005, 20000, 1000) y ('PPP', 1006, 20000, 1001). Una vez que se insertan los datos, vamos a mostrar los mismos usando el miembro de tipo de objeto. También vamos a utilizar el constructor explícito para completar la identificación del administrador de forma predeterminada con el valor 1001 para el segundo registro.

Lo ejecutaremos en los siguientes pasos.

  • Paso 1:
    • Crear tipo de objeto
    • Cuerpo del tipo de 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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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 : Creación del tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definición de constructores con solo 3 parámetros. (El constructor implícito real contendrá el número de parámetros igual al número de atributos presentes en el tipo de objeto)
  • Línea de código 10 : Creación del cuerpo del tipo.
  • 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 'administrador' con el valor predeterminado '1001'.
  • Línea de código 22-26 : Definición del miembro 'insert_records' en el que los valores de los atributos se insertan en la tabla 'emp'.
  • Línea de código 27-34 : Definición del miembro 'display_records' en el que se muestran los valores de los atributos del tipo de objeto.

Producción

Tipo creado

Tipo de cuerpo creado

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

DECLAREguru_emp_det emp_object;BEGINguru_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 : Declaración 'guru_emp_det.display_records' llamada 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' llamó a la función miembro 'insert_records' y los valores de los atributos se insertan en la tabla.

Producción

Nombre del empleado: RRR

Número de empleado: 1005

Salario: 20000

Gerente: 1000

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

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/

Producción

Employee Name:PPPEmployee Number:1006Salary:20000Manager: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' llamó a la 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' llamó a la función miembro 'insert_records' y los valores de los atributos se insertan en la tabla.

Herencia en el 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 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  AS OBJECT(,… )NOT FINAL;/

Explicación de la sintaxis:

  • La sintaxis anterior muestra la creación del tipo SUPER.
CREATE TYPEUNDER(,.);/

Explicación de la sintaxis:

  • La sintaxis anterior muestra la creación del tipo SUB. Contiene todos los miembros y atributos del tipo de objeto principal.

Ejemplo 1: En el siguiente ejemplo, usaremos la propiedad de herencia para insertar el registro con la identificación del administrador como '1002' para el siguiente registro ('RRR', 1007, 20000).

Vamos a ejecutar el programa anterior en los siguientes pasos.

  • Paso 1: Cree el tipo SUPER.
  • Paso 2: crea el cuerpo y el tipo SUB.
  • Paso 3: Creación de un bloque anónimo para llamar al tipo SUB.

Paso 1) Cree el tipo SUPER o tipo principal.

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 : Creación del tipo de objeto 'emp_object' con 4 atributos y 3 miembros. Contiene la definición de constructores con solo 3 parámetros. Se ha declarado como 'NO FINAL', por lo que es de tipo padre.

Paso 2) Cree el tipo SUB en tipo SUPER.

CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/

Explicación del código:

  • Línea de código 10-13 : Creación de sub_emp_object como tipo heredado con un atributo adicional 'default_manager' y declaración de procedimiento de miembro.
  • Línea de código 14 : Creación del cuerpo para el tipo de objeto heredado.
  • Línea de código 1 6 -21 : Definición del procedimiento de miembro que está insertando los registros en la tabla "emp" con los valores del tipo de objeto 'SUPER', excepto el valor del administrador. Para el valor de administrador, está usando el 'default_manager' del tipo 'SUB'.

Paso 3) Creando un bloque anónimo para llamar al tipo SUB

DECLAREguru_emp_det sub_emp_object;BEGINguru_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 : Declarando '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 el ID de administrador predeterminado pasado en el constructor.

Igualdad de objetos PL / SQL

La instancia de objeto que pertenece a los mismos objetos se puede comparar por igualdad. Para esto, necesitamos tener el método especial en el tipo de objeto llamado método 'ORDER'.

Este método de 'ORDEN' debe ser la función que devuelve el tipo numérico. Toma dos parámetros como entrada (primer parámetro: id de la instancia de objeto propio, segundo parámetro: id de otra instancia de objeto).

Se compara el id de la instancia de dos objetos y el resultado se devuelve en forma numérica.

  • 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á nula.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match(
 object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/

Explicación de la sintaxis:

  • La sintaxis anterior muestra la función ORDER que debe incluirse en el cuerpo del tipo para la verificación de igualdad.
  • El parámetro de 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.

Example1 : 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 hacer dos pasos.

  • Paso 1: crear el tipo y el cuerpo del objeto.
  • Paso 2: Crear el bloque anónimo para llamar a comparar la instancia del objeto.

Paso 1) Crear el cuerpo y el tipo de objeto.

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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN‭ ‬IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF:‭ ‬END;END;/

Explicación del código:

  • Línea de código 1-4: Creación del 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 PEDIDO que compara el atributo 'salario' de la instancia SELF y el tipo de instancia del parámetro. Devuelve negativo si el salario PROPIO es menor o positivo si el salario PROPIO es mayor y 0 si los salarios son iguales.

Salida de código:

Tipo creado

Paso 2) Crear el bloque anónimo para llamar a comparar la instancia del objeto.

DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/

Producción

Salary of second instance is greater

Explicación del código:

  • Línea de código 20 : Declarando el tipo l_obj_1 de emp_object_equality.
  • Línea de código 21 : Declaración del tipo l_obj_2 de 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 : Imprima 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 de constructores, miembros, atributos, herencia e igualdad en objetos PL / SQL.

Articulos interesantes...