#oracle #plsql #triggers #collation
Вопрос:
Как обсуждалось здесь, я не могу использовать :OLD и :NEW для столбцов с параметрами, отличными от USING_NLS_COMP. Я пытаюсь найти способ обойти это, но пока безуспешно.
Что я могу сделать, так это получить доступ к новым строкам с помощью составного триггера, сохраняя идентификаторы измененных строк ПОСЛЕ КАЖДОЙ СТРОКИ, а затем зацикливаясь на них и выбирая строки в ИНСТРУКЦИИ AFTER. К сожалению, то же самое не относится к старым ценностям.
Вот пример того, что не работает:
CREATE TABLE example_table (
id VARCHAR2(10),
name NVARCHAR2(100)
);
CREATE TABLE log_table (
id VARCHAR2(10),
new_name NVARCHAR2(100),
old_name NVARCHAR2(100)
);
CREATE OR REPLACE TRIGGER example_trigger
AFTER UPDATE ON example_table
FOR EACH ROW BEGIN
INSERT INTO log_table VALUES(:old.id, :new.name, :old.name);
END;
INSERT INTO example_table VALUES('01', 'Daniel');
-- this works as expected
UPDATE example_table SET name = ' John' WHERE id = '01';
SELECT * FROM log_table;
DROP TABLE example_table;
CREATE TABLE example_table (
id VARCHAR2(10),
-- this is the problematic part
name NVARCHAR2(100) COLLATE XCZECH_PUNCTUATION_CI
);
INSERT INTO example_table VALUES('01', 'Daniel');
-- here nothing is inserted into log_example, if you try to
-- recompile the trigger you'll get error PLS-00049
UPDATE example_table SET name = ' John' WHERE id = '01';
SELECT * FROM log_table;
DROP TABLE example_table;
DROP TABLE log_table;
DROP TRIGGER example_trigger;
Если у кого-то есть решение для этого, я был бы весьма признателен.
Комментарии:
1. Вы воссоздали триггер после воссоздания таблицы? Это не похоже на ваш сценарий, кроме комментария о PLS-00049.