Sql oracle对象和集合

Sql oracle对象和集合,sql,oracle,Sql,Oracle,只是想知道是否有人真的在Oracle中使用对象和集合?这是应该避免的吗 乙二醇 我相信很多程序员都在使用这种扩展;就我个人而言,在使用关系数据库时,我尽量坚持使用“合理标准的SQL”核心,因为我经常需要将我的SQL代码移植到其他一些数据库引擎,如果我大量使用专有扩展,移植就会变得更加困难(尽管专有扩展通常只增加很少的功能或速度)。我使用简单的集合[即VARCHAR2(4000)表],但仅用于“工作”。我实际上没有创建任何非Oracle类型的表。 我使用了Oracle提供的对象(例如MDSYS.S

只是想知道是否有人真的在Oracle中使用对象和集合?这是应该避免的吗

乙二醇


我相信很多程序员都在使用这种扩展;就我个人而言,在使用关系数据库时,我尽量坚持使用“合理标准的SQL”核心,因为我经常需要将我的SQL代码移植到其他一些数据库引擎,如果我大量使用专有扩展,移植就会变得更加困难(尽管专有扩展通常只增加很少的功能或速度)。

我使用简单的集合[即VARCHAR2(4000)表],但仅用于“工作”。我实际上没有创建任何非Oracle类型的表。
我使用了Oracle提供的对象(例如MDSYS.SDO_GEOM)对于地理方面的东西。

我之所以避免使用它们,是因为对象与关系模型不能很好地配合。如果两者都有,则往往两者都没有。这就是为什么对象关系映射对于项目来说非常重要。

如果你认真地从事PL/SQL编程,那么没有集合和对象,你几乎无法生存。这就是id,我保持数据库表“干净”,即所有列都包含原子值,没有嵌套表等。

是的,我们使用集合作为存储过程的参数。这使得可以选择具有特定id(通常在列表中称为变量)的所有记录,而无需使用临时表

例如:

create or replace type numbertype
as object(nr number(20,10) )
/ 

create or replace type number_table
as table of numbertype
/ 

create or replace 
procedure tableselect(p_numbers in number_table, p_ref_result out sys_refcursor)
is
begin  
   open p_ref_result for    
      select *    
      from employees 
      ,    (select /*+ cardinality(tab 10) */ tab.nr 
            from table(p_numbers) tab) tbnrs       
      where id = tbnrs.nr; 
end; 
/
还可以将此技术用于多列对象

create or replace type numbertype
as object(nr number(20,10) )
/ 

create or replace type number_table
as table of numbertype
/ 

create or replace 
procedure tableselect(p_numbers in number_table, p_ref_result out sys_refcursor)
is
begin  
   open p_ref_result for    
      select *    
      from employees 
      ,    (select /*+ cardinality(tab 10) */ tab.nr 
            from table(p_numbers) tab) tbnrs       
      where id = tbnrs.nr; 
end; 
/