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(m , n ) elimina todos los elementos del rango m .. n . Si m es mayor que n o si m o n es nulo, ELIMINAR (m , n ) 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>;
O 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