sql >> Base de Datos >  >> RDS >> Oracle

Cómo usar tablas Oracle PLSQL (matriz asociativa o tabla indexada)

Tablas PLSQL de Oracle

  • Las tablas PLSQL son tipos de datos compuestos.
  • Estos se comportan de la misma manera que las matrices, excepto que no tienen límites superiores, lo que les permite extenderse constantemente.
  • También se les llama índice por tabla
  • La tabla PLSQL contiene dos elementos

(1) Una clave principal de tipos de datos BINARY_INTEGER que indexan la tabla, que no necesitan ser consecutivas. La colección se amplía asignando valores a un elemento usando un valor de índice que no existe actualmente.
también podemos indexar por un valor de cadena

(2) Una columna de tipo de datos escalar o de registro que almacena el índice por elementos de la tabla

Cómo definir y declarar el tipo de tabla

Para crear tablas PL/SQL, debe realizar dos pasos. Primero, define un tipo TABLE, luego declara tablas PL/SQL de ese tipo. Puede definir tipos de TABLE en la parte declarativa de cualquier bloque, subprograma o paquete usando la sintaxis

Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Si el tipo de elemento es un tipo de registro, cada campo del registro debe tener un tipo de datos escalar como CARÁCTER, FECHA o NÚMERO.

Para especificar el tipo de elemento, puede usar %TYPE para proporcionar el tipo de datos de una variable o columna de base de datos

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Puede agregar la restricción NOT NULL a una definición de tipo TABLE y así evitar el almacenamiento de valores nulos en tablas PL/SQL de ese tipo:

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

También puede usar %ROWTYPE para especificar el tipo de elemento.

DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

utiliza un tipo de REGISTRO definido por el usuario para especificar el tipo de elemento:

DECLARE 
 TYPE emp_phonetyp IS RECORD
 (
 Stdcode      PLS_INTEGER,
 phn_number   PLS_INTEGER,
 extension    PLS_INTEGER
 );
 TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;

Después de definir un tipo TABLE, puede declarar tablas PL/SQL de ese tipo

DECLARE   
 TYPE SalTabTyp IS TABLE OF emp.sal%TYPE 
 INDEX BY BINARY_INTEGER;
 TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
 INDEX BY BINARY_INTEGER;
 sal_tab SalTabTyp;  -- declare PL/SQL table
 emp_tab EmpTabTyp;  -- declare another PL/SQL table

Atributos de Tabla PLSQL o Método

Una tabla PL/SQL tiene los atributos EXISTE, CUENTA, PRIMERO, ÚLTIMO, ANTERIOR, SIGUIENTE y ELIMINAR.

Hacen que las tablas PL/SQL sean más fáciles de usar y sus aplicaciones más fáciles de mantener.

plsql_table_name.attribute_name

Los atributos existen, PRIOR, NEXT y DELETE toman parámetros. Cada parámetro debe ser una expresión que produzca un valor BINARY_INTEGER o un valor implícitamente convertible a ese tipo de datos.

DELETE actúa como un procedimiento, que se llama como una declaración. Sin embargo, los otros atributos de la tabla PL/SQL actúan como una función, que se llama como parte de una expresión.

Existe(n) Retorna verdadero si existe el enésimo elemento en la tabla
contar Devolver el número de elementos de la tabla
Primero y último FIRST y LAST devuelven los números de índice primero y último (más pequeño y más grande) en una tabla PL/SQL
PRIOR(n ) devuelve el número de índice que precede al índice n en una tabla PL/SQL
SIGUIENTE(n ) devuelve el número de índice que sucede al índice n
Eliminar DELETE elimina todos los elementos de una tabla PL/SQL. ELIMINAR(n ) elimina la n elemento. Si n es nulo, ELIMINAR (n ) no hace nada. ELIMINAR(mn ) elimina todos los elementos del rango m .. n . Si m es mayor que n o si mn es nulo, ELIMINAR (mn ) no hace nada

Tablas PL/SQL para mover datos masivos dentro y fuera de las tablas de la base de datos o entre aplicaciones del lado del cliente y subprogramas almacenados.

Cómo completar los datos en la tabla PLSQL

Las tablas con tipos de datos simples se pueden completar como:

<variable>(<integer>) := <value>;

Las tablas con tipos de datos complejos necesitarán que las columnas se completen individualmente como:

<variable>(<integer>).<column_name> := <value>;

desde un cursor:

fetch <cursor_name> into <variable>(<integer>);
Type emptabletype  is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;

También puede recuperar datos de Oracle en una tabla PL/SQL de otras tres formas

a) La declaración SELECT INTO le permite seleccionar una sola fila de datos

Usando la declaración SELECT INTO, puede seleccionar una entrada de columna en un elemento escalar. O bien, puede seleccionar una fila completa en un elemento de registro. En el siguiente ejemplo, selecciona una fila del departamento de la tabla de la base de datos en un registro almacenado por el primer elemento de la tabla PL/SQL dept_tab:

DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;

b) declaración FETCH

Con la instrucción FETCH, puede obtener una columna completa de datos de Oracle en una tabla de escalares PL/SQL.

O puede obtener una tabla completa de datos de Oracle en una tabla de registros PL/SQL.

DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;

c) el bucle FOR del cursor le permite obtener varias filas.

DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;

Debes leer estas  otras publicaciones de PLSQL

Estructura y tipos de bloques de Oracle PLSQL
Registros de Oracle PLSQL
Preguntas de la entrevista de Oracle plsql
Tutoriales rápidos de Oracle sql y plsql