Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将两种oracle sql对象类型与公共基超类进行比较_Sql_Oracle_Inheritance_Plsql_User Defined Types - Fatal编程技术网

如何将两种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 (

例如:

  • 图\u t基类(超级类)
  • 图\u t下的球体\u t
  • 图\u t下的金字塔
  • 两者都有音量
  • 如何使用map或order函数进行对象比较
  • 我所做的是在超类中使用map member函数来比较体积。我尝试过在子类中重写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;
    
    应该有一种比较的方法,因为数字有一个共同的超类

    应该有一种方法来进行这种比较,因为数字有一个超级数字 同级

    我不太确定你想在这里实现什么。另外,您在比较中使用的
    金字塔的定义是什么

    如果(球体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,我已经知道这个方法了。但使用这种方法,映射或顺序函数失去意义,因为它与使用普通函数相同。按照要求有一条路(我就是你说的这条路就是这条路)。如果我找到答案,我会把它贴出来。