Paquete Oracle PL / SQL: tipo, especificación, cuerpo (ejemplo)

¿Qué es el paquete en Oracle?

El paquete PL / SQL es una agrupación lógica de un subprograma relacionado (procedimiento / función) en un solo elemento. Un paquete se compila y almacena como un objeto de base de datos que se puede utilizar más adelante.

En este tutorial, aprenderá:

  • Componentes de los paquetes
  • Especificación del paquete
  • Cuerpo del paquete
  • Elementos del paquete de referencia
  • Crear paquete en PL / SQL
  • Declaraciones futuras
  • Uso de cursores en paquete
  • Sobrecarga
  • Dependencia en paquetes
  • Información del paquete
  • ARCHIVO UTL - Una descripción general

Componentes de los paquetes

El paquete PL / SQL tiene dos componentes.

  • Especificación del paquete
  • Cuerpo del paquete

Especificación del paquete

La especificación del paquete consiste en una declaración de todas las variables públicas, cursores, objetos, procedimientos, funciones y excepciones.

A continuación se muestran algunas características de la especificación del paquete.

  • Se puede acceder a todos los elementos declarados en la especificación desde fuera del paquete. Estos elementos se conocen como elemento público.
  • La especificación del paquete es un elemento independiente, lo que significa que puede existir solo sin el cuerpo del paquete.
  • Siempre que un paquete ha hecho referencia, se crea una instancia del paquete para esa sesión en particular.
  • Una vez creada la instancia para una sesión, todos los elementos del paquete que se inician en esa instancia son válidos hasta el final de la sesión.

Sintaxis

CREATE [OR REPLACE] PACKAGE 
IS… END 

La sintaxis anterior muestra la creación de la especificación del paquete.

Cuerpo del paquete

Consiste en la definición de todos los elementos que están presentes en la especificación del paquete. También puede tener una definición de elementos que no están declarados en la especificación, estos elementos se denominan elementos privados y solo se pueden llamar desde dentro del paquete.

A continuación se muestran las características del cuerpo de un paquete.

  • Debe contener definiciones para todos los subprogramas / cursores que se han declarado en la especificación.
  • También puede tener más subprogramas u otros elementos que no estén declarados en la especificación. Estos se denominan elementos privados.
  • Es un objeto confiable y depende de la especificación del paquete.
  • El estado del cuerpo del paquete se vuelve 'No válido' siempre que se compila la especificación. Por lo tanto, es necesario volver a compilarlo cada vez que se compila la especificación.
  • Los elementos privados deben definirse primero antes de que se utilicen en el cuerpo del paquete.
  • La primera parte del paquete es la parte de declaración global. Esto incluye variables, cursores y elementos privados (declaración directa) que es visible para todo el paquete.
  • La última parte del paquete es la parte de inicialización del paquete que se ejecuta una vez cada vez que se hace referencia a un paquete por primera vez en la sesión.

Sintaxis:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • La sintaxis anterior muestra la creación del cuerpo del paquete.

Ahora veremos cómo hacer referencia a los elementos del paquete en el programa.

Elementos del paquete de referencia

Una vez que los elementos están declarados y definidos en el paquete, necesitamos referirnos a los elementos para usarlos.

Se puede hacer referencia a todos los elementos públicos del paquete llamando al nombre del paquete seguido del nombre del elemento separado por un punto, es decir, '. '.

La variable pública del paquete también se puede usar de la misma manera para asignar y obtener valores de ellos, es decir, '. '.

Crear paquete en PL / SQL

En PL / SQL cada vez que se hace referencia / llamada a un paquete en una sesión, se creará una nueva instancia para ese paquete.

Oracle proporciona una función para inicializar elementos del paquete o para realizar cualquier actividad en el momento de la creación de esta instancia a través de la 'Inicialización del paquete'.

Esto no es más que un bloque de ejecución que se escribe en el cuerpo del paquete después de definir todos los elementos del paquete. Este bloque se ejecutará siempre que se haga referencia a un paquete por primera vez en la sesión.

