Вызов Oracle автономной хранимой процедуры из триггера - PullRequest
1 голос
/ 07 июля 2011

У меня есть триггер Oracle, который вызывает хранимую процедуру с определенным PRAGMA AUTONOMOUS_TRANSACTION. Значения, переданные из триггера, уже зафиксированы, но кажется, что значения недоступны в хранимой процедуре? Я не уверен в этом, так как возможность отладки / записи в журнал / фиксации трудна, и время вывода выводит меня в замешательство. Я хотел бы знать, ожидается ли, что любые переданные значения просто доступны в хранимой процедуре независимо от AUTONOMOUS_TRANSACTION? Спасибо

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

Значения, передаваемые хранимой процедуре в качестве параметров, всегда будут доступны для хранимой процедуры. Не имеет значения, объявлена ​​ли процедура с использованием автономной транзакции.

Код, запущенный в автономной транзакции, не может видеть изменения, внесенные вызывающей транзакцией. В 9 случаях из 10, когда люди описывают проблемы, видя ожидаемые данные, это является источником проблемы.

Если ваша хранимая процедура делает что-то кроме записи чего-либо в таблицу журнала, я бы с особой осторожностью использовал автономные транзакции. Если вы используете автономные транзакции для чего-либо, кроме регистрации, вы почти наверняка используете их неправильно. И вы, вероятно, представляете целый ряд ошибок, связанных с условиями гонки и целостностью транзакций.

0 голосов
/ 08 июля 2011

Если у вас есть триггер уровня строки в table_x, то этот триггер может быть запущен несколько раз одним и тем же оператором, так как этот оператор влияет на разные строки.

Порядок воздействия на эти строки является неопределенным. Таким образом, состояние table_x является неопределенным во время выполнения триггера уровня строки. Вот почему возникает исключение MUTATING TABLE.

Автономная транзакция «обманывает», просматривая зафиксированное состояние таблицы (т.е. исключая все изменения, сделанные этим оператором, и другие операторы в транзакции).

Если вы хотите, чтобы хранимая процедура смотрела на состояние table_x в ответ на активность в этой таблице, то это необходимо сделать после того, как были сделаны все изменения строк (т. Е. В триггере уровня оператора, а не на уровне строки). триггер).

Шаблон проектирования для этого часто состоит в том, чтобы установить флаг (переменную уровня пакета) в триггере уровня строки, проверить флаг в триггере уровня оператора AFTER, а при необходимости выполнить действие и сбросить его.

0 голосов
/ 07 июля 2011

"Логика триггера условно обновляет таблицу B, которая вызывает хранимую процедуру для выбора значений из таблицы A, чтобы можно было обновить таблицу B с помощью вычисленного значения."

Возможно, таблица B действительно должна представлять собой материализованное представление, полученное из таблицы A?Мы можем значительно усложнить предложения WHERE запросов, которые заполняют MViews. Узнайте больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...