sql >> Databáze >  >> RDS >> Oracle

Je možné provést výběr do tabulky typu objektu?

Ano to je. Sloupce musíte zabalit do konstruktoru objektu a použít BULK COLLECT možnost v SELECT prohlášení:

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;

Kromě toho se také musíte ujistit, že vytváříte specifikaci objektu, nikoli pouze tělo (jako ve vašem příkladu).

Sloupce v SELECT musí být ve stejném pořadí, v jakém se nacházejí v konstruktoru objektu. Pokud jste explicitně nedefinovali konstruktor, jeden explicitně existuje s každým sloupcem v pořadí uvedeném ve specifikaci.

Jedinou nevýhodou použití této funkce je, že velký počet řádků bude mít za následek velké využití paměti. Pokud očekáváte, že toto použijete ke zpracování velkého počtu řádků, měli byste použít smyčku s LIMIT klauzule.

Kromě seznamu sloupců ve specifikaci je možné zadat explicitní konstruktor. Konstruktor může mít jakýkoli vstup, který definujete, takže samozřejmě, když použijete explicitní konstruktor, musíte se řídit jeho seznamem argumentů. Zde je příklad:

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. Jak používat ALL Logical Operator v SQL Server - SQL Server / TSQL výukový program, část 126

  2. Jak prohledat pole, když se zobrazí chyba ORA-19011?

  3. Třídicí strom se zhmotněnou cestou?

  4. psql:FATAL:Ověření peer selhalo pro uživatele dev