首页 > 解决方案 > 如何将值插入到带有引用的类型表中

问题描述

我已经尝试了看似一百万种不同的方法来尝试将值插入到该表中。

我有一个 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 表?因为它确实有参考,所以它应该有所不同吗?我只是不确定,我似乎无法在网上找到任何示例。如果有人可以提供一些意见,我将不胜感激。如果您需要任何其他信息,请告诉我,谢谢。

标签: sqldatabaseoraclereferencesql-types

解决方案


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。


推荐阅读