2013-03-05 67 views
0

我有一个C_table和M_table,并且存在C_table和M_table之间的1关系,我也有L_table这是一个C_table类型,我试图使用OODBMS使用oracle SQL Developer。我有以下类型和表:“不能INSERT对象视图REF或用户定义REF”

create type C_table as object 
(
    se number(10), 
    sp number(10), 
    pr number(15), 
    me number(3), 
    ste S_type, 
    name ref M_type 
)not final; 


create type m_type as object 
(
    name varchar2(25), 
    add varchar(25) 
); 

type L_type under computer_type 
(
    w number(5) 
); 

,我已经创建了自己的表,还有,现在我想插入thhe L_table如下,我发现了以下错误:

insert into l_tab select 500,2,1600,4, S_type('Ms','Me'), REF(d),1.5 from m_tab d where 
d.name= 'Int'; 

SQL Error: ORA-22979: cannot INSERT object view REF or user-defined REF 
22979. 00000 - "cannot INSERT object view REF or user-defined REF" 
*Cause: Attempt to insert an object view REF or user-defined REF in a 
      REF column created to store system generated REF values" 
*Action: Make sure the REF to be inserted is not from an object view 
      or from a user-defined REF column 
+2

你能提供一个完整的脚本导致错误吗?因为[this](http://www.sqlfiddle.com/#!4/b9cb4/8)适合我(11g) – 2013-03-06 06:02:34

回答

0

很抱歉,由于保密权限,我无法加载完整的脚本。但我很乐意分享这个问题的解决方案。

create type C_table as object 
(
    se number(10), 
    sp number(10), 
    pr number(15), 
    me number(3), 
    ste S_type, 
    name ref M_type 
)not final; 


create type m_type as object 
(
    name varchar2(25), 
    add varchar(25) 
); 

type L_type under computer_type 
(
    w number(5) 
); 

基于ERD我们已经知道,L_TYPE是-A C_type,我们知道C_type有M_type参考。当我创建这些类型的表时,我不知道我必须在L_table中定义M_table中的外键,并且我一直在考虑从L_table派生自C_table,如果我在C_table中定义外键就足够了,但它是不够的,我不得不定义从M_table在L_table一个外键,以及这样

create table C_table of C_type 
(foreign key (name) references M_table) 
object id primary key 

也:

create table l_table of l_type 
(foreign key (name) references M_table) 
object id primary key 
现在

,如果我用这个查询我不会有任何问题或错误:

insert into l_tab select 500,2,1600,4, S_type('Ms','Me'), REF(d),1.5 from m_tab d where 
d.name= 'Int'; 

我也在一些博客中读到,我们必须小心不要使用系统名称,并将预定义的名称作为表中的一个属性,就像本例中我在M_table中使用name一样,这不是一个好方法,所以最后我把它改成了M_name而不是名字。