Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist es möglich, eine Auswahl in die Tabelle des Objekttyps durchzuführen?

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;