2013-02-19 63 views
0

我創建了一個自己的類型,其構造超載:在插入SQL甲骨文自己的類型重載的構造函數

CREATE TYPE foo_type AS OBJECT(
     foo_type INTEGER, 
     foo_number NUMBER(28, 28), 
     foo_varchar2 VARCHAR2(4000 CHAR), 

     CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT, 
     CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT 
) 

CREATE TYPE BODY foo_type AS 
    CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT 
    IS 
    BEGIN 
     foo_type := 1; 
     foo_number := data; 
     return; 
    END; 

    CONSTRUCTOR FUNCTION foo (data VARCHAR2) RETURN SELF AS RESULT 
    IS 
    BEGIN 
     foo_type := 2; 
     foo_varchar2 := data; 
     return; 
    END; 
END; 

雖然我沒有,只要它是作品超載:

insert into test_table (field) values (foo_type(1, 2.2, 'bar')) 

但是,當我寫的不是工作不是在所有的構造函數:

insert into test_table (field) values (foo_type(2.2)) 

insert into test_table (field) values (foo_type('bar')) 

此時Oracle說: 「ORA-06553:聲明太多 'foo_type' 符合這個叫」 ,因此:

insert into test_table (field) values (foo_type(foo_varchar2 => 'bar')) 

說: 「ORA-009007:缺少右括號」。

我應該改變它是什麼作品?

謝謝。

回答

2

如果我糾正語法錯誤,這樣的聲明和對象的身體編譯

  • 你不能有相同的名字對象類型
  • 在你的對象第二個構造一個成員變量身體需要命名爲foo_type而不是foo - 構造函數總是取對象的名稱。

留給我的東西,如

CREATE TYPE foo_type AS OBJECT(
     foo_int INTEGER, 
     foo_number NUMBER(28, 28), 
     foo_varchar2 VARCHAR2(4000 CHAR), 
     CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT, 
     CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT 
); 
/

CREATE OR REPLACE TYPE BODY foo_type AS 
    CONSTRUCTOR FUNCTION foo_type (data NUMBER) RETURN SELF AS RESULT 
    IS 
    BEGIN 
     foo_int := 1; 
     foo_number := data; 
     return; 
    END; 
    CONSTRUCTOR FUNCTION foo_type (data VARCHAR2) RETURN SELF AS RESULT 
    IS 
    BEGIN 
     foo_int := 2; 
     foo_varchar2 := data; 
     return; 
    END; 
END; 

,如果我改變一個數字,有效期爲NUMBER(28,28)列(其中2.2是不是)來傳遞,超載工作得很好

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2  l_foo foo_type; 
    3 begin 
    4  l_foo := foo_type(0.2); 
    5  dbms_output.put_line(l_foo.foo_int); 
    6  l_foo := foo_type('bar'); 
    7  dbms_output.put_line(l_foo.foo_int); 
    8* end; 
SQL>/
1 
2 

PL/SQL procedure successfully completed. 

或插入到表

SQL> create table test_table(foo_column foo_type); 

Table created. 

SQL> insert into test_table values(foo_type(0.2)); 

1 row created. 

SQL> insert into test_table values(foo_type('bar')); 

1 row created. 

這似乎不太可能,我認爲你會真的想foo_number成爲NUMBER(28, 28)尤其是當你嘗試在你的例子分配2.2的值。如果您的實際對象類型是這樣聲明的,那麼您的默認構造函數將失敗。

+0

好的,語法錯誤不在實際代碼中,但這並不重要。 但我的問題是: 不能我通過這一個INSERT INTO說法? – user1949713 2013-02-19 16:58:43

+0

@ user1949713 - 當然,一旦語法錯誤是固定的。沒有從在PL/SQL塊構成的物體,並在'INSERT'聲明這樣做太大的差別。我更新了我的答案以包含正在運行的INSERT語句。 – 2013-02-19 17:04:49

+0

對不起,我不留神..我沒有任何問題。謝謝。 – user1949713 2013-02-19 17:06:52