Ano to je. Sloupce musíte zabalit do konstruktoru objektu a použít BULK COLLECT
možnost v SELECT
prohlášení:
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;
Kromě toho se také musíte ujistit, že vytváříte specifikaci objektu, nikoli pouze tělo (jako ve vašem příkladu).
Sloupce v SELECT
musí být ve stejném pořadí, v jakém se nacházejí v konstruktoru objektu. Pokud jste explicitně nedefinovali konstruktor, jeden explicitně existuje s každým sloupcem v pořadí uvedeném ve specifikaci.
Jedinou nevýhodou použití této funkce je, že velký počet řádků bude mít za následek velké využití paměti. Pokud očekáváte, že toto použijete ke zpracování velkého počtu řádků, měli byste použít smyčku s LIMIT
klauzule.
Kromě seznamu sloupců ve specifikaci je možné zadat explicitní konstruktor. Konstruktor může mít jakýkoli vstup, který definujete, takže samozřejmě, když použijete explicitní konstruktor, musíte se řídit jeho seznamem argumentů. Zde je příklad:
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;