微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环在尝试通过Oracle EBS中的并发程序使用PL / SQL创建XML时结束

如何解决循环在尝试通过Oracle EBS中的并发程序使用PL / SQL创建XML时结束

这是我过去一直在使用的基本代码。 我一直在尝试使用PLsql和EBS并发程序创建XML文件。我过去使用第一组代码成功完成了工作。但目前,我的第二个代码停在了送货地址,并且只设置了1行。

 LOOP
      FND_FILE.put_line(FND_FILE.OUTPUT,'<ROW>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ACCOUNT_NUMBER>'||rec.ACCOUNT_NUMBER||'</ACCOUNT_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ACCOUNT_NAME>'||replace(rec.ACCOUNT_NAME,'&','and')||'</ACCOUNT_NAME>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ADDRESS1>'||rec.ADDRESS1||'</ADDRESS1>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CITY>'||rec.CITY||'</CITY>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<STATE>'||rec.STATE||'</STATE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<GEOGRAPHY_NAME>'||rec.GEOGRAPHY_NAME||'</GEOGRAPHY_NAME>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<POSTAL_CODE>'||rec.POSTAL_CODE||'</POSTAL_CODE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRX_DATE>'||rec.TRX_DATE||'</TRX_DATE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRX_NUMBER>'||rec.TRX_NUMBER||'</TRX_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DESCRIPTION>'||rec.DESCRIPTION||'</DESCRIPTION>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<receipt_date>'||rec.receipt_date||'</receipt_date>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<receipt_number>'||rec.receipt_number||'</receipt_number>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CIMA_REV>'||rec.CIMA_REV||'</CIMA_REV>');



  FND_FILE.put_line(FND_FILE.OUTPUT,'</ROW>');
END LOOP;
FND_FILE.put_line(FND_FILE.OUTPUT,'</ROWSET>');

这是我当前正在执行的代码,它停止在

 FOR REC IN C_DATA
    LOOP
      FND_FILE.put_line(FND_FILE.OUTPUT,'<INVOICE_NUMBER>'||rec.Invoice_Number||'</INVOICE_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<INVOICE_DATE>'||rec.Invoice_Date||'</INVOICE_DATE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<INVOICE_AMOUNT>'||rec.Invoice_Amount||'</INVOICE_AMOUNT>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<INVOICE_TYPE>'||rec.Invoice_Type||'</INVOICE_TYPE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<INVOICE_BALANCE>'||rec.Invoice_Balance||'</INVOICE_BALANCE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO>'||rec.Ship_to||'</SHIP_TO>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO2>'||rec.Ship_to2||'</SHIP_TO2>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_ADDRESS1>'||rec.Ship_address1||'</SHIP_ADDRESS1');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_2ADDRESS2>'||rec.Ship_address2||'</SHIP_2ADDRESS2>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BILL_TO>'||rec.Bill_to||'</BILL_TO>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BILL_TO2>'||rec.Bill_to2||'</BILL_TO2>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BILL_ADDRESS1'||rec.Bill_address1||'</BILL_ADDRESS1>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BILL_ADDRESS2>'||rec.Bill_address2||'</BILL_ADDRESS2>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DUE_DATE>'||rec.Due_Date||'</DUE_DATE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ORIGINAL_TOTAL_AMOUNT>'||rec.Original_Total_Amount||'</ORIGINAL_TOTAL_AMOUNT>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<AMOUNT_DUE>'||rec.Amount_Due||'</AMOUNT_DUE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DAYS_LATE>'||rec.Days_Late||'</DAYS_LATE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<INVOICE_TAX>'||rec.Invoice_Tax||'</INVOICE_TAX>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_AND_HANDLING>'||rec.Ship_and_Handling||'</SHIP_AND_HANDLING>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CUSTOMER_NUMBER>'||rec.Customer_number||'</CUSTOMER_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CUSTOMER_NAME>'||rec.Customer_name||'</CUSTOMER_NAME>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<LINE_NUMBER>'||rec.Line_Number||'</LINE_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<PRODUCT_CODE>'||rec.Product_Code||'</PRODUCT_CODE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DESCRIPTION>'||rec.Description||'</DESCRIPTION>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<QUANTITY>'||rec.Quantity||'</QUANTITY>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<UNIT_PRICE>'||rec.Unit_Price||'</UNIT_PRICE>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ORDER_NUMBER>'||rec.Order_Number||'</ORDER_NUMBER>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<PO_NUMBER>'||rec.PO_Number||'</PO_NUMBER>');
                  enter code hereFND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIPPING_INSTRUCTIONS>'||rec.Shipping_Instructions||'</SHIPPING_INSTRUCTIONS>');
                  FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<AMOUNT>'||rec.Amount||'</AMOUNT>');

我能做些什么来阻止这种情况发生?

解决方法

您似乎在>的结束标记和'</SHIP_ADDRESS1'的开始标记中缺少'<BILL_ADDRESS1'

我建议您使用select语句中的XMLTYPE来构建XML,而不是使用字符串连接来构建XML文件(这可能会导致XML格式不正确)。这样,您可以一次构建所有XML,然后一次性将全部内容写入文件。将代码更改为这样的功能将大大减少您需要编写的代码量,并且无需遍历每一行,从而可能会提高性能。

在下面的示例中,我使用了一个示例查询来生成一些“发票”数据,但是您可以将其更改为用于游标的任何数据。

DECLARE
    l_xml   XMLTYPE;
BEGIN
    WITH
        invoice_data (invoice_number,invoice_date,invoice_amount)
        AS
            (    SELECT LEVEL,SYSDATE - LEVEL,ROUND (DBMS_RANDOM.VALUE (0,10000),2)
                   FROM DUAL
             CONNECT BY LEVEL <= 100)
    SELECT XMLELEMENT (
               "ROWSET",XMLAGG (
                   XMLELEMENT (
                       "ROW",XMLCONCAT (XMLELEMENT ("INVOICE_NUMBER",invoice_number),XMLELEMENT ("INVOICE_DATE",invoice_date),XMLELEMENT ("INVOICE_AMOUNT",invoice_amount)))))
      INTO l_xml
      FROM invoice_data;

    DBMS_XSLPROCESSOR.clob2file (l_xml.getClobVal,'TMP','testfile.txt');
END;
/

如果由于某种原因需要读回文件,则可以这样读取文件:

DECLARE
    l_clob   CLOB;
BEGIN
    l_clob := DBMS_XSLPROCESSOR.read2clob ('TMP','testfile.txt');
    DBMS_OUTPUT.put_line (DBMS_LOB.SUBSTR (l_clob,32767,1));
END;
/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。