Триггер Oracle в очередь / очередь не срабатывает - PullRequest
1 голос
/ 09 февраля 2012

Oracle 11g.У меня есть триггер, который вызывает процедуру.Эта процедура выполняет очередь и очередь.Когда я запускаю процедуру в 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;

Ответы [ 2 ]

0 голосов
/ 10 октября 2012

Проблема была объяснена мне дба, который был немного над моей головой. В пакете, который я использовал, было несколько переменных, которые были объявлены вне области тела. Я переместил их обратно в тела пакета, и это заставило их начать работать.

0 голосов
/ 09 февраля 2012

Возможно, вам необходимо полностью указать имя QUEUE.Пространство имен в очереди определяется во время выполнения, и при отсутствии общего синонима в очередях оно сначала просматривается в пространстве имен пользователя, вошедшего в систему, независимо от владельца процедуры.Если бы мне пришлось угадывать, когда вы входите в систему, чтобы запустить его в sqldeveloper, это, вероятно, пользователь, которому принадлежит процедура, которую вы вызываете.

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