Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Chèn dữ liệu kiểu hàng vào một bảng khác

Để chèn một hàng-

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;

Hoặc một phiên bản phức tạp hơn để chèn tất cả các hàng từ 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;
/

Trong một kích hoạt, có nó là có thể nhưng nó giống như con gà hoặc quả trứng. Bạn phải khởi tạo mọi trường của rowtype với :new giá trị cột như-

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

Rõ ràng, các ví dụ PLSQL ở trên không thể được sử dụng trong trình kích hoạt vì nó sẽ gây ra lỗi kích hoạt thay đổi. Và không có cách nào khác để bạn có được toàn bộ hàng trong trình kích hoạt ngoài việc truy cập từng cột riêng biệt như tôi giải thích ở trên, vì vậy nếu bạn làm tất cả những điều này tại sao không sử dụng trực tiếp :new.col trong INSERT into temp_event chính nó, sẽ giúp bạn tiết kiệm rất nhiều công việc.

Ngoài ra, vì bạn nói rằng có rất nhiều công việc để đề cập đến tất cả các cột, (trong Oracle 11gR2 ) đây là một cách nhanh chóng để thực hiện điều đó bằng cách tạo INSERT và thực thi nó một cách động (mặc dù không được kiểm tra hiệu suất).

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. Có hàm MD5 Sum trong PL / SQL không

  2. Kết nối với Cơ sở dữ liệu Oracle 12c từ Phiên bản Cộng đồng Tích hợp Dữ liệu Pentaho (Kettle)

  3. Mật khẩu người dùng khách trong 11i / R12

  4. Oracle Create View vấn đề

  5. Làm cách nào để chia một cột varchar thành nhiều giá trị trong SQL?