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

¿Es posible realizar una selección en la tabla de tipo de objeto?

Sí, lo es. Debe envolver sus columnas en el constructor del objeto y usar BULK COLLECT opción en el SELECT declaración:

CREATE OR REPLACE TYPE t_some_type AS OBJECT(f varchar2(10))
/

CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/

DECLARE
   v_some_table t_some_table;
BEGIN
   SELECT t_some_type (dummy)
   BULK   COLLECT INTO v_some_table
   FROM   DUAL;
END;

Aparte, también debe asegurarse de crear la especificación del objeto, no solo el cuerpo (como en su ejemplo).

Columnas en SELECT deben estar en el mismo orden en que se encuentran en el constructor del objeto. Si no ha definido explícitamente un constructor, existe uno explícitamente con cada columna en el orden declarado en la especificación.

El único inconveniente de usar esta funcionalidad es que una gran cantidad de filas generará un uso intensivo de la memoria. Si espera usar esto para procesar una gran cantidad de filas, debe usar un ciclo con LIMIT cláusula.

Es posible especificar un constructor explícito, además de la lista de columnas que se encuentra en la especificación. El constructor puede tener cualquier entrada que defina, por lo que, obviamente, cuando usa un constructor explícito, debe seguir su lista de argumentos. He aquí un ejemplo:

CREATE OR REPLACE TYPE t_some_type AS OBJECT
(
   f1 VARCHAR2 (10),
   CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
      RETURN SELF AS RESULT
);
/

CREATE OR REPLACE TYPE BODY t_some_type AS
   CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
      RETURN SELF AS RESULT IS
   BEGIN
      self.f1 := LPAD (p_value, p_length, p_value);
      RETURN;
   END t_some_type;
END;
/

CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/

DECLARE
   v_some_table t_some_table;
BEGIN
   --Explicit Constructor
   SELECT t_some_type (10, dummy)
   BULK   COLLECT INTO v_some_table
   FROM   DUAL;
   DBMS_OUTPUT.put_line (v_some_table (1).f1);

   --Implicit Constructor
   SELECT t_some_type (dummy)
   BULK   COLLECT INTO v_some_table
   FROM   DUAL;
   DBMS_OUTPUT.put_line (v_some_table (1).f1);
END;