2018-07-13 14:54:46
1 --1.创建一个包,包含一个为雇员加薪的过程,一个为雇员减薪的过程 2 CREATE OR REPLACE PACKAGE pac_test1 3 IS 4 PROCEDURE addsal(NO emp.empno%TYPE,addsal emp.sal%TYPE); 5 procedure minussal(no emp.empno%type,minussal emp.sal%type); 6 END; 7 8 9 CREATE OR REPLACE PACKAGE body pac_test1 10 IS 11 PROCEDURE addsal(NO emp.empno%TYPE,addsal emp.sal%TYPE) 12 is 13 BEGIN 14 UPDATE emp SET sal=sal+addsal WHERE empno=NO; 15 end; 16 PROCEDURE minussal(NO emp.empno%TYPE,minussal emp.sal%TYPE) 17 IS 18 BEGIN 19 UPDATE emp SET sal=sal-minussal WHERE empno=NO; 20 end; 21 END; 22 23 24 --2.编写一个过程,验证用户登陆。如果用户名、密码匹配,输出Y,否则输出N emp表中的ename为用户名 empno为密码 25 CREATE OR REPLACE PROCEDURE pro_test2(username VARCHAR2,PASSWORD NUMBER,flag out VARCHAR2) 26 IS 27 v_count number(2); 28 BEGIN 29 SELECT count(empno) INTO v_count FROM emp WHERE ename=username AND empno=PASSWORD; 30 IF v_count>0 THEN flag:='Y'; 31 ELSE flag:='N'; 32 END IF; 33 END; 34 35 36 --3.编写一个函数,根据雇员编号,计算调整后的工资 37 如果该雇员从事经理工作,且工资大于3000,则工资上涨20%,否则上涨35% 38 其他情况均上涨10%,输出雇员编号、姓名、上涨后的工资 39 40 41 CREATE OR REPLACE FUNCTION fun_test3(NO emp.empno%TYPE) RETURN VARCHAR2 42 IS 43 v_ename emp.ename%TYPE; 44 v_sal emp.sal%TYPE; 45 v_newsal emp.sal%TYPE; 46 v_job emp.job%type; 47 v_info varchar2(100); 48 BEGIN 49 SELECT ename,sal,JOB INTO v_ename,v_sal,v_job FROM emp WHERE empno=NO; 50 IF upper(v_job)='MANAGER' THEN 51 IF v_sal>3000 THEN 52 v_newsal:=v_sal*1.2; 53 ELSE v_newsal:=v_sal*1.35; 54 END IF; 55 ELSE v_newsal:=v_sal*1.1; 56 END IF; 57 v_info:= NO || ',' || v_ename || ',' || v_newsal; 58 RETURN v_info; 59 end; 60 61 62 --4.创建一个包 63 包中含有一个存储过程,实现涨工资的功能,输入雇员姓名,如果其工作年限超过20年,工资增加2000 64 工作年限在10-20年,工资增加1000,工作年限在5-10年,工资增加500,输出雇员姓名和增涨后的工资 65 包中还含有一个函数,实现输入工资,判断工资如果大于4500,返回1,否则返回0 66 67 68 CREATE OR REPLACE PACKAGE pac_test4 69 IS 70 PROCEDURE pro_addsal(NAME emp.ename%TYPE,info out VARCHAR2); 71 FUNCTION fun_sal(salary emp.sal%TYPE) RETURN NUMBER; 72 end; 73 74 75 CREATE OR REPLACE PACKAGE body pac_test4 76 IS 77 PROCEDURE pro_addsal(NAME emp.ename%TYPE,info out VARCHAR2) 78 IS 79 v_year NUMBER(5); 80 v_sal emp.sal%TYPE; 81 BEGIN 82 SELECT trunc(months_between(SYSDATE,hiredate)/12),sal INTO v_year,v_sal FROM emp WHERE upper(ename)=upper(NAME); 83 IF v_year>20 THEN v_sal:=v_sal+2000; 84 elsif v_year>=10 THEN v_sal:=v_sal+1000; 85 elsif v_year>=5 THEN v_sal:=v_sal+500; 86 END IF; 87 info:=NAME || ','||v_sal; 88 end; 89 FUNCTION fun_sal(salary emp.sal%TYPE) RETURN NUMBER 90 IS 91 v_flag NUMBER(1); 92 BEGIN 93 IF salary>4500 THEN 94 v_flag:=1; 95 ELSE v_flag:=0; 96 END IF; 97 RETURN v_flag; 98 end; 99 end;