sql >> Database >  >> RDS >> Oracle

Is het mogelijk om een ​​selectie uit te voeren in de tabel van het objecttype?

Jazeker. U moet uw kolommen in de constructor van het object plaatsen en de BULK COLLECT . gebruiken optie in de SELECT verklaring:

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;

Even terzijde, je moet er ook voor zorgen dat je de objectspecificatie maakt, niet alleen de body (zoals in je voorbeeld).

Kolommen in de SELECT moeten in dezelfde volgorde staan ​​als in de constructor van het object. Als u niet expliciet een constructor hebt gedefinieerd, bestaat er een expliciet met elke kolom in de volgorde die is aangegeven in de specificatie.

Het enige nadeel van het gebruik van deze functionaliteit is dat een groot aantal rijen zal resulteren in zwaar geheugengebruik. Als u verwacht dit te gebruiken om een ​​groot aantal rijen te verwerken, moet u een lus gebruiken met de LIMIT clausule.

Het is mogelijk om een ​​expliciete constructor op te geven, naast de kolomlijst die in de specificatie wordt gevonden. De constructor kan elke invoer hebben die je definieert, dus als je een expliciete constructor gebruikt, moet je natuurlijk de lijst met argumenten volgen. Hier is een voorbeeld:

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. Hoe handmatig een Oracle Connection String in een DbContext in te stellen

  2. Applicatienaam in JDBC-url met c3p0

  3. Kan geen verbinding verkrijgen/maken vanuit de verbindingspool

  4. Hoe toon ik het schema van een tabel in een MySQL-database?