0

プロシージャを作成してXML出力ファイルを作成し、そのプロシージャを同時リクエストに使用しようとしています。以下のパッケージ手順コードを見つけてください。

並行プログラムでエラーが発生しました

「原因:ORA-19202が原因でFDPSTPが失敗しました: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である必要があります。

私の出力は次のようになります:

出力

4

1 に答える 1

2

すでにXMLであるため、XML関数でDBMS_XMLGENを使用する必要はありません。getstringvalまた、エラーは、非XMLTypeオブジェクトを呼び出そうとしているという事実に起因しています。

代わりにこれを行うだけです:

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> 
于 2013-03-05T17:15:12.857 に答える