sql >> Database teknologi >  >> RDS >> Oracle

Er det muligt at udføre en udvælgelse i tabel af objekttype?

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;


  1. Kan ikke slippe tabel, der lige er oprettet

  2. Indsæt MyISAM-nøgle i en INNODB-tabel

  3. Gentagende værdier i en kolonne

  4. Find id'er, hvor værdier kun er i array