2010-02-24 5 views
1

Disons que j'ai:Appel d'une procédure de membre 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; 
/

Comment appeler insert_address?

En faisant ce qui suit je reçois invalid number or types of arguments

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

je peux le faire et il fonctionne, mais semble être une mauvaise idée:

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

Merci

+0

Ce que vous ne ne semble pas beaucoup de sens. Si vous ne voulez pas que votre type soit orienté objet, mieux vaut créer un paquet simple. Il me semble que vous êtes sur le point de transférer des concepts de, disons, Java ou C# directement à PL/SQL. –

Répondre

0

Comme vous l'avez construit (bizarrement), la procédure insert_address ne peut être appelée que dans le contexte d'un objet de type address, et doit être appelée avec les paramètres line1 et city, avec des valeurs qui n'ont aucun lien avec objet vous l'avez appelé "pour". Voilà comment je construirais la table et le code et l'utiliser:

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

Avec votre modèle funkier, il semble que la procédure de insert_address doit insérer « l'objet adresse elle-même » dans la table. Quelque chose comme:

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

Ensuite, l'insert serait comme:

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

Comme il s'agit d'un autre exercice académique, on nous a dit que nous ne pouvions pas utiliser de paquets, donc je cherchais un autre moyen de le faire. – joec

+1

Je pense que le but de cet objet "relationnel-objet" est de fournir du matériel pour les exercices acmatiques! Cela n'aurait aucun sens de construire des tableaux de cette façon dans le «monde réel»! ;-) –

2

utilisation static au lieu de member pour votre procédure:

static procedure insert_address(line1 varchar2, city varchar2) 

Ensuite, vous pouvez appeler sur le type d'objet au lieu de l'instance:

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

Voir Using PL/SQL Object Types pour plus d'informations.

Questions connexes