1行挿入するには-
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;
または、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;
/
トリガーでは、はい、それは可能ですが、それは鶏が先か卵が先かです。 rowtype
のすべてのフィールドを初期化する必要があります :new
を使用 次のような列の値-
v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....
明らかに、上記のPLSQLの例は、変更トリガーエラーをスローするため、トリガーで使用できません。また、上記で説明したように、各列に個別にアクセスする以外に、トリガーで行全体を取得する方法はありません。したがって、これらすべてを行う場合は、:new.col
を直接使用しないでください。 INSERT into temp_event
それ自体、多くの作業を節約できます。
また、すべての列に言及するのは大変な作業だと言っているので( Oracle 11gR2 ) )INSERT
を生成することで、これを簡単に行う方法は次のとおりです。 ステートメントとそれを動的に実行します(ただし、パフォーマンスはテストされていません)。
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;