Вызов процедуры-члена в Oracle 11g - PullRequest
1 голос
/ 24 февраля 2010

Допустим, у меня есть:

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;

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

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

static procedure insert_address(line1 varchar2, city varchar2)

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

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

См. Использование типов объектов PL / SQL для получения дополнительной информации.

0 голосов
/ 24 февраля 2010

Как вы его построили (что странно), процедура insert_address может быть вызвана только в контексте объекта типа address и должна вызываться с параметрами line1 и city, со значениями, которые не связаны с объектом ты назвал это "для". Вот как я должен построить таблицу и код и использовать его:

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