Оракул 11г. У меня есть триггер, который вызывает процедуру. Эта процедура выполняет очередь и удаление из очереди. Когда я запускаю процедуру в sqldeveloper, она работает нормально. Если я обновляю таблицы, которые срабатывает триггер, процедура выполняется нормально. Если я войду в рассматриваемое приложение и запущу процесс, который вызывает срабатывание триггера, процедура не сработает. В частности, очередь и исключение из очереди не работают, потому что, если я удаляю код очереди/удаления из очереди и вместо этого делаю вставку в таблицу, процедура выполняется нормально.
Поэтому я думаю, что, возможно, есть проблема с разрешениями, из-за которой триггер не может выполниться на dbms_aq. Кто-нибудь знает, как это решить? Есть ли учетная запись пользователя, которая запускает триггеры, которым необходимо предоставить привилегии?
Я не думаю, что проблема в процедуре, потому что она работает нормально. Я также не передаю какие-либо динамические данные из триггера, поэтому способ, которым я запускаю процедуру в sqldeveloper, точно такой же, как триггер вызывает процедуру.
Примечание: продезинфицированный код
create or replace
TRIGGER mytrig
AFTER INSERT ON INVENTORY_TRANSACTION
FOR EACH ROW
WHEN ((NEW.CLIENT = 'abcwidgets') AND (NEW.CODE = 'Receipt'))
BEGIN
dschema.mypack.queue_receipt('abcwidgets','999','bbb','1','88');
EXCEPTION
WHEN OTHERS THEN NULL;
END;
PROCEDURE QUEUE_RECEIPT(
CLIENTID IN VARCHAR2
, RECEIPTID IN VARCHAR2
, SITEID IN VARCHAR2
, LINEID IN VARCHAR2
, UPDATE_QTY IN VARCHAR2
) AS
ctxHandle dbms_xmlgen.ctxHandle;
l_xml xmltype;
queueopts DBMS_AQ.ENQUEUE_OPTIONS_T;
msgprops DBMS_AQ.MESSAGE_PROPERTIES_T;
msgid RAW(16);
BEGIN
ctxHandle := dbms_xmlgen.newContext('SELECT line_id,
user_data_4
FROM inventory
');
l_xml := xmltype(dbms_xmlgen.getxml(ctxHandle));
DBMS_AQ.ENQUEUE ('DSCHEMA.ABCWIDGETS_QUEUE',
queueopts,
msgprops,
l_xml,
msgid);
END QUEUE_RECEIPT;