现在的位置: 首页 > 综合 > 正文

韩顺平玩转oracle之pl/sql听课笔记《三》

2013年08月02日 ⁄ 综合 ⁄ 共 2282字 ⁄ 字号 评论关闭

有些惭愧,距离第2次听课笔记远了。这一讲主要是关于函数,包,还有变量的解释。
 
  1 函数和过程的区别
    1)函数:返回特定值,通常是一个;
       过程:执行特定操作
    2)建立函数时:
 在函数头须包含return子句
 例如;
 return number is
 think_salary number(7,2)
 在函数体也须包含return语句
 return think_salary

  2 案例:输入雇员的姓名,返回该雇员的年薪
    create function sp_think(spName varchar2)
    return number is
    yearSal number(7,2);
    begin
    select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
    return yearSal;
    end;
    /
    在sqlplus中调用:
    var think number
    call sp_think('SCOTT') into:think
    print think

  3 包
    用于逻辑上组合过程和函数,由包头和包体组成,其中
    包头:对过程或函数的声明
    包体:实现包头中所声明的过程或函数
    案例:
    包头:
    create package sp_think
    is
    procedure update_sal(name varchar2,newsal number);
    function annual_income(name varchar2) return number;
    end;
    /
    包体:
    create package body sp_think is
    procedure update_sal(name varchar2,newsal number)
    is
    begin
      update emp set sal=newsal where ename=name;
    end;
    function annual_income(name varchar2)
    return number is
    annual_salary number;
    begin
       select sal*12+nvl(comm,0) into annual_salary from emp where ename=name;
    return annual_salary;
    end;
    end;
    /

  4 如何调用包的过程或函数
    调用自己创建的包时:
    call sp_think.update_sal('SCOTT',1500);
    调用其他方案的包时,如hr:
    call hr.sp_think.update_sal('SCOTT',1500);

  5 触发器
    触发器是自动执行的过程
    包含:
    1)触发的事件:如DML语句
    2)触发的操作:pl/sql块
    作用:维护数据库的安全和一致性

  6 变量
    1)v_ename varchar2(10) -- :=为赋值号,如v_sal number(6,2):=5.8
    2)用于存放多值的变量:
      2.1) pl/sql记录:同c语言的结构体相似
         案例:
         declare
         type think is record(name emp.ename%type,salary emp.sal%type)--name随ename的变而变
         re_think think
         begin
            select ename,sal into think from emp where empno7788;
           dbms_output.put_line('员工名:'||think.name);
        end;
      2.2)pl/sql表:同c语言的数组相似
              案例:
             declare
             type think is table of emp.ename%type index by binary_integer;
             -- 定义了一个pl/sql表类型,存放emp.ename%type,下标是正整数
             ta_think think;
              ....
    
   
    3) 游标变量:结果集的指针
        案例:定义一个pl/sql块,可以输入部门号,显示该部门所有员工的姓名和工资
        declare
        type think_cursor is ref cursor;
        water_cursor think_cursor;
        v_ename emp.ename%type;
        v_sal emp.sal%type;
       begin
         open water_cursor for select ename,sal from emp where deptno=&a;
         loop
            fetch water_cursor into v_ename,v_sal;
            exit when water_cursor%notfound;
            dbms_output.put_line('名字:'||v_ename||'工资:'||v_sal)
         end loop
      end;

抱歉!评论已关闭.