Variables Objeto

Definición de Variables Objeto en PL/SQL

Si tenemos tipos definidos en la BBDD, podemos definir variables de este tipo.

Estas variables se pueden definir en PL/SQL y en cualquier sitio donde esté permitido la definición de variables:

customer customer_typ_demo;

Trabajar con Variables Objeto en PL/SQL

Cuando trabajemos con variables objeto, no debemos olvidar que son Objetos:

  • Tienen un contructor.
  • Se debe diferenciar entre una variable NULL y una variable con un contenido Objeto NULL.
  • La variables tipo Varray deben inicializarse y expandir el array al tamaño adecuado antes de acceder al mismo.
    • El método implícito count (variable.count) iondica cuantos elementos tiene el array.
  • Se accede a los distintos elementos con la sintaxis:
    • Si son objetos: variable.campo
    • Si son varrays: variable(n)

Ejemplos sencillos:

Con objetos:

CREATE TYPE demo_typ1 AS OBJECT (a1 NUMBER, a2 NUMBER);
/
demo demo_typ1;

Begin
demo.a1 := 4;                  # ==> ERROR: la variable demo no está inicializada
demo := NULL;                  # demo tiene el valor NULL
demo := demo_typ1(2,3);        # se debe utilizar el contructor para inicializar la variable
demo := demo_typ1(NULL,NULL);  # demo está inicializado a un objeto con valores NULL
demo.a1 := 4;                  # correcto: ahora la variable demo ya está inicializada.   

Con Varrays:

CREATE TYPE n_integer_type AS VARRAY(5) OF INTEGER;
/
integers n_integer_type := NULL;
a number;

Begin
integers(1) := 4;                         # ==> ERROR: el array integers no tiene dimensión
integers := n_integer_type(10, 20, 30);   # OK: integers es un array de dimensión 3 con valores 10, 20 ,30
integers(2) := 15;                        # Cambiamos el valor de un elemento
a := integers.count;                      # a contiene el valor 3
integers.extend(1);                       # añadimos un elemento al array
a := integers.count;                      # a contiene el valor 4

VARRAYS y Bulk Collect Into

Mediante Bulk Collect Into, podemos leer de forma muy eficiente un conjunto de registros de la BBDD y guardarlos en un VARRAY:

CREATE TYPE demo_type AS OBJECT (A INTEGER, B INTEGER);
/

CREATE TYPE demo_varray AS VARRAY (1000) OF demo_type;
/

CREATE TABLE xxx (X1 INTEGER, X2 INTEGER);
/
demo_var demo_varray;

Begin

INSERT INTO xxx SELECT * FROM mmm;

SELET X1,X2
BULK COLLECT INTO demo_var
FROM xxx
WHERE ROWNUM <= 1000;

dbms_ouput.print_line('Registros: ' || demo_var.count);

Este Bulk Collect Into llena el array demo_var con hasta 1000 regestros y de una forma muy eficiente.

 

 No confundir con las variables PL

Aunque la sintaxis de utilización puede ser muy parecida, no hay que confundir estas variables con las variables PL:

  • RECORD
  • PL Tables