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.
¿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:
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:
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.
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.
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.





