Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy można dokonać selekcji do tabeli typu obiektu?

Tak to jest. Musisz owinąć swoje kolumny w konstruktorze obiektu i użyć BULK COLLECT opcja w SELECT oświadczenie:

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;

Na marginesie, musisz również upewnić się, że tworzysz specyfikację obiektu, a nie tylko ciało (jak w twoim przykładzie).

Kolumny w SELECT muszą być w tej samej kolejności, w jakiej znajdują się w konstruktorze obiektu. Jeśli nie zdefiniowałeś jawnie konstruktora, jest on jawnie obecny w każdej kolumnie w kolejności zadeklarowanej w specyfikacji.

Jedyną wadą korzystania z tej funkcji jest to, że duża liczba wierszy spowoduje duże zużycie pamięci. Jeśli zamierzasz użyć tego do przetwarzania dużej liczby wierszy, powinieneś użyć pętli z LIMIT klauzula.

Możliwe jest określenie jawnego konstruktora, oprócz listy kolumn znajdującej się w specyfikacji. Konstruktor może mieć dowolne dane wejściowe, które zdefiniujesz, więc oczywiście, gdy używasz jawnego konstruktora, musisz postępować zgodnie z jego listą argumentów. Oto przykład:

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. Zainstaluj klienta Oracle z wiersza poleceń bez interakcji z użytkownikiem

  2. Zadanie Oracle Enterprise Manager jest zawieszone

  3. Oracle DB i SQL Developer:Raport o błędzie:wykonanie zakończone z ostrzeżeniem — Jak *zobaczyć* ostrzeżenie?

  4. Jak wykonać procedurę wewnątrz pakietu w Oracle

  5. Korzystanie z bazy danych Oracle dla domyślnej aplikacji ASP.NET MVC