Sintaxis

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • La sintaxis anterior muestra la definición de inicialización del paquete en el cuerpo del paquete.

Declaraciones futuras

La declaración / referencia directa en el paquete no es más que declarar los elementos privados por separado y definirlos en la parte posterior del cuerpo del paquete.

Los elementos privados se pueden hacer referencia solo si ya están declarados en el cuerpo del paquete. Por esta razón, se utiliza la declaración hacia adelante. Pero su uso es bastante inusual porque en la mayoría de las veces los elementos privados se declaran y definen en la primera parte del cuerpo del paquete.

La declaración de reenvío es una opción proporcionada por Oracle, no es obligatoria y el uso y no uso depende de los requisitos del programador.

Sintaxis:

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGIN
;END 

La sintaxis anterior muestra una declaración hacia adelante. Los elementos privados se declaran por separado en la parte de reenvío del paquete y se han definido en la parte posterior.

Uso de cursores en paquete

A diferencia de otros elementos, uno debe tener cuidado al usar cursores dentro del paquete.

Si el cursor está definido en la especificación del paquete o en la parte global del cuerpo del paquete, el cursor una vez abierto persistirá hasta el final de la sesión.

Por lo tanto, siempre se deben usar los atributos del cursor '% ISOPEN' para verificar el estado del cursor antes de referirlo.

Sobrecarga

La sobrecarga es el concepto de tener muchos subprogramas con el mismo nombre. Estos subprogramas se diferenciarán entre sí por una serie de parámetros o tipos de parámetros o tipo de retorno, es decir, un subprograma con el mismo nombre pero con un número diferente de parámetros, un tipo diferente de parámetros o un tipo diferente se considera sobrecarga.

Esto es útil cuando muchos subprogramas necesitan hacer la misma tarea, pero la forma de llamar a cada uno de ellos debe ser diferente. En este caso, el nombre del subprograma se mantendrá igual para todos y los parámetros se cambiarán según la declaración de llamada.

Ejemplo 1 : En este ejemplo, vamos a crear un paquete para obtener y establecer los valores de la información del empleado en la tabla 'emp'. La función get_record devolverá la salida del tipo de registro para el número de empleado dado, y el procedimiento set_record insertará el registro del tipo de registro en la tabla emp.

Paso 1) Creación de la especificación del paquete

CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;END guru99_get_set:/

Producción:

Package created

Explicación del código

  • Línea de código 1-5 : Creación de la especificación del paquete para guru99_get_set con un procedimiento y una función. Estos dos son ahora elementos públicos de este paquete.

Paso 2) El paquete contiene el cuerpo del paquete, donde se definirán todos los procedimientos y funciones. En este paso, se crea el cuerpo del paquete.

CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);COMMIT;END set_record;FUNCTION get_record(p_emp_no IN NUMBER)RETURN emp%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN l_emp_rec;END get_record;BEGUN dbms_output.put_line(‘Control is now executing the package initialization part');END guru99_get_set:/

Producción:

Package body created

Explicación del código

  • Línea de código 7 : Creación del cuerpo del paquete.
  • Línea de código 9-16 : Definición del elemento 'set_record' que se declara en la especificación. Esto es lo mismo que definir el procedimiento independiente en PL / SQL.
  • Línea de código 17-24: Definición del elemento 'get_record'. Es lo mismo que definir la función independiente.
  • Línea de código 25-26: Definición de la parte de inicialización del paquete.

Paso 3) Crear un bloque anónimo para insertar y mostrar los registros haciendo referencia al paquete creado anteriormente.

DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms output.put line(‘Insert new record for employee 1004');l_emp_rec.emp_no:=l004;l_emp_rec.emp_name:='CCC';l_emp_rec.salary~20000;l_emp_rec.manager:=’BBB’;guru99_get_set.set_record(1_emp_rec);dbms_output.put_line(‘Record inserted');dbms output.put line(‘Calling get function to display the inserted record'):l_get_rec:=guru99_get_set.get_record(1004);dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');dbms output.put line(‘Employee manager:‘||1_get_rec.manager);END:/

Producción:

