设为首页 加入收藏

TOP

PL/SQL编程基础(二)
2015-07-24 11:30:14 来源: 作者: 【 】 浏览:6
Tags:PL/SQL 编程 基础
updatees_product set stockcount = stockcount - 1 where id = v_id; commit; dbms_output.put_line('id:' || v_id || '库存已更新'); elsif v_stock_count<0 then dbms_output.put_line('id:'||v_id||'库存数量小于零不正常的数据'); else dbms_output.put_line('id:'||v_id||'已经没有库存!'); endif; end;

CASE控制,语法: 或:

CASE值 CASE

WHEN 表达式1 THEN WHEN表达式1=值 THEN

代码1; 代码1;

WHEN 表达式2 THEN WHEN表达式2 =值 THEN

代码2; 代码2;

ELSE ELSE

代码3; 代码3;

ENDCASE; ENDCASE;

示例:根据订单的状态值输出对于的状态 1、已提交 2、已付款 3、已发货 4、已完成

declare

 v_id          es_order.id%type;

 v_status     es_order.status%type;

 v_status_name varchar(20);

begin

 select id,status into v_id, v_status from es_order where id = &id;

 case v_status

   when '1' then

     v_status_name := '订单已提交';

   when '2' then

     v_status_name := '已付款';

   when '3' then

     v_status_name := '货物已发出';

   when '4' then

     v_status_name := '已完成';

   else

     v_status_name := '未知状态';

  endcase;

 dbms_output.put_line('订单id:' || v_id ||'订单状态:' ||v_status_name);

end;

循环控制

loop循环语法:

LOOP

代码块;

EXIT[WHERE condition];

END LOOP

示例:初始化3个商品类别

declare

 v_id       number := 3;

 v_name     varchar2(40) := '类别';

 v_fatherid number := 0;

 v_count    number := 0;

begin

 loop

   v_count := v_count + 1;

   v_id    := v_id + 1;

   insert into es_sort values (v_id, v_name || v_count, v_fatherid);

   exit when v_count = 3;

  endloop;

 commit;

 dbms_output.put_line('插入成功');

end;

弊端:1、循环体可读性差,必须通过EXIT退出循环;2、EXIT容易忘记,或者退出循环的条件如果设置不正确可能造成死循环。

FOR循环语法:FOR循环变量 IN循环开始..循环结束 LOOP –需要循环执行的代码块 END LOOP;

declare

 v_id       number;

 v_name     varchar2(40) := '类别';

 v_fatherid number := 0;

begin

  forv_id in 4..6 LOOP

   insert into es_sort values (v_id, v_name || v_count, v_fatherid);

  endloop;

 commit;

 dbms_output.put_line('插入成功');

end;

WHILE循环,语法:WHILE循环条件 LOOP –需要循环执行的代码块 END LOOP;

declare

 v_id       number := 4;

 v_name     varchar2(40) := '类别';

 v_fatherid number := 0;

begin

 while v_id >= 4 and v_id <= 6 loop

    insert into es_sort values (v_id, v_name ||v_count, v_fatherid);

   v_id := v_id + 1;

  endloop;

 commit;

 dbms_output.put_line('插入成功');

end;

异常处理,异常处理的语法结构

EXCEPTION

WHENfirst_exception THEN --捕捉到的第一个异常

statements1; --对第一个异常的处理代码

WHENsecond_exception THEN --捕捉到的第二个异常

statements2; --对第二个异常的处理代码

WHENOTHERS THEN --除了前面捕获的异常外的其他异常

statements3; --对其他异常处理代码

END;

NO_DATA_FOUND

当没有使用返回数据的SELECT… INTO语句给给变量赋值时,抛出此异常

TOO_MANY_ROWS

在使用SELECT…INTO给变量赋值时,如果返回的数据量多于一行,就会抛出此异常

DUP_VAL_ON_INDEX

在插入数据是违反了唯一性索引而抛出的异常

INVALLID_NUMBER

将非数字字符串隐式转换为数值时引起的异常

CURSOR_ALREADY_OPEN

在已经打开的游标上执行OPEN语句时抛出异常

declare

 v_id       number := 4;

 v_name     varchar2(40) := '类别';

 v_fatherid number := 0;

begin

 while v_id >= 4 and v_id <= 6 loop

    insertinto es_sort values (v_id, v_name || v_id, v_fatherid);

   v_id := v_id + 1;

  endloop;

 commit;

 dbms_output.put_line('插入成功');

exception

 when others then

   dbms_output.put_line('插入失败!');

end;

自定义异常处理语法结构

DECLARE

exception1EXCEPTION; --exception1表示自定义异常变量的名称

BEGIN

RAISEexception1; --抛出自定义异常

EXCEPTION

WHENexception1 THEN

statements1;

WHENOTHERS THEN

statements2;

END;

示例:捕捉“删除订单”的异常

declare

 v_id es_sort.id%type := &id;

 e_no_result exception;

begin

 delete es_order where id = v_id;

  ifSQL%NOTFOUND THEN           --表示前面的delete语句没有删除任何数据

   RAISE e_no_result;--所谓的触发异常

  endif;

exception

 when e_no_result then

   dbms_output.put_line('删除数据不成功!');

 when others then

   dbms_output.put_line('发生其他错误!');

   rollback;

end;

在开发中一般使用常量保存定义好的异常,常量定义语法:变量名 CONSTANT变量的数据类型 :=初始值;

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sqlite学习笔记1:编译数据库 下一篇SQLserver语句练习

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)