Oracle存储过程、触发器、Mysql与Oracle区别

一、课程目标

【理解】Oracle存储过程
【理解】Oracle触发器
【掌握】mysql与oracle的区别

二、Oracle存储过程

2.1 概念

就是将oracle中的块进行命名后存储起来,达到重复使用的过程

2.2 优点

  • 模块化:将程序分解为逻辑模块
  • 可重用性:可以被任意数目的程序调用
  • 可维护性:简化维护操作
  • 安全性:通过设置权限,使数据更安全
  • 执行效率较高

2.3 书写

2.3.1 无参过程书写

CREATE [OR REPLACE] PROCEDURE procedureName[()]
IS|AS --变量的声明部分
BEGIN
--业务
[EXCEPTION --异常处理]
END;
--查询编号为20的部门名与所在地
create or replace procedure  pro1()
 is 
   v_val dept%rowtype;
 begin
    select * into v_val from dept where deptno=20;
   dbms_output.put_line(v_val.dname);
   dbms_output.put_line(v_val.loc);
 end;
--根据部门编号,为员工加薪(部门编号=10,加薪100,部门编号=20,加薪200,部门编号=30,加薪300)
create or replace procedure pro2
is
  cursor c is select * from emp for update;
begin
  for v_emp_rec in c
     loop
        if(v_emp_rec.deptno=10) then
          update emp set sal=sal+100 where empno=v_emp_rec.empno;--current of c 当前游标指向的记录
        elsif v_emp_rec.deptno=20 then
           update emp set sal=sal+200 where current of c;
        elsif v_emp_rec.deptno=30 then
           update emp set sal=sal+300 where current of c;   
        end if;   
     end loop;
  commit;  --提交事务
end;

2.3.2 有参过程书写

  • IN:用于接受调用程序的值 (输入参数)
  • OUT:用于向调用程序返回值 (输出参数)
  • IN OUT:用于接受调用程序的值,并向调用程序返回更新的值(即可以充当输入参数也可以充当输出参数)
create or replace procedure pro3( emp_no in number)
is 
  v_name varchar2(20);
begin
  select ename into v_name from emp where empno=emp_no;
  dbms_output.put_line('name:'||v_name);
  exception when NO_DATA_FOUND then 
    dbms_output.put_line('no name');
end;  

call pro3(7839);
--既有输入参数又有输出参数(接受返回值)
create or replace procedure pro4(emp_no in number,emp_sal out number)
is 
  v_name varchar2(20);
begin
  select ename,sal into v_name,emp_sal from emp where empno=emp_no;
  dbms_output.put_line('名称:'||v_name);
  exception when NO_DATA_FOUND then 
    dbms_output.put_line('没有找到雇员信息..');
end; 

declare 
 emp_no number:=7934;
 emp_sal number;--接收返回值
begin
  pro4(emp_no,emp_sal);
  dbms_output.put_line('out:....'||emp_sal);
end;
--既能输入参数又能输出参数(接受返回值)
create or replace procedure pro5(emp_val in out number)
is 
begin
  select sal into emp_val from emp where empno=emp_val;
  exception when NO_DATA_FOUND then 
    dbms_output.put_line('no');
end; 
 
declare 
 val number:=7934;
begin
  pro5(val);
  dbms_output.put_line('out:....'||val);
end;

2.4 使用

与方法的使用一样,通过过程名(参数)的形式进行使用

  • execute 存储过程名称(sqlplus中)

    execute pro1();
    
  • call 存储过程名称(sqlplus/PLSQLDev中)

    call pro1();
    
  • 使用块执行

    begin
      pro1();
    end;
    

三、Oracle触发器

3.1 概念

触发器是指被隐含执行的存储过程,它可以使用PL/SQL进行开发
当发生特定事件(如修改表、创建对象、登录到数据库)时,Oracle会自动执行触发器的相应代码

触发器是当特定事件出现时自动执行的存储过程

3.2 类型

  • DML触发器 :在对数据库表进行DML操作时触发,并且可以对每行或者语句操作上进行触发。
  • 替代触发器:是oracle8专门为进行视图操作的一种触发器
  • 系统触发器 :对数据库系统事件进行触发,如启动、关闭等

3.3 书写

