Ja, so ist es. Sie müssen Ihre Spalten in den Konstruktor des Objekts einschließen und BULK COLLECT
verwenden Option im SELECT
Aussage:
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;
Abgesehen davon müssen Sie auch sicherstellen, dass Sie die Objektspezifikation erstellen, nicht nur den Hauptteil (wie in Ihrem Beispiel).
Spalten im SELECT
müssen in der gleichen Reihenfolge sein, wie sie im Konstruktor des Objekts gefunden werden. Wenn Sie keinen Konstruktor explizit definiert haben, existiert einer explizit mit jeder Spalte in der in der Spezifikation deklarierten Reihenfolge.
Der einzige Nachteil bei der Verwendung dieser Funktion besteht darin, dass eine große Anzahl von Zeilen zu einer starken Speichernutzung führt. Wenn Sie damit rechnen, eine große Anzahl von Zeilen zu verarbeiten, sollten Sie eine Schleife mit dem LIMIT
verwenden Klausel.
Es ist möglich, zusätzlich zu der in der Spezifikation gefundenen Spaltenliste einen expliziten Konstruktor anzugeben. Der Konstruktor kann jede beliebige Eingabe haben, die Sie definieren. Wenn Sie also einen expliziten Konstruktor verwenden, müssen Sie natürlich dessen Argumentliste folgen. Hier ist ein Beispiel:
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;