新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > DB2教程 > 正文:利用DB2 9原生XML和PHP来简化XML应用程序

利用DB2 9原生XML和PHP来简化XML应用程序

新客网 XKER.COM 2006-08-27 来源: 收藏本文
  • 连接 Web 服务:



    $client = new SoapClient(null, array(location' =>

    http://127.0.0.1/cartsvc.php',

    uri' => http://ibm.com/db2/xml/php'));

    $taxrate = 0.0;


  • 调用 Web 服务并将返回的字符串输出到浏览器:



    echo $client->getCart($cartXML, $taxrate); ?>


  • 注意: 因为购物车作为 Web 服务来实现,所以可以从任何语言调用它。

    非 XML RDBMS

    此示例的关系版本没有 Web 服务或销售税计算。虽然查询看起来比 XQuery 简单,但我们必须为购物车中的每个货品查询数据库,导致数据库流量增加,应用程序代码有些更面向循环。由于可以使用 PHP 容易地创建 Web 服务,从关系部分创建 Web 服务将不会很难。与在 XML 版本中一样,getCart 函数会接受购物车作为参数,其格式需要提前确定。如果是 XML 值,则需要使用 DOM 来读取购物车,或者可以是关联数组,只需对以上代码进行很少的更改。另一方面,如果希望创建使用关系数据库显示购物车的存储过程,需要将 HTML 内容与从数据库中检索的数据合并。将需要大量工作以使表示代码不在存储过程中,而在应用程序中。










    }

    }

    ?>



    foreach($cart as $pid => $quantity) {

    $stmt = db2_prepare($conn, "SELECT Name, Price FROM sqlproduct WHERE Pid = ?");

    db2_execute($stmt, array($pid));

    if($stmt) {

    list($prodName, $prodPrice) = db2_fetch_array($stmt);

    ?>









    Remove



    $



    采购订单

    一旦用户选择付帐,购物车将发送到应用程序,并为采购的货品生成 XML 采购订单文档。

    用于创建采购订单的 XML 代码和关系代码大部分都相同,惟一的差别是用于查找产品当前价格的查询。


    $stmt = db2_prepare($conn, "VALUES (NEXT VALUE FOR POid)");

    db2_execute($stmt);

    list($POid) = db2_fetch_array($stmt);

    foreach($cart as $pid => $quantity) {

    $xquery = $t/product/description/price/text()';

    $stmt = db2_prepare($conn, "SELECT XMLSERIALIZE(XMLQUERY($xquery' PASSING BY REF

    T.DESCRIPTION AS \"t\" RETURNING SEQUENCE) AS VARCHAR(8)) FROM xmlproduct

    AS t WHERE Pid = ?");

    db2_execute($stmt, array($pid));

    list($price) = db2_fetch_array($stmt);


    虽然我们可以使用 DOM 创建采购订单,在本例中合并 XML 片段将更简单。


    $PO .= " \n";

    }




    $stmt = db2_prepare($conn, "INSERT INTO xmlporder (POid, POrder) VALUES (?, ?)");

    db2_execute($stmt, array($POid, $PO));


    采购订单(PO)在关系数据库中存储为 CLOB(而不分割)。完整存储的好处是任何由于采购订单的变化(如运输等其他信息)而发生的模式演化都不会有什么影响。将 PO 存储为 CLOB,则可以在应用程序代码中使用 DOM 来检索相关信息。但是,关系存储的简单和模式演化的好处会被查询性能的降低所抵消,当我们尝试创建采购历史记录报告时会发现这一点。

    发票

    发票在付帐时返回给客户。该发票是通过查询刚刚创建的采购订单而生成的。因为采购订单不包含详细产品信息,所以需要进行单独查询,以便从产品表中查找产品详细信息。

    图 9. 发票

    发票

    DB2 Viper
    1. 同样,我们使用单个 XQuery 创建最终发票。

      $xquery =

      for $po in $t/purchaseOrder

      let $sum := for $item in $po/items/item return $item/@quantity * $item/@price

      let $items := for $item in $po/items/item


    2. 在采购订单和产品表之间创建联接以获取产品详细信息。











      return



      {$items}

      {$po/text()}













      ;


      let $name := for $i in db2-fn:xmlcolumn("XMLPRODUCT.DESCRIPTION")/product where

      $i/@pid = $item/@pid return $i/description/name/text()

      return



      {$name}



      {xs:string($item/@quantity)}



      ${xs:string($item/@price)}

      Total ${sum($sum)}


    有趣的是,以上 XQuery 与用于显示购物车内容的 XQuery 相似:

    收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
    发表评论
    要记得去论坛讨论,点击注册新会员匿名评论
    评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
    阅读排行
    随机推荐
    实用信息推荐