PL/SQL编程基础

PL/SQL程序块的模板

DECLARE

--变量、常量、游标、用户定义异常的声明

BEGIN

       --SQL语句和 PL/SQL语句构成的执行程序

       EXCEPTION

              --程序出现异常时,捕捉异常并处理异常

END;

注意:DECLARE,BEGIN,EXCEPTION后面没有分号而END以及所有SQL语句,和PL/SQL语句必须以分号结尾。

实现上述示例的PL/SQL代码块

DECLARE

 v_stock_count NUMBER;                 --声明部分

 v_idNUMBER:=&ID;                     

BEGIN

       SELECTstockcount INTO v_stock_count

       FROMes_product

       WHEREID = v_id;

       DBMS_OUTPUT.PUT_LINE(v_stock_count);

EXCEPTION

       WHEREOTHERS THEN

       DBMS_OUTPUT.PUT_LINE(‘该商品不存在’);

END;

变量定义语法:DECLARE variable_name type ;变量需要声明在DECLAREBEGIN之间,variable_name代表的是变量的名称。type表示变量的数据类型。注意:给变量赋值的时候用的是:=

变量命名规则:1、变量名首字母必须是英文字母,其后可以是字母、数字或者特殊字符$#号和下划线。2、变量名厂部不超过30个字符。3、变量名中不能有空格。4、变量名不能使用关键字命名。

PL/SQL除了使用:=给变量赋值以外,对于已经声明的变量还可以使用SELECT INTO的方法给变量赋值

select into语法:

select select_list into {variable_name[,variable_name,……]} from table_name [wherecondition];

select_list是检索出来的结果集字段。variable_name是表示想要赋值的变量名。

注意:1、查询只能返回一条记录,多条或0条都会产生异常。2INTO语句必须放在SELECTFROM子句之间。3INTO后需要赋值的变量的数据类型必须和SELECT子句中检索出的数据类型一致。4INTO后需要赋值的变量个数需要和SELECT查询出的字段数一致。       使用命令窗口使用set serveroutput on用于显示结果。

声明变量还可以以列名或变量名作为前缀来声明变量:变量名表名.列名%TYPE; 变量名其他变量名%TYPE;

示例:根据商品id查询商品名称、商品价格、上架时间、库存,并进行连接输出

declare

 v_name       es_product.name%TYPE;

 v_price      es_product.price%type;

 v_saledate   es_product.saledate%type;

 v_stock_count  es_product.stockcount%type;

 v_id          number := &id;

begin

 select name, price, saledate, stockcount

   into v_name, v_price, v_saledate, v_stock_count

   from es_product

  where id = v_id;

 dbms_output.put_line('商品名称:' || v_name || '商品价格:' || v_price || '上架时间:' ||

                       v_saledate || '库存:' || v_stock_count);

end;

以某张表的完整行来声明变量,语法:变量名表名%ROWTYPE;

declare

 v_es_pro      es_product%rowtype;                   
 v_id          number := &id;

begin

 select name, price, saledate, stockcount

   into v_es_pro.name,v_es_pro.price,v_es_pro.saledate,v_es_pro.stockcount
   from es_product

  where id = v_id;

 dbms_output.put_line('商品名称:' || v_es_pro.name || '商品价格:' || v_es_pro.price || '上架时间:' ||

                       v_es_pro.saledate || '库存:' || v_es_pro.stock_count);

end;

if控制,语法:IF条件 THEN –代码块 END IF;

这里的THEN以及后面的代码块代表如果条件满足以后要做什么。

示例:使用if then实现购买商品时更新库存量

declare

 v_id          es_product.id%type := &id;

 v_stock_count es_product.stockcount%type;

begin

 select stockcount into v_stock_count from es_product where id = v_id;

  ifv_stock_count > 0 then

   update es_product set stockcount = stockcount - 1 where id = v_id;

    commit;

   dbms_output.put_line('id:' || v_id || '库存已更新');

  endif;

end;

IF THEN ELSE 结构语法:IF 条件 THEN –代码块1;ELSE –代码块2; END IF;

declare

 v_id          es_product.id%type:= &id;

 v_stock_count es_product.stockcount%type;

begin

 select stockcount into v_stock_count from es_product where id = v_id;

  ifv_stock_count > 0 then

   update es_product set stockcount = stockcount - 1 where id = v_id;

   commit;

   dbms_output.put_line('id:' || v_id || '库存已更新');

 else

   dbms_output.put_line('id:'||v_id||'已经没有库存!');

  endif;

end;

IF THEN ELSIF语法:if条件1 then –代码块1; elsif条件2 then –代码块2; else –代码3 end if;

declare

 v_id          es_product.id%type:= &id;

 v_stock_count es_product.stockcount%type;

begin

 select stockcount into v_stock_count from es_product where id = v_id;

  ifv_stock_count > 0 then

    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退出循环;2EXIT容易忘记,或者退出循环的条件如果设置不正确可能造成死循环。

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

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值