Oracle存储过程及游标基本语法
什么是存储过程
存储过程是经过编译并存储在数据库中的⼀段SQL语句的集合。
存储过程的优缺点
优点
1、运⾏速度:对于很简单的sql,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进⾏了⼀次解析和优化。存储过程⼀旦执⾏,在内存中就会保留⼀份这个存储过程,这样下次再执⾏同样的存储过程时,可以从内存中直接调⽤,所以执⾏速度会⽐普通sql快。
2、可维护性:存储过程有些时候⽐程序更容易维护,这是因为可以实时更新DB端的存储过程。 有些bug,直接改存储过程⾥的业务逻辑,就可以了,不需要修改程序代码重新发布部署。
3、增强安全性:提⾼代码安全,防⽌ SQL注⼊。这⼀点sql语句也可以做到。
4、可扩展性:应⽤程序和数据库操作分开,独⽴进⾏,⽽不是相互在⼀起。⽅便以后的扩展和DBA维护优化。
缺点
1、SQL本⾝是⼀种结构化查询语⾔,但不是⾯向对象的的,本质上还是过程化的语⾔,⾯对复杂的业务逻辑,过程化的处理会很吃⼒。同时SQL擅长的是数据查询⽽⾮业务逻辑的处理,如果如果把业务逻辑全放在存储过程⾥⾯,违背了这⼀原则。
2、如果需要对输⼊存储过程的参数进⾏更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调⽤,等等,这时候估计会⽐较繁琐了。
3、开发调试复杂,由于IDE的问题,存储过程的开发调试要⽐⼀般程序困难。
4、没办法应⽤缓存。虽然有全局临时表之类的⽅法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。
5、不⽀持集,数据库服务器⽆法⽔平扩展,或者数据库的切割(⽔平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。
总结
1、适当的使⽤存储过程,能够提⾼我们SQL查询的性能但是存储过程不应该⼤规模使⽤,滥⽤。
2、随着众多ORM 的出现,存储过程很多优势已经不明显。
3、SQL最⼤的缺点还是SQL语⾔本⾝的局限性——SQL本⾝是⼀种结构化查询语⾔,我们不应该⽤存储过程处理复杂的业务逻辑——让SQL回归它“结构化查询语⾔”的功⽤。复杂的业务逻辑,还是交给代码去处理吧。
⽰例:
oracle数据库安装后⾃带的emp表数据及结构
获取emp表中的总⼈数并根据传⼊的员⼯编号查询员⼯姓名
create or replace procedure countCursor(empnoInput pno%type)
--也可以⽤as定义,但是声明游标时只能⽤is,创建视图时只能⽤as
is
total int;
ame%type;
begin
select count(*)into total from emp;
select ename into empName from emp where empno = empnoInput;
dbms_output.put_line('总⼈数:'|| total);
dbms_output.put_line('员⼯编号为:'|| empnoInput ||'的员⼯姓名:'|| empName); --异常抛出
exception
when others then
dbms_output.put_line('异常');
end;
调⽤存储过程
begin
countCursor(7369);
end;
oracle游标的使用输出:
什么是游标
游标实际上是从查询出的结果集中每次提取⼀条记录的机制。游标的作⽤就是⽤于对查询数据库所返回的记录进⾏遍历,以便进⾏相应的操作。
游标基本⽤法
create or replace procedure empCursor
as
-- 声明游标emp_cursor
cursor emp_cursor is select empno,ename from emp;
pno%type;
ame%type;
begin
-- 开启游标emp_cursor
open emp_cursor;
-- 执⾏循环
loop
-- 取游标值给变量
fetch emp_cursor into empno,ename;
-- 游标⼀条⼀条地遍历记录,当不到记录时退出
exit when emp_cursor%notfound;
dbms_output.put_line('no:'|| empno ||'name:'||ename);
end loop;
-- 关闭游标
close emp_cursor;
--异常抛出
exception
when others then
dbms_output.put_line('异常');
end;
调⽤存储过程
begin
empCursor();
end;
输出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。