sql >> Databáze >  >> RDS >> Oracle

Oracle:Vložte data typu řádku do jiné tabulky

Chcete-li vložit jeden řádek -

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;

Nebo propracovanější verze pro vložení všech řádků 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;
/

Ve spouště, ano, je to možné, ale je to jako slepice nebo vejce. Musíte inicializovat každé pole rowtype pomocí :new hodnoty sloupců jako-

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

Výše uvedené příklady PLSQL zjevně nelze použít ve spouštěči, protože by vyvolalo chybu mutujícího spouštěče. A neexistuje žádný jiný způsob, jak dostat celý řádek do spouštěče, kromě přístupu ke každému sloupci samostatně, jak vysvětluji výše, takže pokud toto všechno uděláte, proč nepoužít přímo :new.col v INSERT into temp_event vám ušetří spoustu práce.

Také protože říkáte, že je hodně práce zmínit všechny sloupce (v Oracle 11gR2 ) zde je rychlý způsob, jak toho dosáhnout vygenerováním INSERT příkaz a jeho dynamické provádění (ačkoli netestováno na výkon).

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. Laravel Od Raw DB k výmluvnému

  2. Použití řetězce v uložené proceduře Oracle

  3. Jak odstranit řádky s obousměrnými závislostmi?

  4. Vyberte samostatné řádky ze dvou tabulek, seřaďte je podle data