Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apakah mungkin untuk melakukan pemilihan ke dalam tabel tipe objek?

Ya itu. Anda perlu membungkus kolom Anda dalam konstruktor objek dan menggunakan BULK COLLECT opsi di SELECT pernyataan:

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;

Selain itu, Anda juga perlu memastikan bahwa Anda membuat spesifikasi objek, bukan hanya badan (seperti pada contoh Anda).

Kolom di SELECT harus dalam urutan yang sama seperti yang ditemukan di konstruktor objek. Jika Anda belum secara eksplisit mendefinisikan konstruktor, satu secara eksplisit ada dengan setiap kolom dalam urutan yang dinyatakan dalam spesifikasi.

Satu-satunya downside menggunakan fungsi ini adalah bahwa sejumlah besar baris akan menghasilkan penggunaan memori yang berat. Jika Anda berharap untuk menggunakan ini untuk memproses sejumlah besar baris, Anda harus menggunakan loop dengan LIMIT klausa.

Dimungkinkan untuk menentukan konstruktor eksplisit, selain daftar kolom yang ditemukan dalam spesifikasi. Konstruktor dapat memiliki input apa pun yang Anda tetapkan, jadi, jelas, ketika Anda menggunakan konstruktor eksplisit, Anda harus mengikuti daftar argumennya. Ini contohnya:

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. SQL untuk menambahkan kolom dan komentar dalam tabel dalam satu perintah

  2. Ada / tidak ada:'pilih 1' vs 'pilih bidang'

  3. Nomor urut dalam tabel

  4. Perbedaan antara MySQL dan Oracle DB

  5. cara mengubah status blok untuk dimasukkan dalam 10g menggunakan pemicu tombol