Процедура члена Oracle 11g SELF не работает - PullRequest
2 голосов
/ 22 февраля 2010

У меня есть следующее:

create type customer as object (
id number, name varchar2(10), points number,
member procedure add_points(num_points number)
) not final;
/

create type body customer as
member procedure add_points(num_points number) is 
begin
   points := points + num_points;
   commit;
end add_points;
end;
/

create table customer_table of customer;
/

insert into customer_table values (customer(123,'joe',10));
/

тогда я делаю это анонимный блок:

declare
cust customer;
begin
select treat(value(c) as customer) into cust from customer_table c where id=123;
c.add_points(100);
end;

но ничего не происходит - значение очков остается на уровне 10.

Что я пропустил? Если я сделаю процедуру члена update...set...commit и передам очки и заданный идентификатор, это сработает.

Спасибо.

1 Ответ

1 голос
/ 22 февраля 2010

PL / SQL, который вы опубликовали, недействителен. Я думаю, вы хотели опубликовать это:

declare
  cust customer;
begin
  select treat(value(c) as customer) into cust from customer_table c where id=123;
  cust.add_points(100);
end;

т.е. «cust» не «c» в строке 5?

Если это так, все, что вы там сделали, обновило значение баллов в переменной cust , а не в таблице. Вы можете видеть это так:

declare
  cust customer;
begin
  select treat(value(c) as customer) into cust from customer_table c where id=123;
  cust.add_points(100);
  dbms_output.put_line(cust.points);
end;

Выход:

110

Для обновления данных в таблице действительно требуется оператор UPDATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...