2010-02-24 19 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。 – 2010-02-24 13:24:08

回答

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

有了您的funkier模型,似乎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 2010-02-24 14:12:30

+1

我認爲這個「對象 - 關係」東西的唯一目的是提供材料來進行ancedmic練習!在「現實世界」中以這種方式構建表是沒有意義的! ;-) – 2010-02-24 14:49:01

2

使用static,而不是member爲您的程序:

static procedure insert_address(line1 varchar2, city varchar2) 

然後就可以調用它的對象類型,而不是實例:

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

更多信息請參見Using PL/SQL Object Types