如何比较两个oracle sql对象类型与公共基类超类

问题描述 投票:1回答:2

例:

  1. Figure_t基类(超类)
  2. 在figure_t下的sphere_t
  3. fig_t下的pyramid_t
  4. 两者都有量。
  5. 如何使用map或order函数进行对象比较?

我正在做的是使用超类中的map成员函数来使用卷进行比较。我已尝试使用/不覆盖子类中的map函数,但仍然没有运气。如果我创建相同的对象两次但是如果我创建不同的对象,我可以比较。

在下面的示例中,我只粘贴球体,因为球体和金字塔几乎相同。

这是我的超级班:

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;

应该有一种方法进行比较,因为数字有一个共同的超类。

sql oracle inheritance plsql user-defined-types
2个回答
0
投票

应该有一种方法进行比较,因为数字有一个共同的超类

我不太确定你想在这里实现什么。还有什么是你在比较中使用的pyramid_t的定义。

IF(sphere_v!= pyramid_v)然后

上述情况看起来很冒险,因为情况总是如此。

当你做sphere_v := sphere_t(10);意味着你试图把sphere_t全部归还给sphere_v。因此,如果你能分别比较Spherepyramid的体积和面积,那就太好了。请参阅下面演示如何获取这些值:

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_t也具有相同的Object Body定义,具有体积和面积计算。


0
投票

应该有一种方法进行比较,因为数字有一个共同的超类。

有一种方法,它只是不明显。

当类型完全相同时,例如我们可以隐式调用map函数的两个相同子类的实例。所以我们可以像这样比较两个领域:

 IF ( sphere_1 != sphere_2 ) THEN ...

但是,为了比较两个不同的子类型,我们需要调用父映射函数,为了实现这一点,我们必须明确地引用它:

 IF ( sphere_v.compare() != pyramid_v.compare() ) THEN ...

是的,这很笨重。但Oracle是一个RDBMS而不是ORDBMS(无论他们在8.0天版本中声称什么)。

© www.soinside.com 2019 - 2024. All rights reserved.