2011-12-16 4 views
-4
DROP TYPE Position; 

CREATE OR REPLACE TYPE 
Position AS OBJECT 
(longitude NUMBER(11,7), 
lattitude NUMBER(11,7), 
CONSTRUCTOR FUNCTION Position(
    long NUMBER, 
    latt NUMBER 
    ) RETURN SELF AS RESULT 
)FINAL; 
/


CREATE OR REPLACE TYPE BODY Position AS 
CONSTRUCTOR FUNCTION Position(
    long NUMBER, 
    latt NUMBER 
    ) RETURN SELF AS RESULT IS 
    BEGIN 
     SELF.longitude := long; 
     SELF.lattitude := latt; 
    RETURN; 
    END; 

END; 
/

DESC Position; 


DROP TABLE District_Info; 

CREATE TABLE District_Info(
Dname VARCHAR2(20), 
DPos Position, 
Boundary_dist VARCHAR2(20), 
Launch_ghat CHAR(1) 
); 

DESC District_Info; 


INSERT INTO District_Info (Dname,DPos,Boundary_dist,Launch_ghat) 
VALUES ('d',Position(1.1, 1.1),'gr','y'); 
+3

Пожалуйста, отредактируйте ваше сообщение и добавьте реальный вопрос и объясните, что означает «не работает». Получают ли вы сообщение об ошибке? Если да, то что именно * это говорит? –

+1

Вы совершили сделку? – Xophmeister

ответ

3

Ваша проблема в том, что вы определили два конструктора того же типа, но вы не понимали, что сделали вероятно.

При создании типа объекта Oracle создает конструктор по умолчанию с параметрами, соответствующими параметрам типа. Поэтому, когда вы определили конструктор только с Lattitude и долготой в качестве входных данных, Oracle может не работать, какой конструктор вызвать, по умолчанию создается один, или ваш друг, так что ошибки с:

SQL Error: ORA-06553: PLS-307: too many declarations of 'POSITION' match this call 

Чтобы это исправить, вы можете упростить код:

drop type position; 

CREATE OR REPLACE TYPE Position AS OBJECT (longitude NUMBER(11,7), lattitude NUMBER(11,7)) 
/

DROP TABLE District_Info; 

CREATE TABLE District_Info(Dname VARCHAR2(20), DPos Position, Boundary_dist VARCHAR2(20), Launch_ghat CHAR(1)); 


INSERT INTO District_Info (Dname,DPos,Boundary_dist,Launch_ghat) VALUES ('d',Position(1.1),'gr','y'); 

Т.е. вам не требуется объявление конструктора или тело. Если вам нравится, у вас может быть РАЗЛИЧНЫЙ конструктор, например:

CREATE OR REPLACE TYPE Position AS OBJECT (longitude NUMBER(11,7), lattitude NUMBER(11,7), 
-- Define a constructor that has only 2 parameters. 
    CONSTRUCTOR FUNCTION position(i_longitude NUMBER) 
    RETURN SELF AS RESULT 
) 
/

CREATE OR REPLACE TYPE BODY Position AS 
    CONSTRUCTOR FUNCTION position(i_longitude NUMBER) 
    RETURN SELF AS RESULT IS 
    BEGIN 
    SELF.longitude := i_longitude; 
    SELF.lattitude := i_longitude; 
    RETURN; -- self; 
    END; 
END; 
/

show errors; 

DROP TABLE District_Info; 

CREATE TABLE District_Info(Dname VARCHAR2(20), DPos Position, Boundary_dist VARCHAR2(20), Launch_ghat CHAR(1)); 

DESC District_Info; 

INSERT INTO District_Info (Dname,DPos,Boundary_dist,Launch_ghat) VALUES ('d',Position(1.1),'gr','y'); 
+0

: D спасибо много! это была большая помощь! –