-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathtest5.sql
More file actions
72 lines (66 loc) · 1.9 KB
/
test5.sql
File metadata and controls
72 lines (66 loc) · 1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
create or replace PACKAGE MyPack IS
/*
本实验以实验4为基础。
包MyPack中有:
一个函数:Get_SaleAmount(V_DEPARTMENT_ID NUMBER),
一个过程:Get_Employees(V_EMPLOYEE_ID NUMBER)
*/
FUNCTION Get_SaleAmount(V_DEPARTMENT_ID NUMBER) RETURN NUMBER;
PROCEDURE Get_Employees(V_EMPLOYEE_ID NUMBER);
END MyPack;
/
create or replace PACKAGE BODY MyPack IS
FUNCTION Get_SaleAmount(V_DEPARTMENT_ID NUMBER) RETURN NUMBER
AS
N NUMBER(20,2); --注意,订单ORDERS.TRADE_RECEIVABLE的类型是NUMBER(8,2),汇总之后,数据要大得多。
BEGIN
SELECT SUM(O.TRADE_RECEIVABLE) into N FROM ORDERS O,EMPLOYEES E
WHERE O.EMPLOYEE_ID=E.EMPLOYEE_ID AND E.DEPARTMENT_ID =V_DEPARTMENT_ID;
RETURN N;
END;
PROCEDURE GET_EMPLOYEES(V_EMPLOYEE_ID NUMBER)
AS
LEFTSPACE VARCHAR(2000);
begin
--通过LEVEL判断递归的级别
LEFTSPACE:=' ';
--使用游标
for v in
(SELECT LEVEL,EMPLOYEE_ID,NAME,MANAGER_ID FROM employees
START WITH EMPLOYEE_ID = V_EMPLOYEE_ID
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID)
LOOP
DBMS_OUTPUT.PUT_LINE(LPAD(LEFTSPACE,(V.LEVEL-1)*4,' ')||
V.EMPLOYEE_ID||' '||v.NAME);
END LOOP;
END;
END MyPack;
/
/*
测试:
函数Get_SaleAmount()测试方法:
select count(*) from orders;
select MyPack.Get_SaleAmount(11) AS 部门11应收金额,MyPack.Get_SaleAmount(12) AS 部门12应收金额 from dual;
过程Get_Employees()测试代码:
set serveroutput on
DECLARE
V_EMPLOYEE_ID NUMBER;
BEGIN
V_EMPLOYEE_ID := 1;
MYPACK.Get_Employees ( V_EMPLOYEE_ID => V_EMPLOYEE_ID) ;
V_EMPLOYEE_ID := 11;
MYPACK.Get_Employees ( V_EMPLOYEE_ID => V_EMPLOYEE_ID) ;
END;
/
输出:
1 李董事长
11 张总
111 吴经理
112 白经理
12 王总
121 赵经理
122 刘经理
11 张总
111 吴经理
112 白经理
*/