时间:2022-12-18 18:30:01 | 来源:信息时代
时间:2022-12-18 18:30:01 来源:信息时代
对象查询语言 : 采用类似于SQL的语法,对对象数据库进行说明性的存取访问。
OQL与SQL_92非常接近,但扩展了复杂对象、对象标识、路径表达式、多态、操作调用和迟联编等面向对象概念。对象查询语言既可以用于关联访问,也可以用于导航访问。关联查询返回一个对象集合,这些对象的定位由对象数据管理系统负责,应用程序无需关心。导航查询访问单个对象,对象之间的联系被用来从一个对象导航到另一个对象,应用程序需要指定访问所要求对象的过程。ODMG3.0标准中OQL的主要内容包括:
(1)查询输入和结果(query input and result): 作为一种独立语言,OQL允许用名字查询指定对象,这些名字是进入数据库的入口点,一个名字可以指任意一种对象,如原子、结构、集合或文字等。作为一种嵌入式语言,OQL允许查询通过产生原子、结构、集合和文字的表达式的本机语言支持的指定对象。一个OQL查询是一个传递对象的函数,对象的类型可以从提交给查询表达式的操作符中推导出来。
(2)对象标识处理(dealing with object identity):查询语言同时支持对象和文字查询,这依赖于这些对象的构造和选择方式。使用类型名构造函数创建一个带标识的对象,通过精确的表达式可以查询现有对象,查询结果可以是具有对象标识,也可是不具有对象标识的对象。
(3)路径表达式(path expressions): OQL中通过具名对象可以进入数据库,但更常用的是通过一个对象导航到所需数据。OQL提供路径表达式机制,使得用户可以顺着对象间的简单关系进入复杂对象,OQL的路径表达式中支持谓词、逻辑运算和连接操作。
(4)未定义值(undefined values): 查询nil对象特性的结果是UNDEFINED。在OQL语言中,UNDEFINED是一种特殊的文字值,该值对任何文字或对象类型来说都是一个有意义的值。
(5)方法调用(method invoking):OQL允许用户在任何地方调用方法的结果类型与查询中期望类型相匹配的带参数或不带参数的方法,调用一个方法的概念与访问一个属性或遍历一个关系非常相似(对属性或关系的访问可以看成是调用一个不带参数的方法),这种灵活的语法可使用户无需知道特性是存储的或是计算的,若属性和方法名存在冲突时,则可在方法调用时在方法后面加上括号解决。
(6)多态(polymorphism):面向对象方法的一个主要特征是通过迟联编机制,提供操作多态集合的能力,从而在这些集合的元素上实现一般的行为。
(7)操作符构造(operator composition): OQL采用完全正交的操作符构造规则,其表达能力不受限制且语言容易学习。目前OQL提供集合操作符(并、交、差)、全称(all)和存在量词(exists)、排序(sort)和分组(group by)操作符、聚合(count、sum、min、max和avg)操作符等。
(8)语言定义(language definition):OQL是一种表达式语言,一个表达式返回的结果可能是一个对象或文字。OQL又是一种类型化的语言,每个查询表达式有一个类型,这个类型可以从查询表达式的结构、模式类型声明、具名对象或文字的类型中推导出来,因此可以在编译时或模式类型检查时进行查询正确性分析。对于每个查询表达式允许检查类型正确性和从子表达式类型中推导出表达式类型。主要内容包括:
查询(queries):一个查询是一个带有不限定变量的查询表达式。
具名查询定义(named query definition): 如果id是一个标识符,e是一个OQL表达式,x1,x2,…,xn是表达式e中的自由变量,t1,t2,…,tn是形式参数x1,x2,…,xn对应的类型,则表达式define[query]id(t1x1,t2x2,…,tnxn)ase(x1,x2,…,xn)定义id为一个具名查询。
命名空间(namescopes):在一些语言绑定中,类由命名空间来唯一区分,OQL中通过引入(import)语句在查询中指定类名。
基础表达式(elementary expressions):包括原子文字、具名对象和出现在SELECT-FROM-WHERE语句中的迭代变量、具名查询。
构造表达式(construction expressions): 如果T是一个类型名,具有性质p1,p2,…,pn,t1,t2,…,tn为对应特性的类型,如果e1,e2,…,en是类型t1′,t2′,…,tn′的表达式且ti′是ti的子类型,则T(p1::e1,p2::e2,…,pn::en)是类型T的一个表达式。
原子类型表达式(atomic type expressions):由作用在表达式上的标准一元或二元操作,以及由字符串操作构成。
对象表达式(object expressions)。对象表达式可使用对象或文字的等或不等表达式操作构成,并返回一个布尔值。如果表达式e的类型中有类型为T的属性或联系p,则可分别用表达式e.p和e-〉p提取属性或遍历联系,它们的类型均为T。
集合表达式(collection expressions)。集合表达式可以由全称量词、存在量词、成员测试、一元聚合算子构成;⑨查询表达式(select expression)。查询表达式可以由选择子句、分组子句、排序子句构成。索引集合表达式(indexed collection expressions):如果e1,e2是列表或数组类型的表达式,e3,e4是整数,则e1[e3],e1[e3:e4],first(e1),last(e1)及(e1+e2)都是表达式。
二元集合表达式(binary set expressions): 如果e1,e2是类型为Set或Bag的表达式,则e1,e2的集合操作并、交、差都是表达式。若〈op〉={<,<=,>,>=},e1〈op〉e2是一个布尔类型的表达式。
转换表达式(conversion expressions):如果e是一个表达式,则element(e)检查e是不是单个表达式,若不是则产生一个异常;如果e是一个list表达式,则listtoset(e)将list转换成set表达式;如果e是一个集合表达式,则flatten(e)将集合构成的集合转换成集合的表达式;如果e是一个表达式,c是一个类型名,则c(e)是断言e为类型c的对象的表达式,若不是则引发一个异常。函数和静态方法调用(function and static method call): 如果f是类型(t1,t2,…,tn-〉t)的一个函数,如果e1,e2,…,en是类型t1′,t2′,…,tn′的表达式,ti′是ti的一个子类型,且每个表达式ei都有定义,则f()和f(e1,e2,…,en)是类型t的表达式,且其值为函数返回的值或当函数不返回任何值时为nil。如果f是具有类型(t1,t2,…,tn->t)的类型C的一个静态函数,如果e1,e2,…,en是类型t1′,t2′,…,tn′
的表达式,ti′是ti的一个子类型,且每个表达式ei都有定义,则C.f(e1,e2,…,en)是类型t的表达式,且其值为函数返回的值或当函数不返回任何值时为nil。
特殊函数(special functions): OQL有两个特殊函数is_defined(e)和is_undefined(e)用于判断任意表达式e的值是否确定。
范围规则(scope rules): 出现在一个查询中的名字可按照下述规则查找: 该名字要么是当前范围中的一个变量,要么是由define语句引入的命名查询,要么是一个命名对象即数据库中的一个入口点,或者是当前范围中一个变量的属性名或操作名,当不存在模糊含义时,这个特性名只属于范围中的一个变量。
OQL既可以作为独立的语言使用,也可以嵌入到另外一个语言中使用,目前支持的语言有Smalltalk,C++和Java,对象查询语言还可以调用这些语言编写的函数。