Oracle数据库程序设计学习笔记(2)

字体:Courier New 大小 10


4.PLSQL异常处理


Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。Oracle异常分为两类:系统异常、自定义异常(其中系统异常又分为:预定义异常和非预定义异常)


--异常处理

declare

  sNum number := 0;

begin

  sNum := 5 / sNum; 

  dbms_output.put_line(sNum);

exception

  when others then

    dbms_output.put_line('is Error!');

end

1.预定义异常

        --演示一个整除的异常

            DECLARE

                v_n1 NUMBER:=50;

                v_n2 NUMBER:=0;

                v_n3 NUMBER;

            BEGIN

                v_n3:=v_n1/v_n2;

                DBMS_OUTPUT.PUT_LINE('v_n3='||v_n3);

            EXCEPTION

                WHEN ZERO_DIVIDE  THEN

                    DBMS_OUTPUT.PUT_LINE('v_n2 don't is 0');       

            END;

            /

        --演示VALUE_ERROR

                declare

               v_ename varchar2(3);

               begin

               select ename into v_ename from emp where empno=&eno;

               dbms_output.put_line(v_ename);

              exception

                  when value_error then

                 dbms_output.put_line('variable datatype length is small');

              end;

          --演示TOO_MANY_ROWS

              declare

              v_ename emp.ename%type;

              begin

              select ename into v_ename from emp where deptno=&dno;

              exception

               when too_many_rows then

                   dbms_output.put_line('Too many rows are returned');

               end; 

2.非预定义异常

            a.定义一个异常名

            b.将异常名与异常编号相关联

            c.在异常处理部分捕捉并处理异常

 

declare    

     ex_custom_error exception;

     pragma exception_init(ex_custom_error, -1);

     --把一个编号和一个自定义异常关联,

     --相当于把-1编号的异常命名为ex_custom_error,这样就可以捕获这种异常

begin      

     insert into dept values(10, 'aaa', 'bbb');

     exception      

       when ex_custom_error then

       dbms_output.put_line('部门编号已经存在');

end;


3. 自定义异常

            a.定义异常(declare部分进行定义)

            b.显示触发异常(在执行BEGIN部分触发异常,使用RAISE语句)

            c.引用异常(EXCEPTION部分捕捉并处理异常)

declare

       ex_custom_invaild_age exception; --自定义的异常myerr

       age int;

begin

     age := &请输入年龄;

     if (age < 0) then

        raise ex_custom_invaild_age; --引发自定义异常

     else

        dbms_output.put_line('年龄是:' || age);    

     end if;

exception

      when ex_custom_invaild_age then

        dbms_output.put_line('非法的年龄');

end;

--引发应用程序异常

--raise_application_error(异常编号,说明);

declare       

       age int;

begin

     age := &请输入年龄;

     if (age < 0) then

        raise_application_error(-20500, '年龄不能为负数');

     else

        dbms_output.put_line('年龄是:' || age);

     end if;

end;

 

 


 

5.PLSQL事务处理


事务也称工作单元,是一个或多个SQL语句所组成的序列,这个SQL操作作为一个完整的工作单元,要么全部执行,要么全部不执行。通过事务的使用,能够使一系列相关操作关联起来,防止出现数据不一致现象。典型的例子就是储户的转账活动,就需要把两个动作定义在一个事务中,那么两个操作将同时成功或同时失败,从而保证了数据的一致性。

 

事务有以下语句组成:(1)一组相关的DML(数据操纵语言)语句,修改的数据在该组语句中保持一致。(2)一个DDL语句或DCL语句(数据定义语言)。

 

事务的特征:

(1)原子性

(2)一致性

(3)隔离性,防止同时的读和写操作。

(4)持久性

 

事务控制:

(1)事务提交:commit

(2)事务回滚:rollback to 保存点名称

(3)设立保存点:savepoint  保存点名称

 每个修改语句完成后都可以回滚或提交,即rollbackcommit

    eg:

    insert into dept values(50, 'soft', 'Guangzhou');

    rollback;

    这样就回滚了,等于上面的没有插入;如果commit就提交了,此后如果再rollback也无力回天了。

    下面这样也是无法回滚的:

    insert into dept values(50, 'soft', 'Guangzhou');

    create table temp as select * from dept;

    rollback;

    再次查询,发现无法回滚;同样增删改后面运行grant/create语句也是无法回滚的;

 


6.PLSQL锁


事务需要使用锁来防止一个用户修改其他用户还没完成事务的数据。对多用户数据来说,锁机制是必须的。锁用来锁定相关资源,锁归事务所有锁是数据库用来控制共享资源并发访问的机制.锁用于保护正在被修改的数据在事务开始或开始后的某一时刻,事务依情况取得相应的锁,直到事务结束事务所持有的所有的锁才被释放

 

锁定的

并行性 -允许多个用户访问同一数据

一致性 一次只允许一个用户修改数据

完整性 为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户

 

锁的分类:

 行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行顾名思义行锁不会锁住整张表,它仅锁住相关行行锁都是排它的。 

一般的查询语句如select ... from ...语句影响的行不会被锁住select ... from ... for update语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行updatedeleteselect...for update操作insert / update / delete ...语句影响的行会被行级排它锁住。其他事务只能查询这些数据行,不能进行updatedeleteselect...for update操作。 

 表级锁锁定整个表,限制其他用户对表的访问

      --->表级共享锁LOCK TABLE  <table_name> IN SHARE MODE 

   该语句将在<table_name>上设置表级共享锁。该锁设置之后,其他事务仅能查看<table_name>表,不能增、删、改<table_name>表,其他事务可同时放置表级共享锁于<table_name>表上。 

       --->表级排它锁LOCK TABLE <table_name> IN EXCLUSIVE MODE 

   表级排它锁与表级共享锁非常相似,但每次只有一个用户可以在表中放置排它锁,却可以有多个用户同时在同一个表中放置共享锁。

带有for update子句的select语句可以在表的一行或多行设置排它锁。


事务阻塞 :

当A事务锁住了某种资源,而同时B事务发出对这种资源的修改语句,则B事务将会被阻塞

我们可规定等待他事务释放锁的等待时间,如:

select ... from ... for update wait 10;           ------将会等待10

LOCK TABLE table1 IN EXCLUSIVE MODE NOWAIT;


死锁:

当两个事务相互等待对方释放资源时,就会形成死锁

Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学好Oracle的六条总结 1、如果有一定的数据库基础,知道SQL是怎么回事,即使写不出来简单的SQL, 但可以看懂它们,你就可以跳到2。否则请先学习一下数据库基础和SQL语言, 不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用 边学习、记忆。2 、要想学好ORACLE,首先要学习ORACLE的体系结构,现在你不需要深入 理解它们,但要分清几个关键的概念: instance (实例)、数据文件、日志文件、参数文件、数据文件与表空间的关系 3、2是有关ORACLE的一些基本概念,下面要学习的是一些简单的的实际操作 ,就是如何去管理ORACLE数据库,当然不是管理全部的ORACLE。在此过程 中你将对SQL和ORACLE体系结构有个更深入的了解。 4、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具 体学习其它的ORACLE知识了。如果你是开发人员,则需要更多地去学习 PL/SQL以及DEVELOPER,而这将是一门新的课程。如果你是一名DBA, 请继续。 5、可以根据自己的实际情况,进行有选择的学习,也就是说下面的内 没有特别顺序要求。可以选择深入学习ORACLE的管理、备份与恢复、性能 调整、网络等。当然在学习这些知识的过程中,如果有实际的工作更好,这样 可以在实际中成长,学会TROUBLE SHOOTING 目录 1.1 数据库基本知识 1.2 关系数据库 1.3 数据库设计基础 1.4 SQL基本命令 1.5 Oracle简介 1.6 启动和关闭Oracle 1.7 Oracle 命令复习

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值