Ja det er. Du skal pakke dine kolonner ind i objektets konstruktør og bruge BULK COLLECT
mulighed i SELECT
erklæring:
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;
Til gengæld skal du også sørge for, at du opretter objektspecifikationen, ikke kun kroppen (som i dit eksempel).
Kolonner i SELECT
skal være i samme rækkefølge, som de findes i objektets konstruktør. Hvis du ikke eksplicit har defineret en konstruktør, eksisterer en eksplicit med hver kolonne i den rækkefølge, der er angivet i specifikationen.
Den eneste ulempe ved at bruge denne funktionalitet er, at et stort antal rækker vil resultere i stort hukommelsesforbrug. Hvis du forventer at bruge dette til at behandle et stort antal rækker, bør du bruge en løkke med LIMIT
klausul.
Det er muligt at angive en eksplicit konstruktør, ud over kolonnelisten, der findes i specifikationen. Konstruktøren kan have hvilket input du definerer, så selvfølgelig, når du bruger en eksplicit konstruktør, skal du følge dens argumentliste. Her er et eksempel:
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;