INSERT不起作用,在ORACLE中使用SQL PLUS,定义类型的简单表,完全创建但不插入值
您的问题是您已经定义了两个相同类型的构造函数,但是您没有意识到您可能已经定义了 创建对象类型时,Oracle会创建一个默认构造函数,其参数与该类型的参数匹配。因此,当您还定义了一个仅使用latitude和longitude作为输入的构造函数时,Oracle无法确定要调用哪个构造函数、默认创建的构造函数还是您的构造函数,因此它会出现以下错误:INSERT不起作用,在ORACLE中使用SQL PLUS,定义类型的简单表,完全创建但不插入值,oracle,oracle11g,sqlplus,Oracle,Oracle11g,Sqlplus,您的问题是您已经定义了两个相同类型的构造函数,但是您没有意识到您可能已经定义了 创建对象类型时,Oracle会创建一个默认构造函数,其参数与该类型的参数匹配。因此,当您还定义了一个仅使用latitude和longitude作为输入的构造函数时,Oracle无法确定要调用哪个构造函数、默认创建的构造函数还是您的构造函数,因此它会出现以下错误: DROP TYPE Position; CREATE OR REPLACE TYPE Position AS OBJECT (longitude NUM
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');
要解决此问题,您可以简化代码:
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');