非 XML RDBMS
插入语句将发生变化以包括新列。创建索引所需的查询将发生变化以在 WHERE 子句中包括这个新列。同样,用于根据索引中的选择列出货品的查询也将发生变化以包括新条件。
对应用程序代码的影响
- DB2 Viper
应用程序代码将没有任何更改。
- 非 XML RDBMS
- 将需要额外的 DOM 代码,以分割出子种类信息。
- INSERT 语句将需要额外的参数。
- 所有数据都有可能需要重新插入,这导致终端用户有一段时间无法操作。
用户单击种类或品牌时列出货品
用户单击特定种类或品牌时,将生成该种类或品牌中所有货品的列表。列表中的每个货品都有简短描述和到缩略图像的 URL。此列表显示在主页中并在其中进行格式设置。
图 6. 某一种类中的货品列表
DB2 Viper
在
DB2 中,XQuery 不仅创建列表,而且还将其转换为 HTML 输出,从而浏览器可以直接使用。使用 XQuery 的此功能,不仅可以推出业务逻辑,而且可以发布到数据库服务器,从而有效地使中间层应用程序非常简单。这正是使用 PHP 而不使用 Java™ 或 VS .NET® 的原因。
$xquery =for $i in $t/product
let $thumb := $i/description/images/image[@type="thumbnail"]
where $i/description/category = " . htmlentities($category) . "
return
{$i/description/name}
;
$stmt = db2_prepare($conn, "SELECT XMLSERIALIZE(XMLQUERY(
$xquery' PASSING BY REF T.DESCRIPTION AS \"t\"
RETURNING SEQUENCE) AS CLOB(32K)) FROM xmlproduct AS t");
db2_execute($stmt);
while(list($product) = db2_fetch_array($stmt)){echo $product;} |
查看上面的应用程序代码,我们注意到 PHP 代码减少为两行,而数据库查询包含大部分逻辑。
注意: 我们需要对使用 HTML 实体的任何传入 CGI 变量(如种类)进行转义,从而它们在插入 XQuery 时不包含任何非法的非转义实体。
虽然 XQuery 可以进行发布转换,但在许多情况下可能不适合进行此操作。由于设计、性能和样式原因,可能更适合于在中间层或客户机中使用 XSLT 转换来创建最终的 Web 页。在许多情况中,将两个查询捆绑为一个查询会更方便。使用 XQuery 并不阻止开发人员使用 XSLT 进行转换。我们在此的尝试将显示 XQuery 不仅可以进行数据搜索,而且可以对数据运行复杂业务逻辑和转换。
非 XML RDBMS
首先查询数据库以获取与所选种类匹配的所有货品的行集:
$sql = "SELECT P.Pid, P.Name, I.Location FROM sqlproduct P, sqlimages I
WHERE P.Category = ? AND I.Pid = P.Pid AND I.Type = ?");
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, array($category, "thumbnail")); |
然后在结果集中循环并使用 PHP 代码创建 Web 页:
while(list($prodPid, $prodName, $prodImg) = db2_fetch_array($stmt)) {
?>
}
?> |
虽然发布代码与 XQuery 中的非常相似,一个显著区别就是此代码在中间层中运行和维护,而不是在数据库服务器中。所以如果 XQuery 在数据库服务器中注册为存储过程,其维护将作为数据库的一部分。我们将在下一步中进行此操作。
产品详细信息 用户单击商店列出的任何产品时,应用程序都会创建一个详细产品页面,其中包含该产品的说明、尺寸、价格和可能的附加图像等信息。
图 7. 产品详细信息
DB2 Viper 创建产品详细信息的 XQuery 保存为存储过程。
用于创建产品详细信息的存储过程
用 SQL/PL 编写 getProduct 存储过程,其接受产品 ID 作为参数,并返回记录集的游标。这个存储过程主要执行 XQuery,其在页面一侧生成显示产品详细信息及其
图片以及其他缩略图的版面。

发表评论