3.3.1 触发器组成

  • 触发事件 :DML或DDL语句。
  • 触发时间:是在触发事件发生之前(before)还是之后(after)触发
  • 触发操作:使用PL/SQL块进行相应的数据库操作
  • 触发对象:表、视图、模式、数据库
  • 触发频率 :触发器内定义的动作被执行的次数。

编写触发器执行代码时,需要注意以下限制

触发器代码的大小不能超过32K。如果确实需要使用大量的代码创建触发器,则应该首先创建过程,然后在触发器中使用CALL语句调用过程
触发器代码只能包含SELECT、INSERT、UPDATE和DELETE语句,
不能包含DDL语句(CREATE、ALTER和DROP)和事务控制语句(COMMIT、ROLLBACK和SAVEPOINT)

3.3.2 语法

CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_name
[FOR EACH ROW]
begin
pl/sql_block;
end;
--------------------------触发器-------------------------------

create table tbl_dept
(
  deptId number(4) primary key,
  deptName varchar2(20),
  deptNum number(4)
)

create table tbl_emp
(
  empId number(4) primary key,
  empName varchar2(20),
  deptId number(4) references tbl_dept(deptId)
)

insert into tbl_dept(deptId,deptName,deptNum) values(1,'开发部',1);
insert into tbl_dept(deptId,deptName,deptNum) values(2,'测试部',2);

insert into tbl_emp(empId,empName,deptId) values(1,'zhangsan',1);
insert into tbl_emp(empId,empName,deptId) values(2,'zhangsan2',2);
insert into tbl_emp(empId,empName,deptId) values(3,'zhangsan3',2);


--利用触发器,维护部门人数
--(如果新添加员工,让部门人数+1;
--如果删除员工,让部门人数-1;
--如果为员工更改部门:原有部门人数-1,现有部门人数+1)
create or replace  trigger tri1
after insert or delete or update
on tbl_emp



for each row
begin
   if inserting then
     update tbl_dept set deptNum=deptNum+1 where deptId=:new.deptId;--:new代表新数据
   elsif deleting then
     update tbl_dept set deptNum=deptNum-1 where deptId=:old.deptId;--:old代表旧数据  
   elsif updating then
     update tbl_dept set deptNum=deptNum-1 where deptId=:old.deptId;--:old代表旧数据 
     update tbl_dept set deptNum=deptNum+1 where deptId=:new.deptId;--:new代表新数据 
   end if;  
end;  

insert into tbl_emp values(4,'zhaoliu',1);
delete from tbl_emp where empId=4
update tbl_emp set deptId = 1 where empId=2
commit;

四、mysql与Oracle区别

1、软件大小区别

mysql在300M左右 oracle安装后在4G左右

2、收费使用区别

mysql开源免费,oracle使用免费服务收费

3、存储数据的区别

mysql使用库的形式进行数据存储,oracle使用表空间进行表的存储,mysql使用同一的位置进行数据的存储,oracle表空间存储数据可以存在不同的磁盘,并设置存储大小

4、安全性的区别

oracle拥有健全的权限操作,可以细致到对应操作的权限,oracle会根据连接的不同账号与地址设置不同的权限

5、事务隔离的区别

mysql默认事务隔离级别为可重复读,oracle为读已提交

6、检测约束的区别

mysql中可以书写检查约束但不生效,oracle可以生效使用

7、数据使用的区别

mysql对于数据不区分大小写。oracle区分,并且进行字符串输入时mysql可以使用’ 或"oracle中只能使用’

8、数据类型的区别

mysql常用数据类型:int double varcher datetime timestamp

oracle常用数据类型: number varchar2 date timestamp 建议不使用null进行存储

9、主键自增的区别

mysql拥有主键自增约束,oracle中使用序列进行主键自增操作

10、分页的区别

mysql可以使用limit进行快速分页操作,oracle使用伪列rownum进行行数的判定通过条件截取

11、别名的区别

mysql中对于表或临时表起别名可以使用as或不加,oracle中对表起别名不能使用as

12、分组查询的区别

oracle进行分组查询,select语句后只能出现聚合函数与分组字段,mysql可以查询其他字段(无意义)

13、特殊语法的区别

oracle根据sql延伸开发了plsql语句

14、事务的提交的区别

mysql对于每条数据默认事务自动提交(每条sql语句就是一个事务)

oracle需要手动提交

15、并发性的区别

MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。

虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。

Oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以Oracle对并

16、性能诊断

MySQL的诊断调优方法较少,主要有慢查询日志。

Oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值