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;