2012-12-13 17 views
5

Ho una tabella denominata evento e ho creato un'altra tabella temporanea globale tmp_event con le stesse colonne e definizione con evento. È possibile inserire record in evento su tmp_event usando questo?Oracle: inserire i dati rowtype in un'altra tabella

DECLARE 
    v_record event%rowtype; 
BEGIN 
    Insert into tmp_event values v_record; 
END; 

Ci sono troppe colonne nella tabella degli eventi, voglio provare questo perché non voglio elencare tutte le colonne.

Dimentichi di menzionare: lo userò nel trigger, può questo v_record essere l'oggetto : nuovo dopo l'inserimento nella tabella EVENT?

+0

aggiornato la risposta con l'uso in 'trigger'. – Annjawn

+0

Ho risposto a domanda simile qui: [http://stackoverflow.com/a/26343423/2235483][1] [1]: http://stackoverflow.com/a/26343423/2235483 – Rusty

risposta

17

Per inserire un row-

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; 

o una versione più elaborata per inserire tutte le righe da 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; 
/

In un trigger, sì è possibile ma è come l'uovo o la uovo. Bisogna inizializzare ogni campo della rowtype con i valori delle colonne :new come-

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

A quanto pare, gli esempi PLSQL sopra non possono essere utilizzati in un trigger in quanto sarebbe lanciare un errore di attivazione mutazione. E non c'è altro modo per ottenere l'intera riga nel trigger oltre all'accesso a ciascuna colonna separatamente come spiego sopra, quindi se fai tutto questo perché non usi direttamente lo :new.col nello stesso INSERT into temp_event, ti farà risparmiare un sacco di lavoro .


Anche perché si dice che è un sacco di lavoro per parlare di tutte le colonne, (in Oracle 11gR2), ecco un modo veloce di fare quello generando la dichiarazione INSERT e l'esecuzione in modo dinamico (anche se non testato per prestazione).

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; 
+0

Memorizzo i dati nella tabella tmp_event per evitare l'errore di trigger mutante. Aggiorno o inserisco nella tabella degli eventi e aggiungo il nuovo record nella tabella tmp_event, quindi visito il contenuto in tmp_table, funzionerà? – Frank

+0

Sì, lo farà. Finché non si seleziona 'select' dalla tabella in cui si trova il trigger, non genererà l'errore di trigger mutante. – Annjawn

+0

@LucM Quale funzione? 'Mutating Trigger' è un errore che si applica a tutte le versioni del database Oracle. – Annjawn

Problemi correlati