Oracle之PL/SQL的使用

如下图遇到这样的问题,一般就是使用java代码来解决,但是有了pl/sql完全可以使用它来写这样的逻辑代码,它比任何语言效率都快.

准备环境:jdk,oracle,sqldeveloper4.0版本的,用高版本的打印不出结果 或者使用

PL/SQL Developer 这个软件也可以写plsql   连接数据库的时候使用scott/tiger 这个账号密码连接,这是oracle安装的时候就带的

 

首先打印一个hello,world

set serveroutput on 是打开默认关闭的oracle的输出开关

plsql语法就是declare 后面写说明部分,比如声明一些变量之类的东西,begin后面写正常的逻辑代码,end;结束语句.

dbms_output相当于java中的类,但在这叫程序包,put_line就相当于java的方法,但在这叫存储过程,或者存储函数.

在plsql里面变量的定义,名字在前面,变量在后面.   

var1 char(15);  这个表示声明一个变量为var1  类型是char类型,长度15

married boolean := true;   声明一个变量名为married,boolean类型  := 表示赋值,相当于java的=.plsql中的=相当于java的==,代表比较的意思.

psal number(7,2); 定义变量psal 为number类型 7的长度,2位小数

my_name emp.ename%type; %type表示引用型变量,引用的emp表的ename字段的类型,这个字段是啥类型,声明的变量就是什么类型.

emp_rec emp%rowtype;    %rowtype表示把emp表的一行的类型作为emp_rec的类型,一行上面有多个列,可以把这种记录型变量理解为数组.如果要获得一列的值,直接变量名点列名就可以了.

如果声明常量的话在变量名和变量中间加 constant 即可 例如:var1 constant char(15); 

下面这个例子就是引用型变量,在plsql中赋值方式有两种,一种是:=一种就是into关键字,into 后面的变量顺序得跟sql语句前面查出来的顺序一样.||是字符串拼接符.

记录型变量,操作跟上面的引用型变量同样的例子

accept代表键盘录入,相当于java的scanner

光标就相当于java的Resultset也就是集合,但是这儿的光标指针初始化是在第一个元素上的,但是java中的resultset是在第一个元素前的.

遍历集合的示例

-- 查询并打印员工的姓名和薪水
/*
光标的属性: %isopen如果打开就是true反之是false   %rowcount(影响的行数,就是取出了多少条,取了10条它的值就是10)
          %found(还有没有下一条记录)    %notfound

*/
declare 
   --定义光标(游标)
   cursor cemp is select ename,sal from emp;
   pename emp.ename%type;
   psal   emp.sal%type;
begin
  --打开光标
  open cemp;
  loop
       --取当前记录
       fetch cemp into pename,psal;
       --exit when 没有取到记录;
       exit when cemp%notfound;   
       dbms_output.put_line(pename||'的薪水是'||psal);
  end loop;
  --关闭光标
  close cemp;
end;

-- 给员工涨工资,总裁1000 经理800 其他400的示例 

-- 给员工涨工资,总裁1000 经理800 其他400
declare 
  --定义光标
  cursor cemp is select empno,job from emp;
  pempno emp.empno%type;
  pjob   emp.job%type;
begin
  --打开光标
  open cemp;  
  loop
       --取一个员工
       fetch cemp into pempno,pjob;
       exit when cemp%notfound;
       --判断职位
       if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
          elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;
          else update emp set sal=sal+400 where empno=pempno;
       end if;
  end loop;
  --关闭光标
  close cemp;
  --提交  ----> why?: 事务 ACID
  commit;
  dbms_output.put_line('完成');
end;

光标带参数的写法,定义的时候形参开启的时候传入实参 

plsql的例外,就相当于java的异常处理,每个then后面相当于个大括号,可以写逻辑代码,在plsql当中最好写上other then,把剩余的可能都写全,不然的话这个异常可能抛到oracle数据库中,可能造成一些问题,在java当中如果你不处理全,还有虚拟机帮你处理,在这里却没有

自定义的例外使用变量的形式定义一个自定义例外,exception,使用的方式跟java中throw往外抛的形式差不多,这儿使用raise关键字进行抛例外.

declare 
  cursor cemp  is select ename from emp where deptno=50;
  pename emp.ename%type;
  --自定义例外
  no_emp_found exception;
begin
  open cemp;
  
  --取第一条记录
  fetch cemp into pename;
  if cemp%notfound then
    --抛出例外  
    raise no_emp_found;
  end if;
  --进程:pmon进程(proccesss monitor)
  close cemp;
exception
  when no_emp_found then dbms_output.put_line('没有找到员工');
  when others then dbms_output.put_line('其他例外');
end;

在plsql中没有finally,但是抛出例外,光标关闭不了怎么办呢?抛出例外的时候oracle会启动pmon进程来释放资源

存储过程和存储函数的使用http://www.javashuo.com/article/p-yazonxjp-pw.html