您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > ORACLE深入浅出-中级篇
深入浅出Oracle主讲:邹振兴1ORACL深入浅出主讲人:邹振兴深入浅出Oracle主讲:邹振兴2第一章事务与锁什么是事务?如何Oracle使用事务。在Java中使用事务。什么是锁?演示更新丢失的问题。锁的分类。阻塞与死锁。深入浅出Oracle主讲:邹振兴3什么是事务什么是事务?事务是一种机制,这种机制能保证在事务内的DML(数据操作语句)做为一个不可分割的单元进行执行。举例说明事务。演示sqlservert2005事务处理。演示Oracle事务处理。事务四大特性(ACID)原子性(A)一致性(C)隔离性(I)永久性(D)深入浅出Oracle主讲:邹振兴4什么是事务事务处理的两种方式显示事务:用户通过编码方式开启事务隐式事务:数据库默认认为所有操作都是事务比较sqlserver2005与Oracle事务处理方式的区别。深入浅出Oracle主讲:邹振兴5如何Oracle使用事务Oracel事务关键字Savepointa;设置事务保存点Rollbacktoa;回滚到事务保存点a,事务不结束Commit;提交事务,事务结束Rollback;回滚所有事务,事务结束讲解Oracel程序员一天深入浅出Oracle主讲:邹振兴6在JavaJdbc中使用事务演示如何在JavaJdbc中如何使用事务驱动包位置:oracle安装路径-oracle-jdbc-lib-classes12.jar演示案例:DBUtil.java深入浅出Oracle主讲:邹振兴7什么是锁生活中的锁:为什么会有锁的出现。锁的作用就是保护私有的空间。Oracle中的锁:演示Oracle中更新丢失的问题。讲解此问题的两种思路:一、在第一个用户修改之前不允许其它用户修改。二、在修改之前,查看此数据的版本号。深入浅出Oracle主讲:邹振兴8锁的分类悲观锁定此锁持悲观态度,认为在用户修改数据期间,一定会有用户再对其修改。那么此锁会在用户事务内一直保持锁定状态,其它用户无法进行修改。在查询语句后接forupdatenowait此可加锁。查询多少数据,锁定多少数据。乐观锁定此锁持乐观态度,认为在用户修改数据期间,其它用户不会再对其修改,直到最后提交数据时才判断数据是否已更改。深入浅出Oracle主讲:邹振兴9锁的分类乐观锁定的实现方式:增加标识列来区分是否已修改通过OracleORA_ROWSCN机制来实现乐观锁定深入浅出Oracle主讲:邹振兴10阻塞与死锁如果你有两个会话,每个会话都持有另一个会话想要的资源,此时就会出现死锁(deadlock)。例如,如果我的数据库中有两个表A和B,每个表中都只有一行,就可以很容易地展示什么是死锁。我要做的只是打开两个会话(例如,两个SQL*Plus会话)。在会话A中更新表A,并在会话B中更新表B。现在,如果我想在会话B中更新表A,就会阻塞。会话A已经锁定了这一行。这不是死锁;只是阻塞而已。我还没有遇到过死锁,因为会话A还有机会提交或回滚,这样会话B就能继续。深入浅出Oracle主讲:邹振兴11阻塞与死锁如果我再回到会话A,试图更新表B,这就会导致一个死锁。要在这两个会话中选择一个作为“牺牲品”,让它的语句回滚。例如,会话B中对表A的更新可能回滚,得到以下错误:想要更新表B的会话A还阻塞着,Oracle不会回滚整个事务。只会回滚与死锁有关的某条语句。会话B仍然锁定着表B中的行,而会话A还在耐心地等待这一行可用。收到死锁消息后,会话B必须决定将表B上未执行的工作提交还是回滚,或者继续走另一条路,以后再提交。一旦这个会话执行提交或回滚,另一个阻塞的会话就会继续,好像什么也没有发生过一样。深入浅出Oracle主讲:邹振兴12总结开发多用户、数据库驱动的应用时,最大的难点之一是:一方面要力争取得最大限度的并发访问,与此同时还要确保每个用户能以一致的方式读取和修改数据。为此就有了锁定(locking)机制,这也是所有数据库都具有的一个关键特性,Oracle在这方面更是技高一筹。不过,Oracle的这些特性的实现是Oracle所特有的,就像SQLServer的实现只是SQLServer特有的一样,应用执行数据处理时,要正确地使用这些机制,而这一点要由你(应用的开发人员)来保证。深入浅出Oracle主讲:邹振兴13第五章使用PL/SQLPL/SQL简介变量、常量数据类型流程控制异常处理深入浅出Oracle主讲:邹振兴14PL/SQL简介PL/SQL是Oracle在sql标准上的加强,使用Oracle能够基于对象编程T-SQL是基于事务的结构化查询语言两者都是对SQL的扩展深入浅出Oracle主讲:邹振兴15PL/SQL块简介PL/SQL块是构成PL/SQL程序的基本组织单元,可以编写存储过程、函数、包、触发器等。PL/SQL分为三个部分:声明部分、可执行部分和异常处理部分深入浅出Oracle主讲:邹振兴16PL/SQL块简介演示:PL/SQL打印HelloWorld。演示:如何在PL/SQL块中向表中增加一条记录。演示:如何在PL/SQL块中修改表中数据。演示:查询学员'张秋丽'的年龄。深入浅出Oracle主讲:邹振兴17PL/SQL块小结每一个PL/SQL块将会自动开启一个事务,在PL/SQL块中必须结束事务,否则,将会阻塞。PL/SQL块每条语句后,必须带上’;’,表示语句结束。PL/SQL块中不能执行select语句进行显示。在命令行中执行pl-sql块需加/。在命令行中打印变量需setserverouton;深入浅出Oracle主讲:邹振兴18变量与常量在PL/SQL块的声明部分声明变量或常量语法:declaresalnumber;piconstantnumber:=3.14;赋值1、使用赋值运算符“:=”2、使用SELECTINTO语句3、接收用户输入深入浅出Oracle主讲:邹振兴19变量与常量示例Declaremynamevarchar2(20)notnull:=‘张三’;myagenumber;mypiconstantnumber:=3.14;Beginmyage:=26;selectenameintomynamefromempwhereempno=7369;--输出End;深入浅出Oracle主讲:邹振兴20日期时间日期时间类型存储日期和时间数据常用的两种日期时间类型DATETIMESTAMPdeclaremydatedate;mytimetimestamp;beginselectsysdateintomydatefromdual;selectsysdateintomytimefromdual;dbms_output.put_line(mydate);dbms_output.put_line(mytime);end;深入浅出Oracle主讲:邹振兴21布尔类型(boolean)用于存储逻辑值(TRUE、FALSE和NULL)不能向数据库中插入BOOLEAN数据不能将列值保存到BOOLEAN变量中只能对BOOLEAN变量执行逻辑操作深入浅出Oracle主讲:邹振兴22属性类型用于引用数据库列的数据类型,以及表示表中一行的记录类型列类型%type,语法:表名.列名%type行类型%rowtype,语法:表名%rowtype优点不需要知道被引用的表列的具体类型如果被引用对象的数据类型发生改变,PL/SQL变量的数据类型也随之改变深入浅出Oracle主讲:邹振兴23属性类型示例问题1:假设现在不知道emp表Job列的类型,但要保存员工7369的岗位到变量中,如何定义?declaremyjobemp.Job%type;beginselectJobintomyjobfromempwhereempno=7369;dbms_output.put_line(myjob);end;深入浅出Oracle主讲:邹振兴24属性类型示例问题2:假设要输出emp表员工7369的所有信息,怎么办?定义8个列类型变量,依次输出?declaremyempemp%rowtype;beginselect*intomyempfromempwhereempno=7369;dbms_output.put_line(myemp.ename||myemp.job);end;深入浅出Oracle主讲:邹振兴25异常处理在运行程序时出现的错误叫做异常发生异常后,语句将停止执行,控制权转移到PL/SQL块的异常处理部分异常有两种类型:预定义异常-当PL/SQL程序违反Oracle规则或超越系统限制时隐式引发用户定义异常-用户可以在PL/SQL块的声明部分定义异常,自定义的异常通过RAISE语句显式引发深入浅出Oracle主讲:邹振兴26预定义异常Others处理所有异常在用户试图将重复的值存储在使用唯一索引的数据库列中时出现DUP_VAL_ON_INDEX在将字符串转换为数字时出现INVALID_NUMBER在表中不存在请求的行时出现NO_DATA_FOUND在执行SELECTINTO语句后返回多行时出现TOO_MANY_ROWS在以零作为除数时出现ZERO_DIVIDE深入浅出Oracle主讲:邹振兴27预定义异常declaremynameemp.ename%type;beginselectenameintomynamefromemp;Exceptionwhentoo_many_rowsthendbms_output.put_line('值过多');end;深入浅出Oracle主讲:邹振兴28预定义异常declaremynameemp.ename%type;beginselectenameintomynamefromempwhereempno=1;Exceptionwhenno_data_foundthendbms_output.put_line('没有数据');end;深入浅出Oracle主讲:邹振兴29用户自定义异常declaremyExceptionException;beginif...thenraisemyException;endif;ExceptionwhenmyExceptionthen...end;深入浅出Oracle主讲:邹振兴30流程控制条件结构If语句Case语句循环结构Loop循环While循环For循环深入浅出Oracle主讲:邹振兴31条件结构1)if...then...endif;2)if...then...elseif...endif….endif;嵌套if3)if...then...elsif...then...else...endif;多重if4)case...when...endcase;编写一个PL/SQL块,用户输入一个员工名,如果该员工的工资低于2000,则将该员工工资增长10%。深入浅出Oracle主讲:邹振兴32接收用户输入的两个数,通过条件结构判断两个数的关系declarenum1number;num2number;beginnum1:=‘&请输入一个数’;num2:='&num2';--接收用户输入'&name'ifnum1num2thendbms_output.put_line('小于');elsifnum1num2thendbms_output.put_line('大于');elsedbms_output.put_line('等于');endif;end;深入浅出Oracle主讲:邹振兴33declaregradevarchar2(10);begingrade:='&grade';casegradewhen'A'thendbms_output.put_line('优秀');when'B'thendbms_output.put_line('良好');when'C'thendbms_output
本文标题:ORACLE深入浅出-中级篇
链接地址:https://www.777doc.com/doc-12682 .html