PL/SQL语言——循环,异常,游标

1. PL/SQL语言的介绍

PLSQL语言是Oracle公司对SQL语言的功能的扩展,它是将过程性结构与OracleSQL无缝的集成在一起而产生的一种结构化的强有力的语言,是一种高级数据库程序设计语言。

2. PL/SQL格式

[declare]  --声明变量
  变量名  变量的类型;--此处可以声明变量,常量,游标,异常
begin
  业务逻辑
  [exception]--异常
  异常处理语句
end;

3. 变量和常量

变量

    :=     在PL/SQL中是赋值的意思
    %type  引用类型变量
          v_sal   emp.sal%type;
           v_sal的类型,与emp表  中sal字段的类型一致
    %rowtype   记录型变量
          v_obj emp%rowtype;
           v_obj可以和emp表中某一行的所有类型一致(将emp表中的某一条数据,存储在v_obj中,可以使用 v_obj.字段名,来查询数据)

常量

    constant     常量   相当于  java final;

4. if分支

格式一

if 条件 then
  业务逻辑
end if;

格式二

if 条件 then
 业务逻辑
 else
   业务逻辑 
end if;

格式三

if 条件 then
  业务逻辑
  elsif 条件 then
    业务逻辑
    ...
    elsif 条件 then
    业务逻辑
    else
      业务逻辑
end if;

例:输入一个年龄数据,如果小于18,打印“未成年人”,18到60 成年人,60以上 老年人

    declare  
    v_age number(4):=&sjdj;  
    begin  
      if v_age<18 then  
      dbms_output.put_line('未成年人');  
    elsif v_age>=18 and v_age<=60  then  
        dbms_output.put_line('成年人');  
    else  
        dbms_output.put_line('老年人');  
    end if;   
    end;  

5. 循环

死循环

loop
    循环的内容
end loop;
--循环输出1-100个数
 declare 
 v_num   number(3):=1;
 begin
   loop
     if v_num>100 then
       exit;--退出循环
      end if;
      --exit when v_num>100;--上面3行可用这一行代替
     dbms_output.put_line(v_num);
     v_num:=v_num+1;
   end loop;
 end;

while循环

while  条件
    loop
        循环的内容
    end loop;
--循环输出1-100个数
declare 
 v_num   number(3):=1;
 begin
   while v_num <101
     loop
         dbms_output.put_line(v_num);
          v_num:=v_num+1;
   end loop;
 end;

for循环

for 变量  in 条件
    loop
        循环的内容
    end loop;
--循环输出1-100个数
 declare 
 v_num   number(3):=1;
 begin
   for v_num in 1..100
     loop
        dbms_output.put_line(v_num);
       end loop;
 end;

6. 游标

  1. 为什么使用游标?
    游标可以存储查询返回的多条数据,类似java中的集合
  2. 游标的定义格式
declare 
    cursor 游标名称 is  sql查询语句;
begin
    open 游标名称 ;
    loop
        fetch 游标名称  into 记录型变量 ;   --  使用关键字fetch将游标中的一条数据取出,使用into关键字将数据放入一个变量中
        exit when 游标名称%notfound;     --  当游标中没有数据的时候,退出循环
    end loop;
close 游标名称;
end

例子:打印指定部门的员工的信息
第一种:死循环

declare
    cursor  c1 is  select * from emp where deptno=10; ----给游标赋值
    v_obj emp%rowtype;
begin
    open c1; ----打开游标
        loop
            fetch c1 into v_obj;
            exit when c1%notfound; --判断游标为空后跳出,不跳出,一直指向最后一条数据
            dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
        end loop;
    close c1 ;----关闭游标
end;

第二种:for循环

declare
  cursor  c1 is  select * from emp where deptno=10; --给游标赋值
  v_obj emp%rowtype;
begin
 for v_obj in c1   ---帮助我们做 openclose 操作
   loop  
     dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
   end loop;
end;

带参数的游标

declare   -----参数的变量类型  不能写长度
    cursor  c1(dno number) is  select * from emp where deptno=dno; ----给游标赋值
    v_obj emp%rowtype;
begin
    open c1(20); ----打开游标  并赋值
        loop
            fetch c1 into v_obj;
            exit when c1%notfound;  --判断游标为空后跳出
            dbms_output.put_line(v_obj.empno || '==' || v_obj.ename);
        end loop;
    close c1 ;--关闭游标
end;

7. 异常

异常的定义格式

declare
  v_num number(3) :=7;
begin
  v_num :=v_num/0;
  exception   ---开始捕获异常
    when zero_divide then 
     dbms_output.put_line('这是个除零异常'); 
end;

常见异常

no_data_found           没有找到数据

too_many_rows           select...into语句匹配多行

zero_divide             除零异常

value_ereor             算术或者转换错误

timeout_on_resource     在等待资源时发生超时异常

例子
捕获除零异常

declare
  v_num number(3) :=7;
begin
  v_num :=v_num/0;
  exception   ---开始捕获异常
    when zero_divide then 
     dbms_output.put_line('这是个除零异常'); 
end;

捕获最大的异常(记不住zero_divide时,写others,都捕获所有异常)

declare
  v_num number(3) :=7;
begin
  v_num :=v_num/0;
  exception   ---开始捕获异常
    when others then   --others相当于java中的Exception,即others代表了所有异常
     dbms_output.put_line('这是个除零异常'); 
end;

异常的作用
增强代码的容错性和健壮性

8. 自定义异常

declare 
    v_age number(3) := 0;
    ex_age exception;--声明异常类型的变量
begin
    v_age :=&sb;
    if v_age >140 then
        raise ex_age;--抛出异常
    if v_age<18 then
        dbms_output.put_line('萝莉or正太');
    elsif v_age>=18 and v_age<60 then
        dbms_output.put_line('大叔or小姐姐');
    else
        dbms_output.put_line('广场舞主力');
    end if;

    exception--捕获异常
        when ex_age then
            dbms_output.put_line('未知生物');
end;

猜你喜欢

转载自blog.csdn.net/qq_35537301/article/details/80194750