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

Chuyển đổi hàng mới sang XML bên trong Trình kích hoạt Oracle

Về các cạm bẫy trong trigger là::new /:old là những trigger rất cụ thể và tẻ nhạt để xử lý. một cách để giải quyết vấn đề sẽ là xây dựng xmltype một cách rõ ràng:

create or replace TRIGGER EVAL_CHANGE_TRIGGER
  AFTER INSERT OR UPDATE OR DELETE
  REFERENCING NEW AS NEW OLD AS OLD
  ON ResearchTable
DECLARE
  log_action  varchar(10);
  p_xmldata     XMLtype;
  p_newrowdata    clob;
BEGIN
    select XMLElement("ResearchTable", 
                   XMLElement("myColumn1", :NEW.myColumn1),
                   XMLElement("myColumn2", :NEW.myColumn2),
                   ....)
                   into p_xmldata from dual;
                   
   p_newrowdata:=p_xmldata.getClobVal();  
  
  IF INSERTING THEN
    log_action := 'Insert';
  ELSIF UPDATING THEN
    log_action := 'Update';
  ELSIF DELETING THEN
    log_action := 'Delete';
  ELSE
    DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
  END IF;

 INSERT INTO auditsResearch (table_name, transaction_name, by_user, transaction_date,XMLDATA)
   VALUES('PROJ_TEST', log_action, USER, SYSDATE,p_newrowdata);
END;

Việc tạo xml rất cụ thể cho bảng (vì:mới - hạn chế), tôi sẽ sử dụng một số cách tạo mã bằng cách truy vấn siêu dữ liệu của bảng đích:

select 'XMLElement("'||cols.column_Name||'", :NEW.'||cols.column_name||'),'
 from SYS.ALL_TAB_COLS cols
where upper(cols.owner)=upper('MY_TARGET_SCHEMA')
and upper(cols.table_name)=upper('MY_TABLE')
order by column_id
;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tính toán giờ dựa trên giờ làm việc trong Oracle SQL

  2. Chứng chỉ Oracle

  3. Câu hỏi SQL phân cấp

  4. Tìm các hàng không chứa dữ liệu số trong Oracle

  5. JDBC ResultSet:Tôi cần getDateTime, nhưng chỉ có getDate và getTimeStamp