oracle从入门到精通视频教程(oracle存储过程详解)

oracle从入门到精通视频教程(oracle存储过程详解)

Oracle 数据库基础教程 – 存储过程存储过程一般可以理解为:事先经过编译并存储在数据库中的一套 sql 语句说的更加直白一点:存储过程就是 sql 语句的增删改查操作或者数据检查抛异常的集合优点:1. 提高 sql 执行效率 2. 减少网络流量(I/O)3. 提高系统的安全性缺点:增加数据库服务器的负荷

创建存储过程

createorreplaceprocedurep_UserInfo_Delete(v_commentinvarchar2,msgoutvarchar2)asuser_err1exception;errstrvarchar2(256);t_cntnumber;beginmsg:=’Opps’;selectcount(*)intot_cntfromUserInfotwheret.Comment=v_comment;ift_cnt>0thenupdateUserInfotsett.Comment=’Updatedbyadmin’wheret.Comment=v_comment;msg:=’OK’;elseerrstr:=’Opps,datanotfound!’;msg:=’Opps’;raiseuser_err1;endif;exceptionwhenuser_err1thenraise_application_error(-20007,errstr);raise;end;解释说明1. 此存储过程实现的功能是将 UserInfo 表中备注信息为v_comment(用户输入的条件)的结果集把备注信息更新为Updated by admin,成功时输出 OK,失败或异常时输出 Opps2. 参数分为 in 和 out 两种,in 关键字表示输入参数,可以省略关键字,out 关键字表示输出参数,不能省略关键字3. exception 为异常关键字,用户可以通过 raise 关键字进行触发

补充知识

对于存储过程和接下来我们要讲解的函数编程来说,我们除了需要掌握一些基础的语法之外还需要做一些常用的知识补充变量赋值–变量声明vnamevarchar2(32);–赋值select’JeremyWU’intovnamefromdual;vname:=’JeremyWU’;警告1. 我们可以通过 select 语句进行变量的赋值2. 或者通过赋值符号:=对变量进行赋值条件判断–变量声明vconditionvarchar2(32);–变量赋值vcondition:=’OK’;–if条件判断ifvcondition==’OK’then–业务逻辑1else–业务逻辑2endif;–casewhen条件判断casewhenvcondition==’OK’then–业务逻辑1whenvcondition==’A’then–业务逻辑2whenvcondition==’B’then–业务逻辑3whenvcondition==’C’then–业务逻辑4else–业务逻辑5end;警告1. 这里和基本的条件分支语法基本类似2. 注意这种条件判断的语法块开始和结束3. 对于需要处理的业务逻辑不止一条语句时,需要用 begin end 包裹起来游标与循环游标是通过关键字 CURSOR 的来定义一组 Oracle 查询出来的数据集,类似数组一样,把查询的数据集存储在内存当中,然后通过游标指向其中一条记录,通过循环游标达到循环数据集的目的Oracle 游标可以分为显式游标和隐式游标两种之分,我们这里主要讲解显示游标Oracle 游标一般与循环配合使用–语法–声明游标declarecursorcursor_nameisselectsql_statement;–打开游标opencursor_name;–取一条游标中的数据fetchcursor_nameintovrecord–关闭游标closecursor_name;–实例–Createdon2019-08-30byJEREMYWUdeclare–Localvariableshereiinteger;–定义游标CURSORQISSELECTT.Params1,T.Params2,T.Params3FROMTableName/ViewNameTWHERE条件;begin–Teststatementshere–使用游标FORRecINQLOOP–业务逻辑–可以使用游标中的字段Rec.Params1,Rec.Params2,Rec.Params3ENDLOOP;–或者OpenQ;loopfetchQintoRec;exitwhereQ%NOTFOUND;–业务逻辑–可以使用游标中的字段Rec.Params1,Rec.Params2,Rec.Params3endloop;–关闭游标CLOSEQ;end;特别注意1. 对于第一种方法,我们这里使用了 for … in … loop … end loop 循环2. 第二种方法我们使用了游标的属性 %NOTFOUND 表示游标获取数据的时候是否有数据提取出来,没有数据返回 true,有数据返回 false3. 除了 %NOTFOUND 还有 %FOUND、%ISOPEN、%ROWCOUNT,具体意义看名字就知道了4. 使用完游标后记得关闭游标while条件语句loopbegin–业务逻辑end;endloop;除了 for 循环还有 while 循环,这里就不再展开,实际工作过程中根据需要使用

特别注意1. 尽量不要使用循环,特别是循环套循环的情况2. 慎用游标3. 以上两条都是基于性能考量,后面我们会在 Oracle 数据库优化章节展开讲解,本节不再展开

自治事务

首先要先明白会话与事务的含义,事务其实就是数据库的一次 transaction,你也可以简单的理解成一次增加、删除或更新操作。会话是一次 session 可以是一个或者多个事务自治事务是在某个会话中独立开启一个事务,在其中处理的操作不会影响到同一会话中其他事务未提交的内容事务具有 4 个属性:原子性、一致性、隔离性和持久性

警告1. 在 Oracle 数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录2. 正常结束的没有问题,但是触发异常的情况下,一般的过程或者函数显然不能在插入运行日志之后直接 Commit,因为触发异常后相关业务逻辑需要 RollBack3. 自治事务就能够很好的避免了这样的问题,就是说自治事务是在某个会话中独立开启一个事务,在其中处理的操作不会影响到同一会话中其他事务未提交的内容–Run_Logs;//运行日志表,包含栏位dates,logs–自治事务存储过程CREATEORREPLACEPROCEDUREPro_Run_Logs(Error_InfoInVarchar2)IsPRAGMAAUTONOMOUS_TRANSACTION;BEGINInsertIntoRun_Logs(Dates,Logs)Values(Sysdate,Error_Info);COMMIT;END;–一般业务逻辑存储过程CREATEORREPLACEPROCEDUREPro_Test(v_oldcustnameinvarchar2,v_newcustnameinvarchar2)isinumber;errorExceptionexception;str_errvarchar2(100);user_errexception;begin–业务逻辑Commit;exceptionWhenerrorExceptionThenPro_Run_Logs(str_err);WHENuser_errTHENraise_application_error(-20007,str_err);RAISE;end;特别注意1. 慎用自治事务,特别是在复杂的业务场景中2. Oracle 主事务严格遵从事务的 4 个属性,一旦开启自治事务,在调用和被调用过程中,如果忘记 commit,往往会造成资源被占用而导致数据库死锁

感谢阅读

– End –

推荐阅读

1.计数器2.触发器3.数据表4.数据表的增删改查操作

原创技术文章第一时间推送 ??

发表评论

登录后才能评论