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');
ответ
Ваша проблема в том, что вы определили два конструктора того же типа, но вы не понимали, что сделали вероятно.
При создании типа объекта 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');
: D спасибо много! это была большая помощь! –
Пожалуйста, отредактируйте ваше сообщение и добавьте реальный вопрос и объясните, что означает «не работает». Получают ли вы сообщение об ошибке? Если да, то что именно * это говорит? –
Вы совершили сделку? – Xophmeister