【问题标题】:ORA-22806: not an object or REF : error while generating XML outputORA-22806: 不是对象或 REF: 生成 XML 输出时出错
【发布时间】:2013-02-20 03:11:30
【问题描述】:

我正在尝试通过创建一个过程来创建一个 XML 输出文件,并将该过程用于并发请求。请找到下面的包程序代码。

并发程序出错了

“原因:FDPSTP 由于 ORA-19202 失败:XML 处理中发生错误 ORA-22806:不是对象或 REF”。

CREATE OR REPLACE PACKAGE BODY xx_outbound_xml1
AS
   PROCEDURE xx_insert_outbound_xml1 (
      errbuff   OUT   VARCHAR2,
      errcode   OUT   NUMBER
   )
   IS
      ln_ctx        DBMS_XMLGEN.ctxhandle;
      lc_xml_clob   CLOB;
   BEGIN
      ln_ctx :=
         DBMS_XMLGEN.newcontext
            (   'SELECT XMLELEMENT("litleRequest",
                              XMLATTRIBUTES('
             || 'to_char(sysdate,''DDMMYYYHH24MI:SS'')'
             || ' AS "Id"                   ),
                (SELECT 
                    XMLAGG(
                        XMLELEMENT(
                        evalname(Decode((select order_type FROM my_orders WHERE order_id = mo.order_id),''CO'',''"Credit"'',''"Sale"'')).getstringval(),
                        XMLFOREST (
                        mo.order_id AS "orderId",
                        mo.order_type as "orderType"
                                    )
                                )
                        )
  FROM my_orders mo
                )
            ) xml
 FROM dual'
            );
      DBMS_XMLGEN.setrowsettag (ln_ctx, NULL);
      DBMS_XMLGEN.setrowtag (ln_ctx, NULL);
      --DBMS_XMLGEN.setNullHandling(ln_ctx,dbms_xmlgen.EMPTY_TAG);
      lc_xml_clob := DBMS_XMLGEN.getxml (ln_ctx);
      lc_xml_clob := REPLACE (lc_xml_clob, '<XML>', '');
      lc_xml_clob := REPLACE (lc_xml_clob, '</XML>', '');
      DBMS_XSLPROCESSOR.clob2file (lc_xml_clob,
                                   'INBOUNDFOLDER',
                                   'output.xml',
                                   0
                                  );
      DBMS_LOB.freetemporary (lc_xml_clob);
   END xx_insert_outbound_xml1;
END xx_outbound_xml1;

如果订单类型是 CO,那么标签应该是 Credit,或者如果 order_type 是 SO,那么标签应该是 Sales。

我的输出应该是这样的:

【问题讨论】:

    标签: xml oracle


    【解决方案1】:

    您不需要将 DBMS_XMLGEN 与 XML 函数一起使用,因为它已经是 XML!错误还来自您尝试在非 XMLType 对象上调用 getstringval 的事实。

    而只是这样做:

    create or replace package body xx_outbound_xml1
    as
       procedure xx_insert_outbound_xml1 (
          errbuff   out   varchar2,
          errcode   out   number
       )
       is
          ln_ctx        dbms_xmlgen.ctxhandle;
          lc_xml_clob   clob;
       begin
         select xmlserialize(document
                  xmlelement(
                    "litleRequest",
                    xmlattributes(to_char(sysdate,'DDMMYYYHH24MI:SS')  AS "Id"),
                    xmlagg(
                      xmlelement(
                        evalname(Decode(order_type, 'CO','Credit','Sale')),
                        xmlforest (
                          mo.order_id AS "orderId",
                          mo.order_type as "orderType"
                        )
                      )
                    )
                  )
                ) xml
         into lc_xml_clob
         from my_orders mo;
    
        dbms_xslprocessor.clob2file (lc_xml_clob,
                                     'INBOUNDFOLDER',
                                     'output.xml',
                                     0
                                    );
       end xx_insert_outbound_xml1;
    end xx_outbound_xml1;
    /
    

    例如,使用该代码(加上我在 xmlserialize 中添加了“缩进”,以便在此处更容易看到):

    SQL> var b varchar2(2000)
    SQL> var c number
    SQL> exec xx_outbound_xml1.xx_insert_outbound_xml1(:b, :c)
    
    PL/SQL procedure successfully completed.
    
    SQL> host cat /tmp/output.xml
    <litleRequest Id="05030131727:20">
      <Sale>
        <orderId>1132339612</orderId>
        <orderType>SO</orderType>
      </Sale>
      <Credit>
        <orderId>1132339530</orderId>
        <orderType>CO</orderType>
      </Credit>
      <Sale>
        <orderId>1132339116</orderId>
        <orderType>SO</orderType>
      </Sale>
      <Credit>
        <orderId>1132338886</orderId>
        <orderType>CO</orderType>
      </Credit>
    </litleRequest>
    
    SQL> select * from my_orders;
    
      ORDER_ID OR
    ---------- --
    1132339612 SO
    1132339530 CO
    1132339116 SO
    1132338886 CO
    
    SQL> 
    

    【讨论】:

    • 我不是要在这里注入my question,但我发现你的答案与我的结构非常相似,希望你也能给我一个答案?
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2015-05-26
    • 2021-07-30
    • 2014-01-10
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多