源码-Oracle数据库管理-第十三章-子程序和包-Part 3(子程序参数)
来源:互联网 发布:网络教育专业 编辑:程序博客网 时间:2024/06/05 09:18
这部分内容讲的比较细。
--13.2 子程序参数--13.2.1 形式参数与实际参数--代码13.6 形式参数示例CREATE OR REPLACE PROCEDURE adjust_salary(p_empno NUMBER, p_salary REAL) ASBEGIN --在函数体内部使用形式参数 UPDATE emp SET sal = p_salary WHERE empno = p_empno;END;begin adjust_salary(7369,3000);end;select * from emp where empno=7369;--13.2.2 In, out 和in out模式--1. In模式DECLARE v_empno NUMBER:=7369; --定义员工编号变量 v_ratio NUMBER:=1.12; --员工薪资调整比率BEGIN adjust_salary(v_empno,3000*v_ratio); --调用过程END;--2. Out模式--代码13.7 使用Out模式的参数CREATE OR REPLACE PROCEDURE Out_Raised_Salary( p_empno IN NUMBER, p_raisedSalary OUT NUMBER --定义一个员工加薪后的薪资的输出变量)AS v_sal NUMBER(10,2); --定义本地局部变量 v_job VARCHAR2(10);BEGIN p_raisedSalary:=0; --变量赋初值 SELECT sal,job INTO v_sal,v_job FROM emp WHERE empno=p_empno; --查询员工信息 IF v_job='顾问' THEN --仅对职员加薪 p_raisedSalary:=v_sal*1.12; --对OUT模式的参数进行赋值是合法的 UPDATE emp SET sal=p_raisedSalary WHERE empno=p_empno; ELSE p_raisedSalary:=v_sal; --否则赋原来的薪资值 END IF;EXCEPTION WHEN NO_DATA_FOUND THEN --异常处理语句块 DBMS_OUTPUT.put_line('没有找到该员工的记录');END Out_Raised_Salary; DECLARE v_raised_sal NUMBER; --定义一个保存输出结果的变量BEGIN v_raised_sal:=20; Out_Raised_Salary(7369,v_raised_sal); --调用过程 --显示传出变量的结果 DBMS_OUTPUT.put_line('员工7369调整后的薪资值为:'||v_raised_sal);END;--3. In Out模式--代码13.8 使用In out模式的参数CREATE OR REPLACE PROCEDURE calcRaisedSalary( p_job IN VARCHAR2, p_salary IN OUT NUMBER --定义输入输出参数)AS v_sal NUMBER(10,2); --保存调整后的薪资值BEGIN if p_job='职员' THEN --根据不同的job进行薪资的调整 v_sal:=p_salary*1.12; ELSIF p_job='销售人员' THEN v_sal:=p_salary*1.18; ELSIF p_job='经理' THEN v_sal:=p_salary*1.19; ELSE v_sal:=p_salary; END IF; p_salary:=v_sal; --将调整后的结果赋给输入输出参数END calcRaisedSalary;DECLARE v_sal NUMBER(10,2); --薪资变量 v_job VARCHAR2(10); --职位变量BEGIN SELECT sal,job INTO v_sal,v_job FROM emp WHERE empno=7369; --获取薪资和职位信息 calcRaisedSalary(v_job,v_sal); --计算调薪 DBMS_OUTPUT.put_line('计算后的调整薪水为:'||v_sal); --获取调薪后的结果END; --13.2.3 参数调用方式--代码13.9 参数调用方式示例--CREATE OR REPLACE PROCEDURE adjust_salary(p_empno NUMBER, p_salary REAL) DECLARE v_empno NUMBER:=7369; --定义员工编号变量 v_ratio NUMBER:=1.12; --员工薪资调整比率BEGIN adjust_salary(v_empno,3000*v_ratio); --位置标示法 adjust_salary(p_empno=>v_empno,p_salary=>3000*v_ratio); --名字标示法 adjust_salary(v_empno,p_salary=>3000*v_ratio); --混合标示法,位置标示法在前END;--13.2.4 形式参数的约束CREATE OR REPLACE PROCEDURE parameters_constraints (p_job IN OUT VARCHAR2, p_sal IN OUT NUMBER) AS --形式参数不能具有精度或长度约束BEGIN p_job:='员工的工作职位是:'||p_job; --重新为形式参数赋值 p_sal:=3000.56; --为数值类型赋值 DBMS_OUTPUT.put_line(p_job||' '||p_sal); --输出形式参数的值END parameters_constraints;--以下代码会报错DECLARE v_job VARCHAR2(20):='职员'; v_sal NUMBER(4):=3000;BEGIN parameters_constraints(v_job,v_sal);END; CREATE OR REPLACE PROCEDURE parameters_constraints (p_job IN OUT emp.job%TYPE, p_sal IN OUT emp.sal%TYPE) AS --使用来自数据库列类型来限制形式参数BEGIN p_job:='职位:'||p_job; p_sal:=p_sal+3000.5; DBMS_OUTPUT.put_line(p_job||' '||p_sal); --输出变量结果值END parameters_constraints;DECLARE v_sal NUMBER:=10000012345678901.56780123456789012; --NUMBER未指定精度,可以容纳下 v_job VARCHAR2(20):='工程师';BEGIN parameters_constraints(v_job,v_sal); --子程序内部具有隐式的NUMBER约束,因此出现错误(实际调试结果:不出错!)END;--13.2.5 使用nocopy编译提示--!!!修改了循环次数后,遭遇了电脑死机,请谨慎调试此段代码create or replace procedure NoCopyDemo(p_InParameter in number,p_InOutParameter in out nocopy varchar2,p_outParameter out nocopy varchar2)is begin null;end;DECLARE TYPE emptabtyp IS TABLE OF emp%ROWTYPE; --定义嵌套表类型 emp_tab emptabtyp := emptabtyp (NULL); --定义一个空白的嵌套表变量 t1 NUMBER (5); --定义保存时间的临时变量 t2 NUMBER (5); t3 NUMBER (5); PROCEDURE get_time (t OUT NUMBER) --获取当前时间 IS BEGIN SELECT TO_CHAR (SYSDATE, 'SSSSS') --获取从午夜到当前的秒数 INTO t FROM DUAL; END; PROCEDURE do_nothing1 (tab IN OUT emptabtyp) --定义一个空白的过程,具有IN OUT参数 IS BEGIN NULL; END; PROCEDURE do_nothing2 (tab IN OUT NOCOPY emptabtyp) --在参数中使用NOCOPY编译提示 IS BEGIN NULL; END;BEGIN SELECT * INTO emp_tab (1) FROM emp WHERE empno = 7369; --查询emp表中的员工,插入到emp_tab第1个记录 emp_tab.EXTEND (900000, 1); --拷贝第1个元素N次 get_time (t1); --获取当前时间 do_nothing1 (emp_tab); --执行不带NOCOPY的过程 get_time (t2); --获取当前时间 do_nothing2 (emp_tab); --执行带NOCOPY的过程 get_time (t3); --获取当前时间 DBMS_OUTPUT.put_line ('调用所花费的时间(秒)'); DBMS_OUTPUT.put_line ('--------------------'); DBMS_OUTPUT.put_line ('不带NOCOPY的调用:' || TO_CHAR (t2 - t1)); DBMS_OUTPUT.put_line ('带NOCOPY的调用:' || TO_CHAR (t3 - t2));END;--13.2.6 参数默认值--代码13.11 在子程序中使用默认值 CREATE OR REPLACE PROCEDURE raise_salary ( p_empno IN emp.empno%TYPE, --要加薪的员工工号 p_amount IN emp.sal%TYPE := 100, --调整数量 p_comm IN emp.sal%TYPE DEFAULT 50 --计整的提成数量 ) IS BEGIN UPDATE emp --更新emp表完成加薪过程 SET sal = sal + p_amount + p_comm WHERE empno = p_empno; END raise_salary; BEGIN raise_salary(7369); --使用默认的加薪数和提成数 raise_salary(7369,200); --指定加薪200元 raise_salary(7369,150,80); --指定了所有的参数值 END;
0 0
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 3(子程序参数)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 1(定义子程序)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 2(定义子程序)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 4(定义PL/SQL包)
- Oracle数据库编程:开发PL/SQL子程序和包
- 源码-PL/SQL从入门到精通-第十三章-子程序-Part 1
- 源码-PL/SQL从入门到精通-第十三章-子程序-Part 2
- ORACLE创建和使用子程序和包
- Oracle学习交流(4) -----开发子程序和包
- 包和子程序
- 7.子程序和开发包
- Ch7 开发子程序和包
- 子程序和程序包-3
- Oracle学习笔记(7) 开发PLSQL子程序和包
- Oracle学习笔记——子程序和包
- Oracle子程序
- Oracle子程序
- 源码-Oracle数据库管理-第十五章-触发器和游标-Part 3(理解触发器)
- js 动态创建forn 并提交数据
- 设计模式
- [Unity3D——用代码说明一切]Unity结合Kinect2体感开发:Kinect面部识别
- 浅谈 MVP in Android
- 第三天:JavaScript的内存是怎么释放的
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 3(子程序参数)
- JavaScript数据类型
- linux杂记7
- context initialization failed java.long.IllegalArgumentException问题解决
- swift设置导航不透明
- iOS - UILabel点击选中文字,部分高亮,YYLabel
- Sencha Architect 3破解
- android基础_第九天
- 一致性哈希算法(用于解决服务器均衡问题)