源码-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