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变量的数据类型 :=初始值;