1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

时间:2023-07-17 18:19:17

相关推荐

源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 1

随书附带的源码没有序号,部分有bug,调试过程中一并更正。

--代码2.1 使用书序结构计算员工薪资DECLAREv_sal1 NUMBER;v_sal2 NUMBER;v_sumsal NUMBER;BEGINSELECT salINTO v_sal1FROM empWHERE empno = &empno1;SELECT salINTO v_sal2FROM empWHERE empno = &empno2;v_sumsal := v_sal1 + v_sal2;dbms_output.put_line('ID:' || &empno1 || ',' || &empno2 || ',工资之和:' ||v_sumsal);END;select * from emp order by sal desc;--代码2.2 使用分支结构为员工加薪DECLARE--定义加薪比率常量c_Manager CONSTANT NUMBER:=0.15;c_SalesMan CONSTANT NUMBER:=0.12;c_Clerk CONSTANT NUMBER:=0.10;c_SR_CONT CONSTANT NUMBER:=0.88;--定义工种变量v_Job VARCHAR(100);BEGIN--查询指定员工编码的员工信息SELECT job INTO v_Job FROM scott.emp WHERE empno=&empNo1;--执行分支判断IF v_Job='CLERK' THENUPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE empno=&empNo1;ELSIF v_Job='SALESMAN' THENUPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE empno=&empNo1; ELSIF v_Job='MANAGER' THENUPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE empno=&empNo1;ELSIF v_Job='SR.CONT' THENUPDATE scott.emp SET SAL=SAL*(1+c_SR_CONT) WHERE empno=&empNo1;END IF;--显示完成信息DBMS_OUTPUT.PUT_LINE('已经为员工'||&empNo1||'成功加薪!'); EXCEPTION--处理PL/SQL预定义异常WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('没有找到员工数据');END;--代码2.3 使用循环结构为所有员工加薪(未使用自定义函数)DECLARE--定义加薪比率常量c_Manager CONSTANT NUMBER:=0.15;c_SalesMan CONSTANT NUMBER:=0.12;c_Clerk CONSTANT NUMBER:=0.10;c_Cont CONSTANT NUMBER:=1.00;v_Job VARCHAR(100);--定义职位变量v_EmpNo VARCHAR(20); --定义员工编号变量v_Ename VARCHAR(60); --定义员工名称变量CURSOR c_Emp IS SELECT job,empno,ename from Scott.emp FOR UPDATE;BEGINOPEN c_Emp; --打开游标LOOP--循环游标FETCH c_Emp INTO v_Job,v_EmpNo,v_Ename; --提取游标数据EXIT WHEN c_Emp%NOTFOUND; --如果无数据可提取退出游标IF v_Job='CLERK' THEN --如果为职员,加薪10%UPDATE scott.emp SET SAL=SAL*(1+c_Clerk) WHERE CURRENT OF c_Emp;ELSIF v_Job='SALESMAN' THEN --如果为销售职员,加薪12%UPDATE scott.emp SET SAL=SAL*(1+c_SalesMan) WHERE CURRENT OF c_Emp; ELSIF v_Job='MANAGER' THEN --如果为经理,加薪15%UPDATE scott.emp SET SAL=SAL*(1+c_Manager) WHERE CURRENT OF c_Emp; ELSIF v_Job='SR.CONT' THEN --如果为高级顾问,工资翻倍!UPDATE scott.emp SET SAL=SAL*(1+c_Cont) WHERE CURRENT OF c_Emp;END IF;--显示完成信息DBMS_OUTPUT.PUT_LINE('已经为员工'||v_EmpNo||':'||v_Ename||'成功加薪!'); END LOOP;CLOSE c_Emp;--关闭游标 EXCEPTIONWHEN NO_DATA_FOUND THEN--处理PL/SQL预定义异常DBMS_OUTPUT.PUT_LINE('没有找到员工数据');END; --执行动态SQL语句drop table books;DECLAREv_SQLStr VARCHAR(200):=' CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2(100) NULL) ';BEGINEXECUTE IMMEDIATE v_SQLStr; --执行DDL语句END;--尝试执行静态SQL语句(将发生编译错误)BEGINCREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2(100) NULL;END;--代码2.4 创建员工对象CREATE OR REPLACE TYPE Emp_obj AS OBJECT(empno NUMBER(4),--员工编号属性ename VARCHAR2(10), --员工名称属性job VARCHAR(9),--员工职别属性sal NUMBER(7,2),--员工薪水属性deptno NUMBER(2), --部门编号属性--加薪方法MEMBER PROCEDURE AddSalary(radio NUMBER));--定义对象类型体,实现对象方法CREATE OR REPLACE TYPE BODY Emp_obj AS--实现对象方法MEMBER PROCEDURE AddSalary(radio NUMBER)ISBEGINsal:=sal*(1+radio); --加上特定比例的薪水END; END ;--代码2.5 创建函数封装业务逻辑CREATE OR REPLACE FUNCTION GetAddSalaryRatio(p_Job VARCHAR2)RETURN NUMBER ASv_Result NUMBER(7,2);BEGINIF p_Job='CLERK' THEN --如果为职员,加薪10%v_Result:=0.10;ELSIF p_Job='SALESMAN' THEN --如果为销售职员,加薪12%v_Result:=0.12; ELSIF p_Job='MANAGER' THEN --如果为经理,加薪15%v_Result:=0.15;ELSIF p_Job='cont' THEN --如果为顾问,工资翻倍!v_Result:=1;END IF;RETURN v_Result; END;--代码2.6 调用函数简化程序逻辑DECLAREv_Job VARCHAR(100);--定义职位变量v_EmpNo VARCHAR(20); --定义员工编号变量v_Ename VARCHAR(60); --定义员工名称变量v_Ratio NUMBER(7,2);CURSOR c_Emp IS SELECT job,empno,ename from Scott.emp3 FOR UPDATE;BEGINOPEN c_Emp; --打开游标LOOP--循环游标FETCH c_Emp INTO v_Job,v_EmpNo,v_Ename; --提取游标数据EXIT WHEN c_Emp%NOTFOUND; --如果无数据可提取退出游标v_Ratio:=GetAddSalaryRatio(v_Job); --调用函数,得到加薪率UPDATE scott.emp3 SET sal2=sal2*(1+v_Ratio) WHERE CURRENT OF c_Emp; --显示完成信息DBMS_OUTPUT.PUT_LINE('已经为员工'||v_EmpNo||':'||v_Ename||'成功加薪!'); END LOOP;CLOSE c_Emp; --关闭游标 commit;EXCEPTIONWHEN OTHERS THEN --处理PL/SQL预定义异常DBMS_OUTPUT.PUT_LINE('没有找到员工数据');END; --代码2.7 最简单的PL/SQL块BEGINDBMS_OUTPUT.PUT_LINE('Oracle和Mysql差别挺大,PL/SQL是对SQL的增强。');END;--代码2.8 完整的PL/SQL语句块DECLAREv_deptcount NUMBER(2);v_deptno NUMBER(2) := 60;BEGINSELECT COUNT(1)INTO v_deptcountFROM deptWHERE deptno = v_deptno;IF v_deptcount = 0THENINSERT INTO deptVALUES(v_deptno, '财务部', '深圳');dbms_output.put_line('成功插入部门资料');ELSIF v_deptcount = 1THENdbms_output.put_line('该部门已存在!');END IF;EXCEPTIONWHEN OTHERS THENdbms_output.put_line('部门资料插入失败!');END;commit;select * from dept;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。