$sql = 'SELECT XMLQuery('."'".'for $i in ora:view("employees")/ROW
where $i/EMPLOYEE_ID = $empno
return (
{$i/EMPLOYEE_ID,
$i/EMAIL,
$i/JOB_ID}
)'."'".'PASSING XMLElement("empno", :empno) AS "empno"
RETURNING CONTENT).GetStringVal() AS RESULT FROM DUAL';
$query = oci_parse($conn, $sql);
oci_bind_by_name($query, ":empno", $empno, 3);
oci_execute($query);
oci_fetch($query);
$str = oci_result($query, 'RESULT');
print $str;
?>
列表 3 中显示的脚本应生成以下输出(注意,浏览器中可能不会显示标记):
100
SKING
AD_PRES
XQuery 与 XSLT
尽管 Oracle 在 Oracle XML DB 中提供了一个自带 XSLT 处理器,但在很多情况下(尤其是在处理大型文档时),XQuery 对于构建 XML 更高效。此外,XQuery 表达式通常比为同一作业设计的 XSLT 样式表更具可读性,并且更清楚。与 XSLT 一样,XQuery 不但可用于将一个 XML 文档转换为另一个 XML 文档,而且还可用于将 XML 转换为另一种基于文本的格式,如 HTML 或 WML。
在本文前面的查询 XMLType 数据部分中,您看到了一个有关使用 XQuery 将一个 XML 文档转换为另一个 XML 文档的示例。具体而言,该示例使用 XQuery 表达式计算示例数据库模式 OE 的 purchaseorder 表中存储的订单的订单总计,然后为处理的每个订单生成了一个 OrderTotal XML 元素。实际上,您可以使用 XSLT 执行相同操作。为此,您首先需要创建一个应用于 PurchaseOrder XML 文档的 XSLT 样式表,以生成相应的 OrderTotal 元素。对于此示例,可以使用列表 4 中所示的 XSLT 样式表。
但在开发实际应用程序时,您将很可能需要 XQuery 表达式直接生成 HTML 标记,而不是仅仅生成一个如上所示的 XML 文档。这样,您便可以构建一个更灵活、可维护性更高的应用程序,原因是在这种情况下,所有 RSS 处理(从提取必要的数据到将它包装在 HTML 标记中)都将转移到数据库。这使您不必编写负责 RSS 处理的应用程序代码。实际上这意味着您不必在诸如 RSS 新闻提供的结构已经更改的情况下修改应用程序代码。相反,您只需修改用于 RSS 处理的 XQuery 表达式。
总结
您已经在本文了解到,XQuery 是一个综合的查询语言,它提供了一种用于查询、构建和转换 XML 数据的高效方法。尽管 Oracle XQuery 实施使您可以操作任何可以用 XML 表示的数据(无论它存储在数据库中、位于网站上还是存储在文件系统中),但将处理的数据移动到数据库中始终是一个不错的主意。对于数据库中存储的数据,Oracle XML DB(对 XPath 重写使用同一机制)只能显著优化处理那些基于以下数据构建的 XQuery 表达式:这些数据包括关系数据、对象-关系数据或使用结构化(对象-关系)存储技术存储的基于 XML 模式的 XMLType 数据。