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

Oracle:Masukkan data tipe baris ke tabel lain

Untuk menyisipkan satu baris-

DECLARE
   v_record event%rowtype;
BEGIN 
   SELECT * INTO v_record from event where rownum=1; --or whatever where clause
   Insert into tmp_event values v_record;
END;

Atau versi yang lebih rumit untuk menyisipkan semua baris dari event -

DECLARE
  TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE;

  l_tab t_bulk_collect_test_tab;

  CURSOR c_data IS
    SELECT *
    FROM event;
BEGIN
  OPEN c_data;
  LOOP
    FETCH c_data
    BULK COLLECT INTO l_tab LIMIT 10000;
    EXIT WHEN l_tab.count = 0;

    -- Process contents of collection here.
    Insert into tmp_event values v_record;
  END LOOP;
  CLOSE c_data;
END;
/

Di pemicu, ya itu mungkin tapi itu seperti ayam atau telur. Anda harus menginisialisasi setiap bidang rowtype dengan :new nilai kolom seperti-

v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....

Rupanya, contoh PLSQL di atas tidak dapat digunakan dalam pemicu karena akan menimbulkan kesalahan pemicu bermutasi. Dan tidak ada cara lain bagi Anda untuk mendapatkan seluruh baris di pemicu selain mengakses setiap kolom secara terpisah seperti yang saya jelaskan di atas, jadi jika Anda melakukan semua ini mengapa tidak langsung menggunakan :new.col di INSERT into temp_event itu sendiri, akan menghemat banyak pekerjaan.

Juga karena Anda mengatakan banyak pekerjaan untuk menyebutkan semua kolom, (di Oracle 11gR2 ) inilah cara cepat untuk melakukannya dengan membuat INSERT pernyataan dan mengeksekusinya secara dinamis (meskipun tidak diuji kinerjanya).

CREATE OR REPLACE TRIGGER event_air --air stands for "after insert of row"
AFTER INSERT ON EVENT
FOR EACH ROW
   L_query varchar2(2000);   --size it appropriately
BEGIN

   SELECT 'INSERT INTO tmp_event VALUES ('|| listagg (':new.'||column_name, ',') 
                                           WITHIN GROUP (ORDER BY column_name) ||')' 
     INTO l_query
     FROM all_tab_columns
    WHERE table_name='EVENT';

   EXECUTE IMMEDIATE l_query;

EXCEPTION
    WHEN OTHERS THEN
        --Meaningful exception handling here
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. Mengaktifkan TLS di Oracle Apps R12.2

  2. Cara memeriksa kondisi dan menulis teks ke dalam bentuk oracle file teks

  3. Daftar Dipisahkan koma

  4. Oracle tidak menghapus kursor setelah menutup set hasil

  5. Apakah ada perbedaan antara Kunci Pengganti, Kunci Sintetis, dan Kunci Buatan?