oracle存储过程

 

一.存储过程是一组为完成特定功能的sql语句,经编译后存储在数据库中。当一个事务涉及到多个sql语句或者多个表的操作时要考虑使用存储过程;还有当一个事务的完成需要复杂的商业逻辑(对多个数据操作,对多个状态的判断更改)以及比较复杂的统计和汇总也需要进行考虑。

二.存储过程的优缺点

优点:
1.使程序执行效率更高,安全性更好,过程建立后已经编译并且储存到数据库,直接写sql就需要先分析再执行,而且直接写sql会带来安全问题,例如sql注入等。
2.过程只是在调用时才使用,所以不会很占系统资源。
3.可以用于降低网络流量,存储过程代码直接存储于数据库中,不会产生大量T-sql语句的代码流量。
4.增强对执行计划的重复使用,可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。
5.可维护性高。
6.代码精简一致,一个存储过程可以用于程序的不同位置。
7.增强安全性。(1)向用户授予对存储过程(而不是表)的访问权限,可提供对特定数据的访问;(2)提高代码安全,防止sql注入(未彻底解决);(3)SqlParameter 类指定存储过程参数的数据类型,可以验证用户提供的值类型。

缺点:大量利用过程,会对服务器造成较大压力。

参考博客:https://www.cnblogs.com/dc-earl/articles/9260111.html

三.存储过程的编写

语法:存储过程的语法不同于java语法,连接两个字符串使用||而不是+,在给变量赋值时需要使用:=,在循环语句中需要使用到loop。循环可以使用for循环,也可以用while语句实现,语句基本如下:for i in 循环数据 loop(while 循环条件 loop),最终在循环结束后使用end结束循环。

语句:

1 create or replace procedure myDemo01(name1 varchar,age int) is
2 i number;
3 begin
4   i:=1;
5   for i in 1..10 loop
6     dbms_output.put_line('name='||name1||',age='||age);
7   end loop;
8 end myDemo01;

第1行:说明创建一个新的或者覆盖原有的存储过程,myDemo01即为新的存储过程的名字,当存储过程没有参数时,可以将括号去掉;is:在视图中只能用as不能用is;在游标中只能用is不能用as,as在存储过程以及函数中没有区别。

第2行:自定义变量 ,i为变量名,后面number为变量类型,可在两个之间添加in

第3行:语句执行开始,在里边即可以写语句,包括sql语句等等,在这里使用for循环进行测试

第4行:将定义的变量值赋为1

第5行:for循环,1..10,中间用两个点,也可替换为其它数组,也可换为select查询语句返回的结果集

第6行:将结果输出以供查看

第7行:结束for循环

第8行:结束存储过程。

进行测试时,先对存储过程进行编译,然后在plsql中右键存储过程,点击测试,在里边输入测试语句进行测试,如图:

 

声明declare关键字,下边是对于变量的定义,在调用存储过程时括号内需要使用=>来进行传参

看输出结果可以点击旁边的DBMS 输出进行查看:

四、游标的介绍

       游标是sql的一个内存工作区,以变量形式定义,其作用就是用来临时存储从数据库中提取的数据块,游标分为两种类型,显式和隐式,一次只从数据库中提取一行数据,这种形式使用隐式游标,当提取多行数据,就需要使用显式游标,其对应一个返回结果为多行多列的select语句,游标打开后,从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。

隐式游标:属性有以下四种

1     隐式游标的属性 返回值类型   意    义   
2     SQL%ROWCOUNT    整型  代表DML语句成功执行的数据行数   
3     SQL%FOUND   布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功   
4     SQL%NOTFOUND    布尔型 与SQL%FOUND属性返回值相反   
5     SQL%ISOPEN  布尔型 DML执行过程中为真,结束后为假  

显式游标:

使用分为4步:1.声明游标,declare部分  cursor 游标名[参数1 数据类型[,参数2 数据类型...])] is select语句,select语句中可以包含where,order by和group by等子句,不能使用into语句;2.打开游标,begin之后   open 游标名[参数1 数据类型[,参数2 数据类型...])];3.提取数据,提取必须在打开之后进行,fetch 游标名 into 变量名1[,变量名2...]或者FETCH 游标名 INTO 记录变量,使用记录变量需要提前定义,方法如下:变量名 表名|游标名%ROWTYPE,其中表已存在,游标已定义;4.关闭游标,close 游标名;显式游标打开后必须显式关闭,游标一旦关闭,其所占用资源就会被释放,必须再次打开才能使用。

 

 

游标详细介绍参考博客:https://blog.csdn.net/liyong199012/article/details/8948952

 

posted @ 2019-08-23 14:19  Joker明哥  阅读(406)  评论(0编辑  收藏  举报