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表数据及结构
Oracle存储过程及游标基本语法_第1张图片
Oracle存储过程及游标基本语法_第2张图片

获取emp表中的总人数并根据传入的员工编号查询员工姓名

create or replace procedure countCursor(empnoInput in emp.empno%type)
--也可以用as定义,但是声明游标时只能用is,创建视图时只能用as
is 
  total int;
  empName emp.ename%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存储过程及游标基本语法_第3张图片

什么是游标
游标实际上是从查询出的结果集中每次提取一条记录的机制。游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。

游标基本用法

create or replace procedure empCursor
as
  -- 声明游标emp_cursor
  cursor emp_cursor is select empno,ename from emp;
  empno emp.empno%type;
  ename emp.ename%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;

输出
Oracle存储过程及游标基本语法_第4张图片

你可能感兴趣的:(数据库,oracle)