我尝试过尝试将数值插入此表的百万种不同方法。
我有一个Line对象,这是代码:
CREATE OR REPLACE TYPE LINE AS OBJECT
(EP1 REF Point,
EP2 REF Point,
MEMBER FUNCTION getOrientation RETURN Char,
MEMBER FUNCTION getLen Return Number,
CONSTRUCTOR FUNCTION Line
(EP1 REF Point,
EP2 REF Point) RETURN SELF as RESULT);
create or replace type body line as
member function getLen return number
is
length Integer;
begin
if getOrientation = 'V'
then
Select Deref(EP1).getY() - Deref(EP2).getY()
into length
from Dual;
else
Select Deref(EP1).getX() - Deref(EP2).getX()
into length
from Dual;
end if;
return length;
end;
member function getOrientation return char
is
ep1x Integer;
ep2x Integer;
ep1y Integer;
ep2y Integer;
begin
select Deref(EP1).getX(), Deref(EP1).getY(),Deref(EP2).getX(),Deref(EP2).getY()
into ep1x, ep1y, ep2x, ep2y
from dual;
if ep1x = ep2x
then return 'V';
else return 'H';
end if;
end;
constructor function line
(EP1 REF Point,
EP2 REF Point) return self as result
is
begin
self.ep1 := ep1;
self.ep2 := ep2;
return;
end;
end;
/
我想你也需要Point对象,所以也是这样:
CREATE OR REPLACE TYPE POINT AS OBJECT
(label Char,
X Number,
Y Number,
MEMBER FUNCTION getX RETURN Number,
MEMBER FUNCTION getLABEL RETURN Char,
MEMBER FUNCTION getY RETURN Number,
CONSTRUCTOR FUNCTION POINT
(label Char,
X Number,
Y Number) RETURN SELF as RESULT);
CREATE TABLE POINTS OF POINT
(unique(label),
unique(X,Y))
create or replace type body point as
member function getX return Number
is
begin
return X;
end;
member function getY return Number
is
begin
return Y;
end;
member function getLABEL return Char
is
begin
return Label;
end;
constructor function point
(Label Char,
X Number,
Y Number) return self as result
is
begin
if X<=0 then
raise_application_error(-20001, 'Invalid X');
end if;
if Y<=0 then
raise_application_error(-20002, 'Invalid Y');
end if;
self.X := X;
self.Y := Y;
self.Label := Label;
return;
end;
end;
/
所以我所做的就是创建一个像这样的表:
Create table LINES of line;
在积分表中我有一些点(A,B,C,D和E),我想用两点创建一条线并将它们存储在这个表中。最后,我需要创建一个名为BOXES的表,并在其中插入一个矩形(只有4行,带有一堆约束)。我已创建该对象,但代码是很长的发布在这里的方式。我觉得如果我能理解如何将LINE放入表中我可以将其中的4个合并为一个,我只想从简单开始。
现在我可以在类型表中获得积分,这很简单,因为没有引用。然而,有了这个LINE,我只是无法弄清楚如何将它放到表中,因为它只是两个引用一个点的端点。我是否必须进行一些取消引用然后将其放入表中?如果是这样,我该怎么做?我是否错误地创建了LINES表?是否应该有不同之处,因为它确实有参考?我只是不确定,我似乎无法在网上找到任何例子。如果有人能提供一些意见我会非常感激。如果您需要任何其他信息,请告诉我,谢谢。
答案 0 :(得分:0)
insert into boxes
values(RECT(
line((select ref(A) --left ep1
from points A
where Label='B'),
(select ref(B) --left ep2
from points B
where Label='A')),
line((select ref(C) --bottom ep1
from points C
where Label='A'),
(select ref(D) --bottom ep2
from points D
where Label='C')),
line((select ref(E) --right ep1
from points E
where Label='D'),
(select ref(F) --right ep2
from points F
where Label='C')),
line((select ref(G) --top ep1
from points G
where Label='B'),
(select ref(H) --top ep2
from points H
where Label='D'))));
经过多次挣扎,这就是我想出来的,它似乎有效。应用约束,唯一的是它返回一个有点烦人的REF。