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;
答案 0 :(得分:0)
您可能需要完全限定队列名称。队列名称命名空间在运行时确定,并且队列中没有公共同义词,它将首先查看登录的用户命名空间,而不管过程所有者。如果我不得不猜测,当你登录在sqldeveloper中运行它时,它可能就像拥有你正在调用的过程的用户一样。
答案 1 :(得分:0)
这个问题是由dba向我解释的,这有点过头了。我正在使用的包中有一些变量声明是在一个正文范围之外声明的。我将它们移回包装体中,这使它们开始工作。