2015-10-01 4 views
-1

У меня есть базовый класс и другой класс, который наследуется от него. Что-то вроде следующегоCasting To Subtype

create or replace type object_base as object 
(
    number id, 
    member procedure UpdateTable 
) 
not final 
/
create or replace type body object_base is 
    member procedure UpdateTable is 
    begin 
     null; 
    end; 
end; 
/
create or replace type my_object under object_base 
(
    overriding member procedure UpdateTable 
) 
/
create table my_table of my_object; 
/
create or replace type body my_object is 
    overriding member procedure UpdateTable is 
    begin 
     update my_table set row = self where id = self.id; 
    end; 
end; 

Я получаю ошибку «ORA-00904 Неверный идентификатор» на линии

update my_table set row = self where id = self.id; 

, казалось бы, из-за что он признает себя как object_base, а не my_object. Кажется, я не могу разрешить это, используя treat (self as my_object). Любые решения?

+2

Это скомпилировано в 11.2.0.4 - по крайней мере, с 'id number', а не' number id'. Какую версию вы используете, и когда вы видите ошибку? –

ответ

0

У вас есть ошибка синтаксиса в вашем супер типа, который вы пренебрегая:

SQL> ed 
Wrote file /tmp/afiedt.buf 

    1* create or replace type foo_t as object (number id) not final; 
SQL>/

Warning: Type created with compilation errors. 

Elapsed: 00:00:00.43 
SQL> show errors 
Errors for TYPE FOO_T: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/30  PLS-00201: identifier 'ID' must be declared 
SQL> 

исправить эту ошибку в первую очередь. Он должен быть id number, как указано @AlexPoole.

+0

Вы не получите в итоге ORA-00904, хотя сначала вы получите недопустимые ошибки типа данных. Я предполагаю, что это опечатка от упрощения реального кода («Что-то вроде ...»), но кто знает ... –