如何将两种oracle sql对象类型与公共基超类进行比较
例如:如何将两种oracle sql对象类型与公共基超类进行比较,sql,oracle,inheritance,plsql,user-defined-types,Sql,Oracle,Inheritance,Plsql,User Defined Types,例如: 图\u t基类(超级类) 图\u t下的球体\u t 图\u t下的金字塔 两者都有音量 如何使用map或order函数进行对象比较 我所做的是在超类中使用map member函数来比较体积。我尝试过在子类中重写map函数,但仍然没有成功。如果我创建同一个对象两次,我可以进行比较,但如果我创建不同的对象,则不能进行比较 在下面的示例中,我只粘贴球体,因为球体和棱锥体几乎相同 这是我的超级班: CREATE OR REPLACE TYPE figure_t AS OBJECT (
CREATE OR REPLACE TYPE figure_t AS OBJECT (
v_volume NUMBER,
v_area NUMBER,
MAP MEMBER FUNCTION compare RETURN NUMBER, PRAGMA restrict_references ( compare, wnds, trust )
);
/
CREATE OR REPLACE TYPE BODY figure_t AS
MAP MEMBER FUNCTION compare RETURN NUMBER IS
BEGIN
RETURN v_volume;
END;
END;
/
ALTER TYPE figure_t NOT FINAL
CASCADE;
/
然后,这是我的子类型:
CREATE OR REPLACE TYPE sphere_t UNDER figure_t (
v_radio NUMBER,
CONSTRUCTOR FUNCTION sphere_t (
radio NUMBER
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_volume RETURN NUMBER,
MEMBER FUNCTION get_area RETURN NUMBER,
OVERRIDING MAP MEMBER FUNCTION compare RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY sphere_t AS
CONSTRUCTOR FUNCTION sphere_t (
radio NUMBER
) RETURN SELF AS RESULT IS
BEGIN
self.v_radio := radio;
self.v_volume := ( 4 / 3 ) * 3.141592654 * power(radio, 3);
self.v_area := 4 * 3.141592654 * power(radio, 2);
return;
END;
MEMBER FUNCTION get_volume RETURN NUMBER IS
BEGIN
RETURN v_volume;
END;
MEMBER FUNCTION get_area RETURN NUMBER IS
BEGIN
RETURN v_area;
END;
OVERRIDING
MAP MEMBER FUNCTION compare RETURN NUMBER IS
BEGIN
RETURN self.v_volume;
END;
END;
/
进行比较时,它看起来像:
DECLARE
sphere_v sphere_t;
pyramid_v pyramid_t;
BEGIN
pyramid_v := pyramid_t(120, 90, 30);
sphere_v := sphere_t(10);
IF ( sphere_v != pyramid_v ) THEN
dbms_output.put_line('NOT EQUAL');
END IF;
END;
应该有一种比较的方法,因为数字有一个共同的超类
应该有一种方法来进行这种比较,因为数字有一个超级数字
同级
我不太确定你想在这里实现什么。另外,您在比较中使用的金字塔的定义是什么
如果(球体v!=金字塔v),则
在我看来,上述情况很危险,因为情况总是如此
当你做sphere\u v:=sphere\u t(10)
表示您尝试将sphere\u t
的所有返回值返回到sphere\u v
。
因此,如果您可以分别比较球体
和金字塔
的体积和面积,这将是一件好事。请参见下面的演示如何获取这些值:
DECLARE
sphere_v sphere_t;
-- pyramid_v pyramid_t;
BEGIN
sphere_v := sphere_t(10);
dbms_output.put_line('Input Radio -->'||sphere_v.v_radio);
dbms_output.put_line('Volume of Sphere-->'||sphere_v.v_volume);
dbms_output.put_line('Area Of Sphere -->'||sphere_v.v_area);
--Similarly you can take the values of `volume` and `area`
--of pyramid and get it compared with that of Sphere.
-- pyramid_v := pyramid_t(120, 90, 30);
-- dbms_output.put_line('Input Radio Pyramid -->'||pyramid_v.v_radio);
-- dbms_output.put_line('Volume of Pyramid -->'||pyramid_v.v_volume);
-- dbms_output.put_line('Area Of Pyramid -->'||pyramid_v.v_area);
-- If sphere_v.v_volume = pyramid_v.v_volume then
-- dbms_output.put_line('Equal');
-- Else
-- dbms_output.put_line('Not Equal');
END;
假设:pyramid\u t
也具有相同的对象体定义,具有体积和面积计算
应该有一种方法来进行这种比较,因为数字有一个超级数字
同级
我不太确定你想在这里实现什么。另外,您在比较中使用的金字塔的定义是什么
如果(球体v!=金字塔v),则
在我看来,上述情况很危险,因为情况总是如此
当你做sphere\u v:=sphere\u t(10)
表示您尝试将sphere\u t
的所有返回值返回到sphere\u v
。
因此,如果您可以分别比较球体
和金字塔
的体积和面积,这将是一件好事。请参见下面的演示如何获取这些值:
DECLARE
sphere_v sphere_t;
-- pyramid_v pyramid_t;
BEGIN
sphere_v := sphere_t(10);
dbms_output.put_line('Input Radio -->'||sphere_v.v_radio);
dbms_output.put_line('Volume of Sphere-->'||sphere_v.v_volume);
dbms_output.put_line('Area Of Sphere -->'||sphere_v.v_area);
--Similarly you can take the values of `volume` and `area`
--of pyramid and get it compared with that of Sphere.
-- pyramid_v := pyramid_t(120, 90, 30);
-- dbms_output.put_line('Input Radio Pyramid -->'||pyramid_v.v_radio);
-- dbms_output.put_line('Volume of Pyramid -->'||pyramid_v.v_volume);
-- dbms_output.put_line('Area Of Pyramid -->'||pyramid_v.v_area);
-- If sphere_v.v_volume = pyramid_v.v_volume then
-- dbms_output.put_line('Equal');
-- Else
-- dbms_output.put_line('Not Equal');
END;
假设:pyramid\u t
也具有相同的对象体定义,具有体积和面积计算
应该有一种比较的方法,因为数字有一个共同的超类
有一种方法,只是不明显
当类型完全相同时,例如同一子类型的两个实例,我们可以隐式调用map函数。所以我们可以比较两个像这样的球体:
IF ( sphere_1 != sphere_2 ) THEN ...
但是,要比较两个不同的子类型,我们需要调用父映射函数,要实现这一点,我们必须显式引用它:
IF ( sphere_v.compare() != pyramid_v.compare() ) THEN ...
是的,这很笨重。但是Oracle是RDBMS而不是ORDBMS(无论他们在8.0版中声称什么)
应该有一种比较的方法,因为数字有一个共同的超类
有一种方法,只是不明显
当类型完全相同时,例如同一子类型的两个实例,我们可以隐式调用map函数。所以我们可以比较两个像这样的球体:
IF ( sphere_1 != sphere_2 ) THEN ...
但是,要比较两个不同的子类型,我们需要调用父映射函数,要实现这一点,我们必须显式引用它:
IF ( sphere_v.compare() != pyramid_v.compare() ) THEN ...
是的,这很笨重。但是Oracle是RDBMS而不是ORDBMS(无论他们在8.0版中声称什么)。这感觉可以归结为一条评论,因为它并没有真正回答这个问题。@APC不是你的答案,只是重复了我上面所说的。我已经演示了如何比较单个卷,而您只是使用compare
功能演示了相同的内容。然而,我对金字塔的定义是未知的,我没有把它作为答案,而是做了一个假设,我知道它确实很有意义:```如果(sphere_v!=pyramid_v)``那么``但是理论上你有映射成员函数,你可以在给定的条件下比较你想要的任何东西,在这种情况下,如果上下文是:如果两个数字有相同的体积,那么它们是相同的。我的问题与备选方案无关,因为有很多方法可以实现这一点,但不包括map或order oracle函数。谢谢你的回答。这感觉好像可以归结为一个评论,因为它并没有真正回答这个问题。@APC不是你的答案,只是重复了我上面展示的内容。我已经演示了如何比较单个卷,而您只是使用compare
功能演示了相同的内容。然而,我对金字塔的定义是未知的,我没有把它作为答案,而是做了一个假设,我知道它确实很有意义:```如果(sphere_v!=pyramid_v)``那么``但是理论上你有映射成员函数,你可以在给定的条件下比较你想要的任何东西,在这种情况下,如果上下文是:如果两个数字有相同的体积,那么它们是相同的。我的问题与备选方案无关,因为有很多方法可以实现这一点,但不包括map或order oracle函数。谢谢你的回答。谢谢@APC,我已经知道这条路了。但使用这种方法,映射或顺序函数失去意义,因为它与使用普通函数相同。按照要求有一条路(我就是你说的这条路就是这条路)。如果我找到答案,我会把它贴出来。谢谢@APC,我已经知道这个方法了。但使用这种方法,映射或顺序函数失去意义,因为它与使用普通函数相同。按照要求有一条路(我就是你说的这条路就是这条路)。如果我找到答案,我会把它贴出来。