2010-02-24 3 views
1

Допустим, у меня есть:Вызов процедуры члена в Oracle 11g

create type address as object (
    line1 varchar2(50), 
    city varchar2(50), 
    member procedure insert_address(line1 varchar2, city varchar2) 
) 
/

create table address_table of address; 

create type body address as 
    member procedure insert_address(line1 varchar2, city varchar2) is 
    begin 
     insert into address_table values (line1, city); 
     commit; 
    end insert_address; 
end; 
/

Как я называю insert_address?

, выполнив следующие действия я получаю invalid number or types of arguments

begin 
    address.insert_address('123 my road','london'); 
end; 

я могу это сделать, и он работает, но, кажется, как плохая идея:

declare 
    v_address address := new address(null,null); 
begin 
    v_address.insert_address('123 my road','london'); 
end; 

Благодарности

+0

Что вы, кажется, не имеет особого смысла. Если вы не хотите, чтобы ваш тип вел себя объектно-ориентированным, лучше создайте простой пакет. Мне кажется, что вы собираетесь перенести концепции, например, с Java или C# непосредственно на PL/SQL. –

ответ

0

Поскольку вы его построили (что причудно), процедура insert_address может быть вызвана только в контексте объекта типа адрес и должна вызываться с параметрами line1 и city со значениями, которые не имеют связи с объект, который вы назвали «for». Это, как я хотел бы построить таблицу и код, и использовать его:

create table address_table (line1 varchar2(50), city varchar2(50)); 

create package address_pkg as 
    procedure insert_address(p_line1 varchar2, p_city varchar2); 
end; 
/

create package body address_pkg as 
    procedure insert_address(p_line1 varchar2, p_city varchar2) is 
    begin 
     insert into address_table (line1, city) values (p_line1, p_city); 
    end; 
end; 
/

exec address_pkg.insert_address ('123 my road', 'london'); 

С вашей фанковым модели, кажется, что процедура insert_address должен вставить «сам адрес объекта» в таблицу. Что-то вроде:

create type address as object (
    line1 varchar2(50), 
    city varchar2(50), 
    member procedure insert_address 
) 
/

create table address_table of address; 

create type body address as 
    member procedure insert_address is 
    begin 
     insert into address_table values (line1, city); 
     commit; 
    end insert_address; 
end; 
/

Тогда вставка будет, как:

declare 
    v_address address := new address('123 my road','london'); 
begin 
    v_address.insert_address; 
end; 
+0

Поскольку это еще одно академическое упражнение, нам сказали, что мы не можем использовать пакеты, поэтому я искал другой способ сделать это. – joec

+1

Я думаю, что единственной целью этого «объектно-реляционного» материала является предоставление материала для активных упражнений! Просто не было бы смысла строить таблицы таким образом в «реальном мире»! ;-) –

2

Использование static вместо member для вашей процедуры:

static procedure insert_address(line1 varchar2, city varchar2) 

Тогда вы можете вызвать его на тип объекта вместо экземпляра:

address.insert_address('123 my road','london'); 

См Using PL/SQL Object Types для получения дополнительной информации.