Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

É possível realizar uma seleção na tabela do tipo de objeto?


É sim. Você precisa envolver suas colunas no construtor do objeto e usar o BULK COLLECT opção no SELECT declaração:
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;

Como um aparte, você também precisa ter certeza de criar a especificação do objeto, não apenas o corpo (como no seu exemplo).

Colunas no SELECT devem estar na mesma ordem em que são encontrados no construtor do objeto. Se você não definiu explicitamente um construtor, existe um explicitamente com cada coluna na ordem declarada na especificação.

A única desvantagem de usar essa funcionalidade é que um grande número de linhas resultará em uso intenso de memória. Se você espera usar isso para processar um grande número de linhas, você deve usar um loop com o LIMIT cláusula.

É possível especificar um construtor explícito, além da lista de colunas encontrada na especificação. O construtor pode ter qualquer entrada que você definir, então, obviamente, quando você usa um construtor explícito, você tem que seguir sua lista de argumentos. Aqui está um exemplo:
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;