Dynamic column_value в соответствии с динамическим column_name в триггере - PullRequest
0 голосов
/ 22 декабря 2011

Мне нужно сделать триггер, но единственное отличие, которое я пытаюсь сделать, это получить динамическое значение в соответствии с ': new.COLUMN_NAME' и ': old.COLUMN_NAME'

I'mприведение столбцов таблицы в запросе, и после этого я запускаю ее для LOOP ..

это мой триггер:

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;

, когда я компилирую триггер, он невыдает любую ошибку, но когда я пытаюсь вставить новое значение в таблицу, в которой выполняется триггер, она выдает эту ошибку:

ORA-01008: нет переменных todas las han sido enlazadas ORA-06512:ru "EUCEDA.AFT_INS_SOLICCAMBIO", línea 10 ORA-04088: ошибка durante la ejecución del disparador 'EUCEDA.AFT_INS_SOLICCAMBIO'

Проверка проблемы, которую я осознал, что проблема существует, но существуетЯ вижу, что это из-за: new.'dynamic_column 'не распознается.Пожалуйста помоги!Я много часов с этой проблемой и не могу ее решить.

Спасибо и извините за мой английский.

1 Ответ

0 голосов
/ 23 декабря 2011

:new и :old внутри триггеров несколько негибки. Я не знаю ни одного способа использования динамического SQL для того, что вы пытаетесь сделать с вашим EXECUTE IMMEDIATE. Я подозреваю, что это невозможно.

Боюсь, единственные альтернативы, о которых я знаю, несколько трудоемки. Одной из таких альтернатив является замена EXECUTE IMMEDIATE выражением CASE, например следующим:

    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, чтобы сгенерировать все строки WHEN ... THEN ... внутри этого оператора CASE, вместо того, чтобы вводить их все самостоятельно.

...