sql >> データベース >  >> RDS >> Oracle

Oracleトリガー内で新しい行をXMLに変換します

    トリガーの落とし穴の1つは、次のとおりです。:new /:oldはトリガー固有であり、処理が面倒です。回避策の1つは、xmltypeを明示的に作成することです。

    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;
    

    xml-generationは非常にテーブル固有です(:new --limitationsのため)、ターゲットテーブルのメタデータをクエリすることによってコード生成を使用します:

    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. SQLキー

    2. SQL Server:データベースが復元状態でスタックしている

    3. Oracle Forms&Reportsの現在の求人情報を検索する

    4. MySQLはtimediff出力を日、時、分、秒の形式に変換します