将 oracle xmltype 表字段选择到 xmltype 变量中会导致空对象

Posted

技术标签:

【中文标题】将 oracle xmltype 表字段选择到 xmltype 变量中会导致空对象【英文标题】:Selecting an oracle xmltype table field into an xmltype variable results in a null object 【发布时间】:2012-06-13 23:42:04 【问题描述】:

这一直困扰着我一段时间。作为存储过程的一部分,我正在使用 oracle 流将消息写入 oracle AQ 队列。下面是显示相关部分的存储过程:

CREATE OR REPLACE PROCEDURE ESBEVENT.esb_dml_handler(in_any IN ANYDATA) IS

l_enqueue_options dbms_aq.enqueue_options_t;
l_message_properties dbms_aq.message_properties_t;
l_message sys.aq$_jms_text_message;
l_msgid raw(16);
l_xmlmsg SYS.XMLTYPE;
err_num NUMBER;
err_msg VARCHAR2(100);

BEGIN
    BEGIN
    l_message := sys.aq$_jms_text_message.construct;
    l_xmlmsg := DBMS_STREAMS.CONVERT_LCR_TO_XML(in_any);
    l_message.set_text(l_xmlmsg.getClobVal());

    dbms_aq.enqueue
    ( queue_name => 'esbevent.esb_jms_queue'
    , enqueue_options => l_enqueue_options
    , message_properties => l_message_properties
    , payload => l_message
    , msgid => l_msgid
    );
    COMMIT;

    err_num := '';
    err_msg := 'Message Queued Successfully';

    EXCEPTION
    WHEN OTHERS THEN
        err_num := SQLCODE;
        err_msg := SUBSTR(SQLERRM, 1, 1000);
        INSERT INTO esbevent.esb_dml_handler_error_t VALUES (SYSDATE, err_num||' - '||err_msg );
END;

INSERT INTO esbevent.esb_jms_msg_memento_t VALUES (esb_jms_msg_memento_seq.nextval,     SYSDATE, l_xmlmsg, err_num||' - '||err_msg );
COMMIT;


END;

在入队之后,我将作为 XMLTYPE 发送的消息存储在表 esb_jms_msg_memento_t 中。如果我们在后续处理中遇到问题,这是为了启用重新发送。我现在正在尝试编写一个块来提取 XMLTYPE 字段数据并将其再次写入 AQ。目前是这样的:

DECLARE
   l_enqueue_options      DBMS_AQ.ENQUEUE_OPTIONS_T;
   l_message_properties   DBMS_AQ.MESSAGE_PROPERTIES_T;
   l_message              SYS.aq$_jms_text_message;
   l_msgid                RAW (16);
   l_xmlmsg               XMLTYPE;

BEGIN
   SELECT msg_payload
     INTO l_xmlmsg
     FROM esb_jms_msg_memento_t
    WHERE UNIQUE_ID = '815929';

   l_message.set_text (l_xmlmsg.getClobVal ()); --null self error here


   DBMS_AQ.enqueue (queue_name           => 'esbevent.esb_jms_queue',
                    enqueue_options      => l_enqueue_options,
                    message_properties   => l_message_properties,
                    payload              => l_message,
                    msgid                => l_msgid);
   COMMIT;
END;

当我运行它时,我得到了错误:

ORA-30625: 不允许对 NULL SELF 参数进行方法调度 ORA-06512:在第 22 行

看来我可以在 XMLTYPE 字段中插入 XMLTYPE 变量,但反过来不行???

【问题讨论】:

【参考方案1】:

我一发帖就解决了……

忘记构造 l_message:

l_message := sys.aq$_jms_text_message.construct;

哇!

【讨论】:

我是否允许自己为此加分或减分以浪费我自己的时间 写下问题能让你更清楚地思考它,并尽可能让你自己解决它。几乎没有浪费时间。我想我们在 *** 的所有人都可以说:很高兴能提供帮助。

以上是关于将 oracle xmltype 表字段选择到 xmltype 变量中会导致空对象的主要内容,如果未能解决你的问题,请参考以下文章

拆分 XMLTYPE 以根据条件创建两个 XMLTYPE

Oracle XMLType - 迭代具有某些属性值的元素

将 2 个单独的 XMLType 记录合并到一个 xml 文件中

oracle, xmltype/clob substr 循环

使用 XMLType 在 oracle 表中加载 XML 的过程

ORA-03001: 将 XMLTYPE 从表转换为 NCLOB 时未实现的功能