Ja det är det. Du måste slå in dina kolumner i objektets konstruktor och använda BULK COLLECT
alternativet i SELECT
uttalande:
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;
Dessutom måste du också se till att du skapar objektspecifikationen, inte bara kroppen (som i ditt exempel).
Kolumner i SELECT
måste vara i samma ordning som de finns i objektets konstruktor. Om du inte uttryckligen har definierat en konstruktor, finns en explicit med varje kolumn i den ordning som anges i specifikationen.
Den enda nackdelen med att använda den här funktionen är att ett stort antal rader kommer att resultera i hög minnesanvändning. Om du förväntar dig att använda detta för att bearbeta ett stort antal rader, bör du använda en loop med LIMIT
klausul.
Det är möjligt att ange en explicit konstruktor, utöver kolumnlistan som finns i specifikationen. Konstruktorn kan ha vilken input du än definierar, så uppenbarligen, när du använder en explicit konstruktor måste du följa dess argumentlista. Här är ett exempel:
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;