【问题标题】:"cannot INSERT object view REF or user-defined REF"“无法插入对象视图 REF 或用户定义的 REF”
【发布时间】:2013-03-05 23:52:19
【问题描述】:

我有一个 C_table 和 M_table 并且 C_table 和 M_table 之间存在 m 对 1 的关系,我还有 L_table 这是一个 C_table 类型,我正在尝试使用 oracle SQL Developer 使用 OODBMS。我有以下类型和表格:

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)
);

我也创建了他们的表,现在我尝试如下插入到 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

【问题讨论】:

  • 你能提供一个导致错误的完整脚本吗?因为this 对我有用(在 11g 上)

标签: oracle oracle10g oracle11g object-oriented-database


【解决方案1】:

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

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 Is-A C_type,并且我们知道C_type 引用了M_type。当我用这些类型创建表时,我不知道我还必须在 L_table 中定义 M_table 的外键,我在想既然 L_table 派生自 C_table,如果我在 C_table 中定义外键就足够了,但这还不够,我必须像这样在 L_table 中从 M_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 中使用了名称,这不是一个好方法,所以最后我把它改成了 M_name 而不是 name。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2011-12-15
    • 1970-01-01
    • 2010-10-18
    • 2010-09-19
    • 2020-05-11
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多