如何重写顺序方法PL/SQL?
我必须定义一个对象类型Employee,它将具有一些属性,然后我必须定义一个对象类型Manager,它将继承Employee类型,并具有一个名为nrEmp的传统属性,该属性将包含每个管理者在其命令下拥有的员工数量。此外,我还必须为类型经理实现方法ORDER,以便我可以根据经理拥有的员工数量对其进行排序。首先,我定义了这种类型:如何重写顺序方法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(
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不是管理器
结束;
本手册可能有助于: