Oracle Tipo de registros PL/SQL con ejemplos

โšก Resumen inteligente

El tipo de registro PL/SQL es un tipo de datos complejo que agrupa varias columnas, cada una con su propio nombre y tipo de datos, en un nuevo tipo. Un registro puede definirse a nivel de base de datos como un objeto almacenado o dentro de un subprograma, y โ€‹โ€‹se accede a sus campos mediante el operador punto.

  • ๐Ÿงฑ Definiciรณn: Un tipo de registro agrupa una o mรกs columnas en un รบnico tipo de datos nuevo.
  • ๐Ÿ”‘ Palabra clave: La palabra clave TYPE le indica al compilador que se estรก creando un nuevo tipo de datos.
  • ๐Ÿ›๏ธ Dos niveles: Un registro a nivel de base de datos es un objeto almacenado; un registro a nivel de subprograma solo es visible dentro de ese subprograma.
  • ๐Ÿ”— Acceso al campo: Se accede a los campos como variable_de_registro.nombre_de_columna usando el operador punto.
  • ๐Ÿ“ฅ Nivel de columna: Se pueden asignar valores a un campo a la vez.
  • ๐Ÿ“ฆ Nivel de fila: Una clรกusula SELECT INTO puede rellenar un registro completo a partir de una fila de una tabla.
  • ๐Ÿงฉ Tipos de registros: %ROWTYPE basado en tablas, %ROWTYPE basado en cursores y registros definidos por el programador.

Oracle Tipo de registros PL/SQL

ยฟQuรฉ es un tipo de registro?

Un tipo de registro es un tipo de dato complejo que permite al programador crear un nuevo tipo de dato con la estructura de columnas deseada. Sus principales caracterรญsticas son:

  • Agrupa una o mรกs columnas para formar un nuevo tipo de datos.
  • Cada una de estas columnas tiene su propio nombre y tipo de datos.
  • Un tipo de registro puede aceptar los datos como un รบnico registro compuesto por muchas columnas, o puede aceptar el valor de una columna especรญfica de un registro.
  • Un tipo de registro es simplemente un nuevo tipo de dato. Una vez creado, se almacena como un nuevo tipo de dato y puede utilizarse para declarar una variable en los programas.
  • Utiliza la palabra clave 'TIPO' para indicar al compilador que se estรก creando un nuevo tipo de datos.
  • Se puede crear en el nivel de base de datos, almacenado como un objeto de base de datos y utilizado en toda la base de datos, o en el nivel de subprograma, visible รบnicamente dentro del subprograma.
  • Tambiรฉn se puede declarar un tipo de registro a nivel de base de datos para las columnas de una tabla, de modo que una sola columna pueda contener datos complejos.
  • Se accede a los datos haciendo referencia al nombre de la variable, luego al operador de punto (.), luego al nombre de la columna, como ' . '.

Sintaxis para declarar un tipo de registro

Sintaxis para declaraciรณn a nivel de base de datos:

Declaraciรณn de tipo de registro a nivel de base de datos

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

En la primera sintaxis, la palabra clave 'CREATE TYPE' indica al compilador que cree el tipo de registro denominado "type_name_db" con las columnas especificadas como un objeto de base de datos. Esto se proporciona como una instrucciรณn independiente, no dentro de ningรบn bloque.

Sintaxis para la declaraciรณn a nivel de subprograma:

Declaraciรณn de tipo de registro a nivel de subprograma

DECLARE
TYPE <type_name> IS RECORD
(
<column1> <datatype>,
);
BEGIN
<execution_section>;
END;

En esta sintaxis, creamos el tipo de registro denominado "type_name" รบnicamente dentro del subprograma. En ambos mรฉtodos, la forma de definir la columna y el tipo de datos es similar.

Ejemplo 1: Tipo de registro como objeto de base de datos

En este programa, veremos cรณmo crear un tipo de registro como objeto de base de datos. Crearemos el tipo de registro 'emp_det' con cuatro columnas. Las columnas y sus tipos de datos son:

  • EMP_NO (NรšMERO)
  • EMP_NOMBRE (VARCHAR2 (150))
  • GERENTE (NรšMERO)
  • SALARIO (NรšMERO)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
/

Salida:

Type created

Code Explicaciรณn

  • El cรณdigo anterior crea el tipo emp_det como un objeto de base de datos.
  • Tiene 4 columnas: emp_no, emp_name, manager y salary, segรบn lo definido.
  • Ahora 'emp_det' es similar a cualquier otro tipo de datos (como NUMBER o VARCHAR2) y es visible en toda la base de datos. Por lo tanto, se puede usar en cualquier parte de la base de datos para declarar una variable de este tipo.

Ejemplo 2: Acceso a nivel de columna a nivel de subprograma

En este ejemplo, veremos cรณmo crear un tipo de registro a nivel de subprograma y cรณmo rellenarlo y obtener valores por columna. Creamos el tipo de registro 'emp_det' a nivel de subprograma y lo usamos para rellenar y mostrar datos.

