从Oracle数据库创建XML文件

从Oracle数据库创建XML文件,xml,oracle,Xml,Oracle,我正在使用Oracle数据库。我需要创建一个从一些表中检索数据的XML文件。我已经编写了一个查询,它为我提供了所需的XML结果。请参见下面的查询 现在,我需要: 在“脚本格式文件”中编写查询,以便我可以从应用程序内部执行该文件 向脚本文件传递一个参数(以选择要从中获取数据的正确记录-在我提供的查询中,这是固定值“E_0015”) 将查询结果保存在XML文件中 我如何才能实现所有这些目标 select XMLSerialize(DOCUMENT XMLElement(

我正在使用Oracle数据库。我需要创建一个从一些表中检索数据的XML文件。我已经编写了一个查询,它为我提供了所需的XML结果。请参见下面的查询

现在,我需要:

  • 在“脚本格式文件”中编写查询,以便我可以从应用程序内部执行该文件

  • 向脚本文件传递一个参数(以选择要从中获取数据的正确记录-在我提供的查询中,这是固定值“E_0015”)

  • 将查询结果保存在XML文件中

  • 我如何才能实现所有这些目标

    select
           XMLSerialize(DOCUMENT 
           XMLElement("Gapi",
                      XMLAttributes('http://www.w3.org/2001/XMLSchema-instance' as "xmlns:xsi",
                                    'http://www.hmpwjb.com/gapi/WorkOrder' as "xmlns", 
                                    'TIW000' as "source_reference",
                                    'WorkOrder' as "name",
                                    'TIW17FNQ' as "destination_reference"),
                      (
                      select XMLElement("WorkOrderHeader",
                                        XMLElement("SourceTradingPartner", 'TIW000'),
                                        XMLElement("DestinationTradingPartner", 'TIW17FNQ'),
                                        XMLElement("WorkOrder", WorkOrderHeader.WO_NUM),
                                        XMLElement("WorkOrderDescription", WorkOrderHeader.WO_DESCRIPTION),
                                        XMLElement("ResponsiblePersonID", 'Opr'),
                                        XMLElement("DivisionID", 'COUNTRY'),
                                        XMLElement("SynchIndicatorID", 'A')
                                        , (
                                        select XMLElement("WorkOrderLine",
                                                          XMLElement("WorkOrderLineReference", '0001'),
                                                          XMLElement("Item", 'ITEM_CODE'),
                                                          XMLElement("SynchIndicatorID", 'A'),
                                                          XMLElement("SubstitutePriorityMethod", 'Y')
                                                          , (
                                                          select XMLElement("WorkOrderRoutingHeader",
                                                                            XMLElement("SynchIndicatorID", 'A'),
                                                                            XMLElement("Increment", '10')
                                                                            , (
                                                                            select XMLElement("WorkOrderRouting",
                                                                                              XMLElement("SynchIndicatorID", 'A'),
                                                                                              XMLElement("Operation", '  10'),
                                                                                              XMLElement("Function", 'FUNCTION'),
                                                                                              XMLElement("OperationType", 'I'),
                                                                                              XMLElement("WorkCenter", wortg.WC)
                                                                                              , (
                                                                                              select XMLAgg(XMLElement("WorkOrderRoutingTool",
                                                                                                                       XMLForest('A' as "SynchIndicatorID",
                                                                                                                                 WorkOrderRoutingTool.WO_RTOOL_SEQ as "ToolSeq",
                                                                                                                                 WorkOrderRoutingTool.TOOL as "ToolID",
                                                                                                                                 cast(WorkOrderRoutingTool.QTY as varchar(100)) as "ToolQuantity"))
                                                                                                            order by WorkOrderRoutingTool.WO_RTOOL_SEQ
                                                                                                           )
                                                                                              from WO_RTOOL WorkOrderRoutingTool
                                                                                              where WorkOrderRoutingTool.WO_NUM = WorkOrderHeader.WO_NUM
                                                                                                )
                                                                                             )
                                                                            from WO_HDR WorkOrderRouting
                                                                            left outer join WO_RTG wortg
                                                                               on wortg.CCN = WorkOrderRouting.CCN and wortg.MAS_LOC = WorkOrderRouting.MAS_LOC and
                                                                                  wortg.WO_NUM = WorkOrderRouting.WO_NUM 
                                                                            where WorkOrderRouting.WO_NUM = WorkOrderHeader.WO_NUM
                                                                              )
                                                                            , (
                                                                            select XMLElement("WorkOrderRoutingAddendum",
                                                                                              XMLElement("SynchIndicatorID", 'A'))
                                                                            from WO_HDR WorkOrderRoutingAddendum
                                                                            where WorkOrderRoutingAddendum.WO_NUM = WorkOrderHeader.WO_NUM
                                                                              )
                                                                           )
                                                          from WO_HDR WorkOrderRoutingHeader
                                                          where WorkOrderRoutingHeader.WO_NUM = WorkOrderHeader.WO_NUM
                                                            )
                                                         )
                                        from WO_HDR WorkOrderLine
                                        where WorkOrderLine.WO_NUM = WorkOrderHeader.WO_NUM
                                          )
                                        ,(
                                        select XMLElement("WorkOrderLineAddendum",
                                                          XMLElement("SynchIndicatorID", 'A'),
                                                          XMLElement("PlanningStatus", '4'),
                                                          XMLElement("ManufacturingStatus", '2')) 
                                        from WO_HDR WorkOrderLineAddendum
                                        where WorkOrderLineAddendum.WO_NUM = WorkOrderHeader.WO_NUM
                                         )
                                       )
                      from WO_HDR WorkOrderHeader
                      where WorkOrderHeader.WO_NUM = '              E_0015'
                      )
                     )
                AS BLOB ENCODING 'utf-8' VERSION '1.0' INDENT) as "XML"
    from dual;
    

    存储和执行查询的方式、传递参数的方式以及将结果写入文件的方式取决于您使用的应用程序。Alex:我们有一个使用Oracle数据库的系统,它位于Linux机箱中。我们有一种从应用程序内部执行命令的方法,因此我需要使用“shell”方法执行查询。为了使用数据库并“本地”测试,我们使用Toad(我编写并微调了我的查询),但我不能使用Toad来编写/测试我缺少的部分(查询文件、如何传递参数以及如何将查询结果转储到XML文件)。希望这能有所帮助。因此,您的应用程序将调用一个shell脚本,该脚本将调用SQL*Plus(?),该脚本将运行一个.SQL脚本文件—您想知道如何将一个参数赋给该脚本,并将结果写入一个文件吗?文件需要放在DB服务器上,还是放在shell运行的盒子上?Alex:是的,我们的系统可以使用PLSQL执行外部SQL命令;因此,我们需要使用脚本名称并找到一种将参数传递给脚本的方法。并且文件需要位于同一个Linux框中(虽然我不是100%确定,但可以随时与DBA人员核实)。谢谢为什么应用程序必须运行参数化的shell脚本才能执行查询脚本?为什么不直接连接到数据库并运行SQL?