Insert new record for employee 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB

Explicación del código:

  • Línea de código 34-37: rellenar los datos de la variable de tipo de registro en un bloque anónimo para llamar al elemento 'set_record' del paquete.
  • Línea de código 38: Se ha realizado una llamada a 'set_record' del paquete guru99_get_set. Ahora se crea una instancia del paquete y persistirá hasta el final de la sesión.
  • La parte de inicialización del paquete se ejecuta ya que esta es la primera llamada al paquete.
  • El registro insertado por el elemento 'set_record' en la tabla.
  • Línea de código 41: Llamar al elemento 'get_record' para mostrar los detalles del empleado insertado.
  • Se hace referencia al paquete por segunda vez durante la llamada 'get_record' al paquete. Pero la parte de inicialización no se ejecuta esta vez porque el paquete ya está inicializado en esta sesión.
  • Línea de código 42-45: Impresión de los detalles del empleado.

Dependencia en paquetes

Dado que el paquete es la agrupación lógica de cosas relacionadas, tiene algunas dependencias. A continuación se muestra la dependencia que se debe cuidar.

  • Una especificación es un objeto independiente.
  • El cuerpo de un paquete depende de la especificación.
  • El cuerpo del paquete se puede compilar por separado. Siempre que se compila la especificación, es necesario volver a compilar el cuerpo, ya que dejará de ser válido.
  • El subprograma en el cuerpo del paquete que depende de un elemento privado debe definirse solo después de la declaración del elemento privado.
  • Los objetos de la base de datos a los que se hace referencia en la especificación y el cuerpo deben estar en estado válido en el momento de la compilación del paquete.

Información del paquete

Una vez que se crea la información del paquete, la información del paquete, como la fuente del paquete, los detalles del subprograma y los detalles de sobrecarga, están disponibles en las tablas de definición de datos de Oracle.

La siguiente tabla muestra la tabla de definición de datos y la información del paquete que está disponible en la tabla.

Nombre de la tabla Descripción Consulta
ALL_OBJECT Da los detalles del paquete como object_id, creation_date, last_ddl_time, etc. Contendrá los objetos creados por todos los usuarios. SELECT * FROM all_objects donde object_name = ' '
USER_OBJECT Da los detalles del paquete como object_id, creation_date, last_ddl_time, etc. Contendrá los objetos creados por el usuario actual. SELECT * FROM user_objects donde object_name = ' '
ALL_SOURCE Da la fuente de los objetos creados por todos los usuarios. SELECT * FROM all_source donde nombre = ''
USER_SOURCE Da la fuente de los objetos creados por el usuario actual. SELECT * FROM user_source donde nombre = ''
TODOS_PROCEDIMIENTOS Proporciona detalles del subprograma como object_id, detalles de sobrecarga, etc. creados por todos los usuarios. SELECT * FROM all_procedures Donde object_name = ' '
USER_PROCEDURES Proporciona detalles del subprograma como object_id, detalles de sobrecarga, etc. creados por el usuario actual. SELECT * FROM user_procedures Donde object_name = ' '

ARCHIVO UTL - Una descripción general

UTL File es el paquete de utilidades independiente proporcionado por Oracle para realizar tareas especiales. Se utiliza principalmente para leer y escribir archivos del sistema operativo desde paquetes o subprogramas PL / SQL. Obtuvo las funciones separadas para poner la información y obtener la información de los archivos. También permite leer / escribir en el juego de caracteres nativo.

El programador puede usar esto para escribir archivos del sistema operativo de cualquier tipo y el archivo se escribirá directamente en el servidor de la base de datos. El nombre y la ruta del directorio se mencionarán al momento de escribir.

Resumen

Ahora hemos aprendido los paquetes en PL / SQL, y ahora debería poder trabajar en lo siguiente.

  • Paquetes PL / SQL y sus componentes
  • Características de los paquetes
  • Referir y sobrecargar elementos del paquete
  • Administrar dependencias en paquetes
  • Ver información del paquete
  • ¿Qué es el archivo UTL?

Articulos interesantes...