从Web服务,Oracle,PLSQL返回分层数据

时间:2014-04-08 17:29:52

标签: xml web-services plsql hierarchy

我不确定我是否可以在PL / SQL中执行此操作,或者我需要在多个输出游标的Web服务中构建我的XML树。但我在oracle中读了一些关于分层查询的内容,它似乎是一个更优雅的解决方案。我对SQL非常缺乏经验,所以我很难将分层查询的例子应用到我的案例中。

我在这个层次结构中有4个表。

  1. SHIPMENTS :: KEYS {INTERNAL_ASN,BILL_OF_LADING}
  2. ORDERS :: KEYS {INTERNAL_ASN,BILL_OF_LADING,PO_NO}
  3. CARTONS :: KEYS {INTERNAL_ASN,BILL_OF_LADING,PO_NO,CARTON_NO}
  4. ITEMS :: KEYS {INTERNAL_ASN,BILL_OF_LADING,PO_NO,CARTON_NO,UPC_NO}
  5. 我希望返回的数据集最终以XML格式简化为:

      <DATA>
      <SHIPMENTS>
        <SHIPMENT>
          <ORDERS>
            <ORDER>
              <CARTONS>
                <CARTON>
                  <ITEMS>
                    <ITEM></ITEM>
                    <ITEM></ITEM>
                    <ITEM></ITEM>
                  </ITEMS>
                </CARTON>
                <CARTON>
                  <ITEMS>
                    <ITEM></ITEM>
                    <ITEM></ITEM>
                  </ITEMS>
                </CARTON>
              </CARTONS>
            </ORDER>
            <ORDER></ORDER>
          </ORDERS>
        </SHIPMENT> 
      </SHIPMENTS>
    </DATA>
    

    是什么让我的情况变得更加困难,是我选择的东西,实际上是从纸箱层面开始的。像这样的查询给了我所需的所有纸盒行,我需要前后退。

    SELECT *
    FROM  
    Q194977.AN_CARTON_INFO CI
    WHERE
    CI.PO_NO = 4887960
    AND CI.STORE_NO = 1560
    

    以下是我在Oracle Hierarchical查询中找到的文档,但它们的示例都使用相同的表。

    http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm#i2060615

    关于如何处理此问题的任何专家意见?

1 个答案:

答案 0 :(得分:2)

Oracle hierachical或connect-by查询与您的需求不同。您可以使用单个查询生成所需的结构,但需要使用Oracle XML SQL函数。以下是Oracle文档的链接:

http://docs.oracle.com/cd/E11882_01/appdev.112/e16659/xdb13gen.htm#i1029583

以下是您最终可能会遇到的事情:

    SELECT
       XMLElement("CARTONS", 
          XMLAgg (
             XMLElement("CARTON", 
                XMLForest(carton_id As "CARTON_ID", carton_name As "NAME"),
                 ( 
                   select XMLElement("ITEMS",
                            XMLAgg( 
                               XMLElement("ITEM", 
                                  XMLForest(item_id As "ITEM_ID", description As "DESCRIPTION")
                               )
                            )
                         )             
                     from ITEMS
                   where carton_id = c.carton_id
                )
             )
          )
       ) As myxml
     FROM CARTONS c

for producing:

          <CARTONS>
            <CARTON>
              <ITEMS>
                <ITEM></ITEM>
                <ITEM></ITEM>
                <ITEM></ITEM>
              </ITEMS>
            </CARTON>
            <CARTON>
              <ITEMS>
                <ITEM></ITEM>
                <ITEM></ITEM>
              </ITEMS>
            </CARTON>
          </CARTONS>

以上查询从您的纸箱级别开始。添加货件和订单层时,它会变得更加复杂。您基本上在查询中构造结构,但它绝对可行。

我希望您从REST API生成JSON。然后你可以尝试我已经完成的PL / SQL框架。此框架提供了一个实用程序,可以从常规查询生成复杂的JSON结构。如果您或任何其他人很想知道,这里有一个指向我们网站的链接:

http://backlogic.net

您可以在[用户指南] [1]

的第5.3节中找到一些有趣的示例
相关问题