sql >> Databasteknik >  >> RDS >> Oracle

Är det möjligt att välja objekttyp i tabellen?

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;


  1. Hur väljer man underkategorier från vald kategori med hjälp av en kapslad funktion i PHP?

  2. PL/SQL-procedur - för många värden

  3. Android SQLite-uppdateringsraden fungerar inte

  4. Hur snabbar man upp antalet valda(*) med grupp efter och var?