Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
如何重写顺序方法PL/SQL?_Sql_Oracle_Inheritance_Plsql_Oracle11g - Fatal编程技术网

如何重写顺序方法PL/SQL?

如何重写顺序方法PL/SQL?,sql,oracle,inheritance,plsql,oracle11g,Sql,Oracle,Inheritance,Plsql,Oracle11g,我必须定义一个对象类型Employee,它将具有一些属性,然后我必须定义一个对象类型Manager,它将继承Employee类型,并具有一个名为nrEmp的传统属性,该属性将包含每个管理者在其命令下拥有的员工数量。此外,我还必须为类型经理实现方法ORDER,以便我可以根据经理拥有的员工数量对其进行排序。首先,我定义了这种类型: CREATE OR REPLACE TYPE Departament AS OBJECT ( deptno NUMBER(2), dname CHAR(

我必须定义一个对象类型Employee,它将具有一些属性,然后我必须定义一个对象类型Manager,它将继承Employee类型,并具有一个名为nrEmp的传统属性,该属性将包含每个管理者在其命令下拥有的员工数量。此外,我还必须为类型经理实现方法ORDER,以便我可以根据经理拥有的员工数量对其进行排序。首先,我定义了这种类型:

CREATE OR REPLACE TYPE Departament AS OBJECT ( 
    deptno NUMBER(2),
    dname CHAR(14)
   );
接下来,我定义了Employee类型:

CREATE OR REPLACE TYPE Employee AS OBJECT ( 
    empno  NUMBER(4),
    ename CHAR(10),
    dept REF Departament,
    sal NUMBER(7,2)
   ) NOT FINAL;
到现在为止一切都很顺利。接下来,我尝试定义类型管理器:

CREATE OR REPLACE TYPE Manager UNDER Employee (
  nrEmp INTEGER,
  ORDER MEMBER FUNCTION compare(m Manager) RETURN INTEGER
  );
当我执行此操作时,会出现以下错误:

Error(1,1): PLS-00646: MAP or ORDER method must be defined in the root of the subtype hierarchy

据我所知,我必须在Employee类型中声明方法。但我不知道怎么做才是正确的方法。找不到任何示例显示如何在继承时实现ORDER方法。任何帮助都将不胜感激。谢谢。

我找到了一种方法。我不能说这是最好的解决方案或最优雅的解决方案,但它很好地满足了我的需要。这是代码。 员工类型:

CREATE OR REPLACE TYPE Employee AS OBJECT ( 
    empno  NUMBER(4),
    ename CHAR(10),
    dept REF Departament,
    sal NUMBER(7,2),
    ORDER MEMBER FUNCTION match (other IN Employee) RETURN INTEGER
   ) NOT FINAL;
CREATE OR REPLACE TYPE BODY Employee AS 
   ORDER MEMBER FUNCTION match(other IN Employee) Return INTEGER IS
    v_mng_self Manager;
    v_mng_other Manager;
   BEGIN 
      v_mng_self := TREAT(self AS Manager);
      v_mng_other := TREAT(other AS Manager);
      IF v_mng_self.nrEmp < v_mng_other.nrEmp THEN
         RETURN -1;  
      ELSIF v_mng_self.nrEmp > v_mng_other.nrEmp THEN 
         RETURN 1;   
      ELSE 
         RETURN 0;
      END IF;
   END;
END;
经理类型:

CREATE OR REPLACE TYPE Manager UNDER Employee (
  nrEmp INTEGER
  );
员工类型的主体:

CREATE OR REPLACE TYPE Employee AS OBJECT ( 
    empno  NUMBER(4),
    ename CHAR(10),
    dept REF Departament,
    sal NUMBER(7,2),
    ORDER MEMBER FUNCTION match (other IN Employee) RETURN INTEGER
   ) NOT FINAL;
CREATE OR REPLACE TYPE BODY Employee AS 
   ORDER MEMBER FUNCTION match(other IN Employee) Return INTEGER IS
    v_mng_self Manager;
    v_mng_other Manager;
   BEGIN 
      v_mng_self := TREAT(self AS Manager);
      v_mng_other := TREAT(other AS Manager);
      IF v_mng_self.nrEmp < v_mng_other.nrEmp THEN
         RETURN -1;  
      ELSIF v_mng_self.nrEmp > v_mng_other.nrEmp THEN 
         RETURN 1;   
      ELSE 
         RETURN 0;
      END IF;
   END;
END;

我只需要解决同样的问题,并提出以下解决方案:

创建或替换类型employee作为对象(
empno编号(4),
成员函数compare_internal(e employee)返回整数,
订单成员函数比较(e employee)返回整数
)不是最终的;
/
创建或替换员工的类型
成员函数compare_internal(e employee)返回整数为
开始
返回
案例
当self.empno=e.empno时,则为0
当self.empno>e.empno时,则为1
当self.empnom.nr\u emp时,则为1
当self.nr\u emp
这允许通过重写调用的函数来重写order/map函数

声明
x名员工;
y员工;
开始
x:=员工(empno=>1);
y:=员工(empno=>1);
dbms_output.put_line(x.compare(y));
--给出0,因为两者都有相同的empno
x:=经理(empno=>1,nr_emp=>2);
y:=经理(empno=>1,nr_emp=>3);
dbms_output.put_line(x.compare(y));
--给出-1,因为两者具有不同的nr_emp
x:=员工(empno=>1);
y:=经理(empno=>1,nr_emp=>3);
dbms_output.put_line(x.compare(y));
--给出0,因为两者都有相同的empno,这就是我们想要的吗?
x:=经理(empno=>1,nr_emp=>3);
y:=员工(empno=>1);
dbms_output.put_line(x.compare(y));
--如果为null,则y不是管理器
结束;
本手册可能有助于: