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;