Oracle
 sql >> база данни >  >> RDS >> Oracle

Възможно ли е да се извърши избор в таблица на тип обект?

Да, така е. Трябва да обвиете вашите колони в конструктора на обекта и да използвате BULK COLLECT опция в SELECT изявление:

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;

Освен това трябва да се уверите, че създавате спецификацията на обекта, а не само тялото (както във вашия пример).

Колони в SELECT трябва да са в същия ред, както са намерени в конструктора на обекта. Ако не сте дефинирали изрично конструктор, такъв изрично съществува с всяка колона в реда, деклариран в спецификацията.

Единственият недостатък на използването на тази функционалност е, че голям брой редове ще доведат до тежко използване на паметта. Ако очаквате да използвате това за обработка на голям брой редове, трябва да използвате цикъл с LIMIT клауза.

Възможно е да се посочи явен конструктор в допълнение към списъка с колони, който се намира в спецификацията. Конструкторът може да има какъвто и да е вход, който дефинирате, така че, очевидно, когато използвате изричен конструктор, трябва да следвате неговия списък с аргументи. Ето един пример:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Query за събиране на QTY по години - само за последните 3 години

  2. Как да намерим служителя с втората най-висока заплата?

  3. Как да събирам данни от дял INMEMORY?

  4. показване на персонализиран sql текст от резултата от колоната на таблицата

  5. Избиране на произволен ред в Oracle