我有一个名为 Employee 的类型,它有一个以 Employee 作为参数的 ORDER 方法。我创建了一个 Employee 表并插入了一些数据。我正在尝试使用 SELECT 测试此 ORDER 方法,但是我很难满足参数。这是我的代码
CREATE OR REPLACE TYPE Employee AS OBJECT(
EmpID VARCHAR(15),
eName VARCHAR(30),
ePhone NUMBER,
eAddress VARCHAR(15),
ePosition VARCHAR(15),
eHireDt DATE,
salary NUMBER,
ORDER MEMBER FUNCTION orderSalary (e Employee) RETURN NUMBER)
NOT FINAL;
/
CREATE OR REPLACE TYPE BODY Employee AS
ORDER MEMBER FUNCTION orderSalary(e Employee) return number IS
BEGIN
IF(self.salary > e.salary) then
return(1);
ELSIF (self.salary < e.salary) then
return(-1);
ELSE
return(0);
END IF;
END;
END;
/
CREATE TABLE Emp OF Employee (EmpID PRIMARY KEY)
OBJECT IDENTIFIER PRIMARY KEY;
insert into Emp values('001','kabir',6477732272,'Pharmacy','clerk','2016-03-28',2000);
这是给我带来麻烦的一行:
SELECT p.orderSalary(Employee s) FROM Emp p;
我需要做的就是测试这个方法以确保它有效,有什么方法可以创建一个 Employee 实例来用作参数,或者从 Emp 表中获取一行?谢谢!
最佳答案
SELECT p.orderSalary( VALUE( p ) ) FROM Emp p;
或者:
SELECT p.orderSalary( DEREF( REF( p ) ) ) FROM Emp p;
或者:
SET SERVEROUTPUT ON;
DECLARE
e1 EMPLOYEE := NEW EMPLOYEE('001','kabir',6477732272,'Pharmacy','clerk',DATE '2016-03-28',2000);
e2 EMPLOYEE := NEW EMPLOYEE('002','bob',1234567890,'Library','assistant',DATE '2016-03-07',1000);
BEGIN
DBMS_OUTPUT.PUT_LINE( e1.orderSalary( e2 ) );
END;
/
更新 - 选择不同的行:
insert into Emp values('001','kabir',6477732272,'Pharmacy','clerk','2016-03-28',2000);
insert into Emp values('002','bob',1234567890,'Library','assistant',DATE '2016-03-07',1000);
SELECT e1.ename AS name1,
e2.ename AS name2,
e1.orderSalary( VALUE( e2 ) )
FROM Emp e1
CROSS JOIN Emp e2;
输出:
NAME1 NAME2 E1.ORDERSALARY(VALUE(E2))
------ ------ -------------------------
kabir kabir 0
kabir bob 1
bob kabir -1
bob bob 0
关于SQL 使用 OBJECT 作为 ORDER 方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35855955/