Как вставить значения в таблицу типов со ссылками - PullRequest
0 голосов
/ 03 мая 2018

Я пробовал то, что похоже на миллион разных способов, чтобы попытаться получить значения для вставки в эту таблицу.

У меня есть объект 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 из них в один, я просто хочу начать с простого.

Теперь я могу получать очки в таблице типов просто отлично, это довольно просто, потому что нет ссылок. Тем не менее, с помощью этой линии я просто не могу понять, как поместить ее в таблицу, поскольку это всего лишь две конечные точки, ссылающиеся на точку. Я должен сделать некоторую разыменование тогда положить это в таблицу? Если так, то как бы я это сделал? Я неправильно создал таблицу LINES? Должно ли оно быть другим, поскольку оно имеет ссылки? Я просто не уверен, и я не могу найти какие-либо примеры в Интернете. Если бы кто-то мог предоставить какой-то вклад, я был бы очень признателен. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, спасибо.

1 Ответ

0 голосов
/ 03 мая 2018
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, что немного раздражает.

...