Oracle对象的使用范围有多广?

Ale*_*lex 10 oracle user-defined-types

我正在为数据库类编写一个赋值,我们需要将现有的关系模式迁移到Oracle对象.这整个崩溃让我感到疑惑,这些东西有多广泛使用?数据模型很糟糕,语法很糟糕,而且面向对象只占实现方式的四分之三左右.

有人真的使用这个吗?

APC*_*APC 13

对于初学者,一些标准的Oracle功能使用Types,例如XMLDB和Spatial(包括声明嵌套表数据类型的列).

此外,许多PL/SQL开发人员一直使用类型来声明PL/SQL集合或流水线函数.

但我同意很少有地方广泛使用类型并从中构建PL/SQL API.有几个原因.

  1. Oracle非常缓慢地实现了Objects.尽管它们是在8.0版本中引入的,但直到9.2它们才完全支持继承,多态和用户定义的构造函数.没有这些功能,正确的面向对象编程是不可能的.我们SUPER()直到版本11g 才得到.即使是现在也缺少一些功能,最明显的是TYPE BODY中的私人声明.
  2. 语法通常很笨拙或令人沮丧地模糊不清.文档没有帮助.
  3. 大多数与Oracle合作的人往往来自关系/程序学校的编程.这意味着他们往往不了解OOP,或者他们无法理解在数据库编程中它有用的地方.即使人们提出了一个简洁的想法,他们发现很难或不可能使用Oracle的语法实现.

最后一点是关键点.我们可以学习新语法,我们可以说服Oracle完成功能集,但只有我们能够为类型提供用途才有用.这意味着我们需要使用继承和多态来解决的问题.

我曾经在一个广泛使用类型的系统上工作过.它是一个数据仓库系统,数据加载子系统是由类型构建的.基本原理很简单:

  • 我们需要为我们加载的每个表应用相同的业务规则模板,因此该过程是通用的;
  • 每个表都有自己的投影,因此每个表的SQL语句都是唯一的.

Type实现是干净的:通用过程在Type中定义; 每个表的实现都在一个继承自该泛型Type的Type中定义.可以从元数据生成特定类型.几年前我在UKOUG上介绍过这个主题,我在博客上写了更详细的内容.了解更多.

顺便说一下,关系理论包括域的概念,它是用户定义的数据类型,包括约束等.没有RDBMS的味道实际上支持域,但Oracle的类型实现绝对是一步.

  • 另一个缺点是客户端经常无法处理Oracle Objects.例如,ODP.NET(用于将Oracle与.NET应用程序连接的Oracle提供程序)支持Oracle类型需要很长时间.这使得处理空间数据变得困难.这已于2007年12月更改. (2认同)

Ada*_*sch 10

我从来没有见过它的好处,主要是因为当我上次检查它时,你的对象定义一旦被表使用就不可变.

因此,如果您在Customer表定义中使用了Address对象,那么在不删除Customer表或者不得不进行非常难以实现的转换的情况下,您永远不会更改Address对象定义.

对象适用于数据实例化 - 就像应用程序所做的那样 - 但对于数据存储和基于集合的操作,我只是看不到重点.


Ton*_*ews 7

许多其他答案给出了使用对象确实有意义的好例子; 通常,这些是处理某些特定的,可能是复杂的数据类型.Oracle本身将它们用于地理空间数据.

什么是常见的做,但它会伤心地出现在一些大学课程,是使用基于对象的表,而不是常规关系表来保存像员工和部门这样的常规数据:

create type emp_t as object (empno number, ename varchar2(10), ...);
create table emp of emp_t;
Run Code Online (Sandbox Code Playgroud)

虽然这些可能是教授概念的简单示例,但我担心它们可能会导致新一代数据库开发人员认为这种方法更合适,更现代,因此比"老式"关系表更好.它着重说不是.

  • +1,感谢关于在表定义中使用对象的问题.即使对列使用对象类型也是不必要的.我特别喜欢"它强调不是". (2认同)

Bob*_*ica 5

我只听说它被用在一个地方,所涉及的开发人员正在转而远离它.我曾经考虑过纯粹在PL/SQL中使用它,但是因为我们的DBA不会让我们安装任何类型,因为担心我们可能会在表中使用它们,这种情况不太可能发生.

分享和享受.