INSERT не работает, используется SQL PLUS в ORACLE, простая таблица с определенным типом, идеально созданная, но без вставки значений - PullRequest
0 голосов
/ 16 декабря 2011
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');

1 Ответ

3 голосов
/ 16 декабря 2011

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

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

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...