Tablas PL/SQL

1

  • Declaración de tablas de PL/SQL

Las tablas de PL/SQL son tipos de datos que permiten almacenar varios valores del mismo tipo de datos.

    Una tabla PL/SQL :

  • Es similar a un arreglo
  • Tiene dos componenetes: Un índice de tipo BINARY_INTEGER que permite acceder a los elementos en la tabla PL/SQL y una columna de escalares o registros que contiene los valores de la tabla PL/SQL
  • Su tamaño puede  incrementarse dinámicamente.

    La sintaxis es:


DECLARE
/* tipo TASA_IMPUESTO como tabla PL/SQL */
TYPE TASA_IMPUESTO IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ; 
declara una variable del tipo TASA_IMPUESTO */
tTasaImpuesto TASA_IMPUESTO;
BEGIN
   tTasaImpuesto(1) := 4.11;
   tTasaImpuesto(2) := 10.00;
   tTasaImpuesto(3) := 16.00;
   dbms_output.put_line( tTasaImpuesto(1) || ' ' || tTasaImpuesto(2) || ' ' || tTasaImpuesto(3)); 
END;

 

Nota: No es posible inicializar las tablas en la inicialización.

El rango de binary integer es –2147483647.. 2147483647, por lo tanto el índice puede ser negativo, lo cual indica que el índice del primer valor no tiene que ser necesariamente el cero.

  • Tablas PL/SQL de registros

Ejemplo de declaración de elementos de una tabla PL/SQL como de tipo registro.

DECLARE

TYPE TASA_IMPUESTO IS RECORD 
( 
REGION VARCHAR2(100)
,IMPUESTO VARCHAR2(100)
,TASA NUMBER
,VIGENCIA_DESDE DATE); 

TYPE TASAS_IMPUESTOS IS TABLE OF TASA_IMPUESTO INDEX BY BINARY_INTEGER ;
tTASAS_IMPUESTOS TASAS_IMPUESTOS;
BEGIN

   tTASAS_IMPUESTOS(1).REGION := 'Norte';
   tTASAS_IMPUESTOS(1).IMPUESTO := 'IVA';
   tTASAS_IMPUESTOS(1).TASA  := '16';
   tTASAS_IMPUESTOS(1).VIGENCIA_DESDE := TO_DATE('01-01-2008', 'DD-MM-RRRR');

   dbms_output.put_line( tTASAS_IMPUESTOS(1).REGION 
   || ' ' || tTASAS_IMPUESTOS(1).IMPUESTO
   || ' ' || tTASAS_IMPUESTOS(1).TASA 
   || ' ' ||  tTASAS_IMPUESTOS(1).VIGENCIA_DESDE );

END;

Funciones incorporaas para el manejo de tablas PL/SQL

Existen las siguientes funciones para el manejo de tablas

FIRST. Devuelve el menor índice de la tabla. NULL si está vacía.
LAST. Devuelve el mayor índice de la tabla. NULL si está vacía.

Por ejemplo

DECLARE 
   TYPE METODO_PAGO IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
   tMetodosPago METODO_PAGO;

BEGIN
   tMetodosPago(1) := 'Efectivo';
   tMetodosPago(2) := 'Cheque';
   tMetodosPago(3) := 'Transferencia';
   tMetodosPago(4) := 'Tarjetas de crédito';
   tMetodosPago(5) := 'Monederos electrónicos';
   tMetodosPago(6) := 'Dinero electrónico';
   tMetodosPago(7) := 'Vales de despensa';
   tMetodosPago(8) := 'Tarjeta de Débito';
   tMetodosPago(9) := 'Tarjeta de Servicio';
   tMetodosPago(10) := 'Otros';

   FOR i IN tMetodosPago.FIRST..tMetodosPago.LAST LOOP
      dbms_output.put_line(tMetodosPago(i));
   END LOOP;
END;

Otas funciones:

  • EXISTS(i). Utilizada para saber si en un cierto índice hay almacenado un valor. Devolverá TRUE si en el índice i hay un valor.
  • COUNT. Devuelve el número de elementos de la tabla PL/SQL.
  • PRIOR (n). Devuelve el número del índice anterior a n en la tabla.
  • NEXT (n). Devuelve el número del índice posterior a n en la tabla.
  • TRIM. Borra un elemento del final de la tabla PL/SQL.
  • TRIM(n) borra n elementos del final de la tabla PL/SQL.
  • DELETE. Borra todos los elementos de la tabla PL/SQL.
  • DELETE(n) borra el correspondiente al índice n.
  • DELETE(m,n) borra los elementos entre m y n.

Ejemplo

DECLARE
   TYPE NumList IS TABLE OF NUMBER;
   n NumList := NumList(1,2,3,5,7,11);
   PROCEDURE print_numlist(the_list NumList) IS
      output VARCHAR2(128);
      BEGIN
      IF n.COUNT = 0 THEN
         DBMS_OUTPUT.PUT_LINE('No hay elementos.');
      ELSE
         FOR i IN the_list.FIRST .. the_list.LAST LOOP
             output := output || NVL(TO_CHAR(the_list(i)),'NULL') || ' ';
         END LOOP;
         DBMS_OUTPUT.PUT_LINE(output);
      END IF;
   END;
   BEGIN
   print_numlist(n);
   n.TRIM(2); -- Elimina dos elementos
   print_numlist(n);
   n.TRIM; -- Borra el último elemento
   print_numlist(n);
   n.TRIM(n.COUNT); -- Borra los elementos que quedan
   print_numlist(n);
   -- Si hay mas elementos especificados,TRIM provova in RAISE EXCEPTION SUBSCRIPT_BEYOND_COUNT.
   BEGIN
      n := NumList(1,2,3);
      n.TRIM(100);
   EXCEPTION
      WHEN SUBSCRIPT_BEYOND_COUNT THEN
         DBMS_OUTPUT.PUT_LINE('No se puedenborrar los elementos son 100.');
   END;
   -- Cuando los elementos son borrados con DELETE, las posisiones quedan marcados. TRIM cuenta esas
   -- posiciones y borre los elementos al fina
   n := NumList(1,2,3,4);
   n.DELETE(3);  -- borra el elemento 3
   -- n contiene los elementos (1,2,4).
   -- con TRIM = 2 se borra la posicion  4 
   n.TRIM(2);
  print_numlist(n);
END;
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s