|
知识路径: > 数据库主流应用技术 > 数据库主流应用技术 > 数据库主流应用技术 > 面向对象数据库 > 对象关系数据库系统 >
|
相关知识点:9个
|
|
|
|
在对象关系数据库系统中允许用户定义函数与过程,它们既可以用某种数据操纵语言如SQL来定义,也可以通过外部的程序设计语言来定义,例如Java、C或C++。有些数据库管理系统支持它们自己的过程语言,如Oracle中的PL/SQL和Microsoft SQL Server中的Transact SQL,它们类似于SQL的有关过程的部分,但在语法和语义上有所区别,详细信息可参见各自的系统手册。
|
|
|
假设定义这样一个函数:给定一个文档,返回其作者的人数。可以定义这个函数如下:
|
|
|
|
这里Document是一个类型名。这个函数用单个文档对象来调用,select语句同关系one-doc一起执行,这个关系仅包括单个元组,即函数的参数。这个select语句的结果是单个值,严格来讲,它是一个只有单个属性的元组,其类型被转化为一个值。
|
|
|
上面的函数可以使用在如下查询中,该查询返回具有多于一个作者的所有文档的名称:
|
|
|
|
注意,上面的SQL表达式中,尽管在from子句中doc是指一个关系,但在where子句中它隐含地被视为一个元组变量,因此它可以用来作为author-count函数的一个参数。
|
|
|
有些数据库系统允许我们使用如C或C++这样的程序设计语言来定义函数。用这种方式定义的函数比用SQL定义的函数效率更高,并且能够执行有些无法用SQL完成的计算。使用这些函数的例子有很多,如在一个元组的数据上做一个复杂的算法。
|
|
|
用程序设计语言定义的函数在数据库系统的外部编译,它们需要被装入并与数据库系统代码一起执行。这个过程要冒一定的风险,因为程序中的错误可能会破坏数据库的内部结构,并且可能绕道数据库系统的存取控制功能。
|
|
|
使用程序设计语言定义的函数看起来与使用嵌入式SQL没什么不一样,使用嵌入式SQL时数据库查询包含在一个通用程序中,但是它们之间还是有一个重要差别。在嵌入式SQL中,用户程序将查询传送给数据库系统执行,结果以一次一个元组的形式返回给该程序。因此,用户书写的代码永远不会需要访问数据库本身,于是操作系统就可以保护数据库不被任何用户进程所存取。当在查询中使用用户编码的函数时,要么这些代码必须由数据库系统本身运行,要么该函数所操作的数据必须被拷贝到一个分离的数据空间中。第二种方法增加了系统开销,第一种方法则诱发了潜在的脆弱性,这同时表现在完整性方面和安全性方面。
|
|
|