2011-12-22 49 views
0

我需要做一個觸發器,但唯一的區別,我想要做的是獲得一個動態值根據':new.COLUMN_NAME'和':old.COLUMN_NAME'動態column_value根據動態column_name在觸發器

我帶來了表的列在查詢之後,我有一個for循環中運行它..

這是我的觸發器:

CREATE OR REPLACE TRIGGER aft_ins_soliccambio 
AFTER INSERT OR DELETE OR UPDATE 
ON SEG_V_SOLICCAMBIO 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
DECLARE 
    old_col_value VARCHAR2 (4000); 
    new_col_value VARCHAR2 (4000); 
BEGIN 
    FOR REC IN ( SELECT OWNER, TABLE_NAME, COLUMN_NAME 
        FROM all_tab_columns 
        WHERE OWNER = 'EUCEDA' AND (TABLE_NAME = 'SEG_V_SOLICCAMBIO') 
       ORDER BY column_id) 
    LOOP 
     EXECUTE IMMEDIATE ' select :new.' || REC.COLUMN_NAME || ' from dual' 
       INTO new_col_value; 

     pkg_tumi.insert_auditoria ('SEG_V_SOLICCAMBIO', 
           REC.COLUMN_NAME, 
           :new.EMPR_IDEMPRESA_N, 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 1), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 2), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 3), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 4), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 5), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 6), 
           1, 
           '', 
           new_col_value, 
           SYSDATE, 
           NULL); 
    END LOOP; 
END; 

當我編譯觸發它不拋出任何錯誤,但當我嘗試在表中插入一個新的值,我正在觸發[R它拋出這個錯誤:

ORA-01008: no todas las variables han sido enlazadas ORA-06512: en "EUCEDA.AFT_INS_SOLICCAMBIO", línea 10 ORA-04088: error durante la ejecución del disparador 'EUCEDA.AFT_INS_SOLICCAMBIO'

檢查我意識到這個問題是之間的問題「執行即時..」,但我看到,是因爲:new.'dynamic_column」不被認可。請幫忙!我在這個問題上花了很多時間,我無法解決這個問題。

感謝和抱歉我的英語。

回答

0

:new:old在觸發器內有些不靈活。我不知道有什麼方法使用動態SQL來做你正在試圖用你的EXECUTE IMMEDIATE做什麼。我懷疑這是不可能的。

恐怕我知道的唯一選擇是有點費力。一個這樣的選擇是更換EXECUTE IMMEDIATECASE表達式,比如下面:

new_col_value := CASE REC.COLUMN_NAME 
         WHEN 'COLUMN_1' THEN :new.column_1 
         WHEN 'COLUMN_2' THEN :new.column_2 
         WHEN 'COLUMN_3' THEN :new.column_3 
         ... 
        END; 

可能可以運行一個合適的SQL語句來此CASE語句中產生的所有WHEN ... THEN ...線,而不是打字他們都在你自己。

+0

非常感謝!當我使用它時非常有用。我放棄了,你的回答就像一個燈(= 我試過了,它工作正常(調整我的代碼當然)。非常感謝你!^^ – user1112291 2011-12-23 20:10:40