Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:Wstaw dane typu rowtype do innej tabeli

Aby wstawić jeden wiersz-

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;

Lub bardziej rozbudowana wersja, aby wstawić wszystkie wiersze z 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;
/

W spuście tak, jest to możliwe, ale jest jak kurczak lub jajko. Musisz zainicjować każde pole rowtype z :new wartości kolumn, takie jak-

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

Najwyraźniej powyższe przykłady PLSQL nie mogą być użyte w wyzwalaczu, ponieważ spowoduje to wygenerowanie błędu wyzwalacza mutującego. I nie ma innego sposobu, aby uzyskać cały wiersz w wyzwalaczu, niż dostęp do każdej kolumny osobno, jak wyjaśniam powyżej, więc jeśli zrobisz to wszystko, dlaczego nie użyć bezpośrednio :new.col w INSERT into temp_event zaoszczędzi Ci dużo pracy.

Również skoro mówisz, że wymienienie wszystkich kolumn jest dużo pracy (w Oracle 11gR2 ) oto szybki sposób na zrobienie tego poprzez wygenerowanie INSERT oświadczenie i wykonywanie go dynamicznie (chociaż nie testowane pod kątem wydajności).

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. Zmień hasło użytkownika przez jdbc. Problemy z przepustkami zawierającymi znaki zapytania

  2. sun.security.validator.ValidatorException:budowanie ścieżki PKIX nie powiodło się, java>1,6

  3. naprawdę prosty SQL Nie jest wyrażeniem GROUP BY - Oracle

  4. Konwertuj Int32 na liczbę Oracle (5) za pomocą EF4

  5. Jak zamienić znaki specjalne, a następnie łamać linię w Oracle?