科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道利用DB2 9原生XML和PHP来简化XML应用程序

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文讲述了模式演化对应用程序的影响,并通过使用情景向用户说明设置 PHP 环境的容易程度;将DB2原生XML 功能与PHP应用程序(包括用PHP和 XQuery编写的Web服务)集成的容易程度。

作者:Hardeep Singh 来源:IT专家网 2008年6月5日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件
非 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)}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章