2010-02-22 8 views
2

je les suivantes:Oracle 11g SELF procédure de membre ne fonctionne pas

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)); 
/

i faites ceci est un bloc anonyme:

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

, mais rien ne se passe - la valeur des points reste à 10.

Qu'est-ce que j'ai manqué? Si je fais ma procédure de membre un update...set...commit et passez les points et un ID donné, cela fonctionne.

Merci.

+0

Je sais d'avoir répondu à l'une de vos questions précédentes que vous suivez un cours de formation quelconque. Malheureusement, ils semblent vous entraîner dans des fonctionnalités plutôt mystérieuses et inutiles d'Oracle! –

Répondre

1

Le fichier PL/SQL que vous avez publié n'est pas valide. Je suppose que vous vouliez dire à ce poste:

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

dire "Cust" non "c" sur la ligne 5?

Si c'est le cas, tout ce que vous avez fait est mis à jour la valeur des points dans la variable cust, pas dans le tableau. Vous pouvez voir que comme ceci:

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; 

Sortie:

110 

Pour mettre à jour les données du tableau ne nécessite en effet une instruction UPDATE.