2013-03-05 2 views
0

У меня есть C_table и M_table, и между C_table и M_table есть связь между 1 и мной, также есть L_table, которая является A 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

Вы можете предоставить полный сценарий, который вызывает ошибку? потому что [это] (http://www.sqlfiddle.com/#!4/b9cb4/8) работает для меня (на 11 г) –

ответ

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 Is-A C_type, и мы знаем, C_type есть ссылка на m_type. Когда я создал таблицу из этих типов, я не знал, что мне нужно определить внешний ключ из M_table в L_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, что не очень хорошо, поэтому наконец, я изменил его на M_name вместо имени.

Смежные вопросы