Ejemplo de acceso a nivel de columna de tipo de registro

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
guru99_emp_rec.emp_no:= 1001;
guru99_emp_rec.emp_name:= 'XXX';
guru99_emp_rec.manager:= 1000;
guru99_emp_rec.salary:= 10000;
dbms_output.put_line('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Salida:

Employee Detail
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000

Code Explicaciรณn

  • Code lรญneas 2-8: El tipo de registro 'emp_det' se declara con las columnas emp_no, emp_name, manager y salary de tipo de datos NUMBER, VARCHAR2, NUMBER y NUMBER.
  • Code lรญnea 9: La variable guru99_emp_rec estรก declarada como tipo de datos 'emp_det'. variable puede contener un valor que incluya los cuatro campos.
  • Code lรญnea 11: Completando el campo 'emp_no' de 'guru99_emp_rec' con el valor 1001.
  • Code lรญnea 12: Rellenar el campo 'emp_name' con el valor XXX.
  • Code lรญnea 13: Rellenar el campo 'gerente' con el valor 1000.
  • Code lรญnea 14: Rellenar el campo 'salario' con el valor 10000.
  • Code lรญneas 15-19: Mostrar el valor de 'guru99_emp_rec' en la salida.

Ejemplo 3: Acceso a nivel de fila a nivel de subprograma

En este ejemplo, vemos cรณmo crear un tipo de registro a nivel de subprograma y rellenarlo a nivel de fila. Creamos el tipo de registro 'emp_det' a nivel de subprograma y lo usamos para rellenar y mostrar datos.

Ejemplo de acceso a nivel de fila de tipo de registro

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
guru99_emp_rec emp_det;
BEGIN
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
COMMIT;
SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002;
dbms_output.put_line ('Employee Detail');
dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name);
dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary);
dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager);
END;
/

Code Explicaciรณn

  • Code lรญneas 2-8: El tipo de registro 'emp_det' se declara con las columnas emp_no, emp_name, manager y salary de tipo de datos NUMBER, VARCHAR2, NUMBER y NUMBER.
  • Code lรญnea 9: La variable guru99_emp_rec estรก declarada como tipo de datos 'emp_det' y puede contener los cuatro campos.
  • Code lรญnea 11: Rellenar la tabla emp con 1002 como emp_no, YYY como emp_name, 15000 como salary y 1000 como manager number.
  • Code lรญnea 12: Confirmando la transacciรณn de inserciรณn.
  • Code lรญnea 13: Rellenar la variable 'guru99_emp_rec' a nivel de fila a partir de la consulta SELECT para el empleado nรบmero 1002.
  • Code lรญneas 15-19: Mostrar el valor de 'guru99_emp_rec' en la salida.

Salida:

Employee Detail
Employee Number: 1002
Employee Name: YYY
Employee Salary: 1000
Employee Manager Number: 15000

Nota: Solo se puede acceder a un tipo de registro a nivel de columna al redirigir su valor a cualquier modo de salida. Observe que, en este ejemplo, el orden de la lista SELECT no coincide con el orden de los campos del registro, por lo que los valores de salario y gerente aparecen intercambiados en la salida.

Tipos de registros PL/SQL

Mรกs allรก del registro definido por el programador que se muestra arriba, Oracle Ofrece dos tipos de registros anclados que copian su estructura automรกticamente. Su uso evita tener que volver a declarar las columnas y mantiene el registro sincronizado con la tabla o el cursor en el que se basa.

Tipo de registro Declarado con La estructura proviene de
Registro basado en tablas nombre_tabla%TIPO_FILA Todas las columnas de una tabla
Registro basado en cursor nombre_del_cursor%TIPO_DE_FILA La lista de selecciรณn del cursor
Registro definido por el programador TIPO โ€ฆ ES REGISTRO Columnas que usted enumera a mano

Un registro %ROWTYPE es la opciรณn mรกs segura cuando la forma debe seguir una tabla o una cursor, porque un cambio de columna se detecta automรกticamente en la siguiente compilaciรณn.

Preguntas Frecuentes

Un registro agrupa distintas columnas, posiblemente de distintos tipos, en una estructura similar a una fila. Una colecciรณn contiene muchos elementos del mismo tipo, indexados por un subรญndice. A menudo se combinan, formando una colecciรณn de registros.

%ROWTYPE declara un registro cuyos campos coinciden automรกticamente con una tabla o cursor. รšselo cuando el registro deba reflejar esa fuente, de modo que un cambio de columna se vea reflejado sin necesidad de editar la declaraciรณn.

Sรญ, si ambos registros son del mismo tipo. SELECT INTO tambiรฉn puede rellenar un registro completo a partir de una fila de la tabla, siempre que el orden de la lista de selecciรณn coincida con el orden de los campos del registro.

Sรญ. La IA puede leer la definiciรณn de una tabla y generar un bloque TYPE โ€ฆ IS RECORD que coincida, o recomendar un %ROWTYPE cuando sea preferible un enlace directo a la tabla. Verifique los tipos de datos antes de usarlos.

Un registro a nivel de base de datos se crea con CREATE TYPE y se almacena como un objeto visible en toda la base de datos. Un registro a nivel de subprograma se declara dentro de un bloque y existe รบnicamente dentro de ese subprograma.

Resumir este post con: