`
wuhuizhong
  • 浏览: 682578 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

Oracle触发器和MySQL触发器之间的区别

 
阅读更多

Oracle触发器格式:

 

CREATE [OR REPLACE] TRIGGER trigger_name 
	BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name 
	[FOR EACH ROW]
DECLARE arg_name type [CONSTANT] [NOT NULL] [:=value] 
BEGIN
	pl/sql语句
END

 

 

 

MySQL触发器格式:

 

CREATE TRIGGER trigger_name
	BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name
 	[FOR EACH ROW]
BEGIN
DECLARE arg_name1[,arg_name2,...] type [DEFAULT value]
   	sql语句
END
 
创建测试表(建表语句适用于Oracle、MySQL):
CREATE TABLE test(
  id            int,
  name          varchar(10),
  age           int,
  birthday      date,
  description   varchar(50),
  PRIMARY KEY (id)
);
CREATE TABLE test_log(
  id            int,
  dealtime      date,
  dealtype      varchar(10),
  PRIMARY KEY (`id`)
);
 

 

Oracle触发器和MySQL触发器的区别如下:

 

1,创建语句格式不同

 

Oracle:create or replace(Oracle客户端需要手动提交,MySQL客户端设置的自动提交

SQL> CREATE OR REPLACE TRIGGER trigger_test_insert
  2         BEFORE INSERT ON test
  3         FOR EACH ROW
  4  BEGIN
  5         insert into test_log values(1,sysdate,'insert');
  6  END;
  7  /
 
Trigger created
 
SQL> insert into test(id, name) values(1, 'name');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from test_log;
 
                                     ID DEALTIME    DEALTYPE
--------------------------------------- ----------- ----------
                                      1 2014/7/16 1 insert

 

 

MySQL:不包含or replace

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	insert into test_log values(1,now(),'insert');
END$
delimiter ;
Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  1 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

2,变量的声明位置、声明格式均不相同

 

Oracle:声明位置在触发时的执行语句块外部

 

通过%type的方式将变量与表特定字段类型相关联的好处是:在某些情况下,修改该字段类型时不需要修改触发器(如:字段类型由varchar(10)修改为varchar(20)时,不需要修改触发器)

SQL> CREATE TRIGGER trigger_test_insert
  2         BEFORE INSERT ON test
  3         FOR EACH ROW
  4  DECLARE id1 int default 1;
  5          id2 int:=1;
  6          id3 test_log.id%type:=1;
  7  BEGIN
  8          insert into test_log values(id1+id2+id3,sysdate,'insert');
  9  END;
 10  /
 
Trigger created
 
SQL> insert into test(id, name) values(1, 'name');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from test_log;
 
                                     ID DEALTIME    DEALTYPE
--------------------------------------- ----------- ----------
                                      3 2014/7/16 1 insert

 

 

MySQL:声明位置在触发时的执行语句块内部

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	DECLARE id1 int DEFAULT 1;
	DECLARE id2 int DEFAULT 1;
	insert into test_log values(id1+id2,now(),'insert');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  2 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

3,注释符不同

 

Oracle:使用/* */作为注释符,或者两个连续的-作为注释符(PL/SQL块中至少包含一条可执行语句

CREATE OR REPLACE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	--just a test
  /* just a test */
	null;
END;
/

 

 

MySQL:使用/* */作为注释符,或者两个连续的-后加一个空格作为注释符

delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	/* just a test */
	-- 两个‘-’后面必须带空格
END$
delimiter ;

 

 

4,赋值语法不同

 

Oracle:可以通过select into语句赋值,还可以通过:=进行赋值

SQL> CREATE OR REPLACE TRIGGER trigger_test_insert
  2  	BEFORE INSERT ON test
  3  	FOR EACH ROW
  4  DECLARE id int;
  5  BEGIN
  6  	select max(tl.id) into id from test_log tl;
  7  	if id is null then
  8  		id:=1;
  9  	else
 10  		id:=id+1;
 11  	end if;
 12  	insert into test_log values(id,sysdate,'insert');
 13  END;
 14  /
 
Trigger created
 
SQL> insert into test(id, name) values(1, 'name');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from test_log;
 
                                     ID DEALTIME    DEALTYPE
--------------------------------------- ----------- ----------
                                      1 2014/7/16 1 insert

 

 

MySQL:可以通过select into语句赋值,还可以通过set语句进行赋值

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	DECLARE id int;
	select max(tl.id) into id from test_log tl;
	if id is null then 
		set id=1;
	else 
		set id=id+1;
	end if;
	insert into test_log values(id,now(),'insert');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  1 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

5,对于行级更新触发器

 

Oracle:原有行用:old表示,新行用:new表示

SQL> CREATE OR REPLACE TRIGGER trigger_test_update
  2         BEFORE UPDATE ON test
  3         FOR EACH ROW
  4  BEGIN
  5         :new.description := 'change name[' ||
  6                          :old.name || ']->[' ||
  7                          :new.name || ']';
  8  END;
  9  /
 
Trigger created
 
SQL> insert into test(id, name) values (1, 'aaa');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> update test set name = 'bbb' where id = 1;
 
1 row updated
 
SQL> commit;
 
Commit complete
 
SQL> select id, name, description from test;
 
                                     ID NAME       DESCRIPTION
--------------------------------------- ---------- ----------------------                                      
                                      1 bbb        change name[aaa]->[bbb]

 

 

MySQL:原有行用old表示,新行用new表示

mysql> delimiter $
CREATE TRIGGER trigger_test_update  
	BEFORE UPDATE ON test 
	FOR EACH ROW
BEGIN
	set new.description = concat('change name[',
		old.name,']->[',new.name,']');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values (1, 'aaa');
Query OK, 1 row affected

mysql> update test set name = 'bbb' where id = 1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select id, name, description from test;
+----+------+-------------------------+
| id | name | description             |
+----+------+-------------------------+
|  1 | bbb  | change name[aaa]->[bbb] |
+----+------+-------------------------+
1 row in set

 

 

6,其它一些语法、函数上的区别

 

Oracle:使用if...elsif...else

 

MySQL:使用if...elseif...else

 

Oracle:sysdate指代系统时间

 

MySQL:sysdate()指代系统时间

 

分享到:
评论

相关推荐

    MySQL与Oracle 差异比较之六触发器

    在处理新数据和旧数据时,Oracle和MySQL也有所区别。在Oracle中,新插入或更新的行被称为`:NEW`,被删除或更新前的行被称为`:OLD`,而MySQL使用`NEW`和`OLD`关键字,但不加冒号,如`NEW.FAC_CD`和`OLD.FAC_CD`。需要...

    Oracle与MySQL在数据库触发器和事件调度器上的比较分析

    Oracle和MySQL作为两个流行的数据库管理系统,它们在触发器和事件调度器的实现和功能上存在一些差异。 Oracle和MySQL在触发器和事件调度器上提供了强大的自动化功能,但它们在实现和功能上存在一些差异。开发者需要...

    Oracle和MySQL在触发器上的一些差异.pdf

    【Oracle和MySQL触发器差异详解】 Oracle和MySQL都是广泛使用的数据库管理系统,但它们在特定功能上有显著的区别,尤其是在触发器的实现和使用上。触发器是一种数据库对象,它在特定的数据库事件(如INSERT、UPDATE...

    oracle和mysql的区别

    Oracle 和 MySQL 是两种广泛应用的关系型数据库管理系统,它们在很多方面有着显著的区别。以下是一些主要的对比点: 1. **用户和数据库管理**: - Oracle 中,`all_users` 视图用于显示所有用户,而每个项目通常...

    OracleTOMysql 转换工具

    8. **触发器和存储过程**:Oracle数据库支持复杂的触发器和存储过程,转换时可能需要将其转化为MySQL的等效功能。 9. **数据一致性**:在迁移过程中,保证数据的一致性和完整性至关重要。转换工具应有错误检查和...

    Mysql转oracle工具

    此外,存储过程、触发器和函数的语法也有区别。 2. **数据类型转换**: 两个系统中的数据类型存在差异。例如,MySQL的`VARCHAR2`对应Oracle的`VARCHAR2`,但MySQL的`TINYINT`在Oracle中可能是`NUMBER(3)`,`BLOB`...

    从Oracle迁移到MySQL经典实战

    由于MySQL不支持Oracle的一些高级特性,如物质化视图、触发器和存储过程,可能需要重新设计数据库模式,利用MySQL的索引、分区和查询优化来达到相似的性能效果。同时,要关注数据量、并发访问和性能需求,以确定合适...

    oracle 到mysql转换工具

    Oracle到MySQL转换工具是一款专为数据库迁移设计的实用软件,主要功能是将Oracle数据库中的数据结构和SQL语句转换成MySQL兼容的格式,方便用户在不同的数据库系统间进行数据迁移。这款工具通常适用于那些需要从...

    mysql 数据库转 oracle

    3. **触发器和存储过程**:如果MySQL数据库中包含触发器和存储过程,迁移工具需要能处理这些复杂逻辑,确保在Oracle中重建。 4. **权限和角色**:用户权限和角色在数据库迁移中同样重要。工具需要考虑如何将MySQL的...

    Oracle使用触发器和mysql中使用触发器的案例比较

    一、触发器  1.触发器在数据库里以独立的对象存储,  2.触发器不需要调用,它由一个事件来触发运行 ...二、Oracle 使用 PL/SQL 编写触发器 1.–PL/SQL创建触发器的一般语法 create [or replace] trigger trigg

    mysql和Oracle的数据同步demo案例

    本案例主要探讨的是如何实现MySQL和Oracle数据库之间的数据同步。这两个数据库系统在业界广泛应用,它们各自具有独特的特性和优势,但有时需要将数据在两者之间进行迁移或实时同步。 MySQL是一款开源、轻量级的关系...

    Oracle 触发器的使用小结

    - Oracle触发器的学习笔记和实例详解提供了更深入的触发器使用技巧和案例。 - 主键自增表的创建以及触发器的应用,展示了如何在Oracle中实现类似MySQL的自增主键。 - 监控表变动的触发器示例,说明了如何利用...

    Oracle和MySQL语句区别.doc

    Oracle和MySQL语句区别 Oracle和MySQL是两种常用的关系数据库管理系统,它们都使用SQL语言来管理和操作数据库。但是,Oracle和MySQL在语句上有许多不同之处。本文将对Oracle和MySQL语句的不同之处进行详细的比较和...

    Oracle数据库sql转换mysql数据库工具

    1. **SQL语法转换**:Oracle SQL和MySQL SQL在语法上有区别,如数据类型、子查询、游标、触发器等。工具会识别Oracle SQL语句并转换为等效的MySQL语法。 2. **数据迁移**:除了转换SQL,工具可能还支持数据的迁移,...

    oracle数据库转mysql数据库免费工具

    Oracle数据库和MySQL数据库都是广泛应用的关系型数据库管理系统,但它们在数据结构、语法和功能上存在显著差异。在需要将Oracle数据库的数据迁移至MySQL数据库时,就需要借助特定的转换工具来实现这一过程。"ora2...

    oracle Mysql相互转化的工具

    4. 触发器和存储过程转换:Oracle和MySQL都有自己的SQL语法和存储过程实现,工具需能处理这类复杂的逻辑转换。 5. 安全性和稳定性:迁移过程中,数据的安全性和迁移过程的稳定性至关重要。工具应有错误处理机制,能...

    oracle与mysql 性能的对比

    MySQL、Oracle 和 Postgres 都支持 INSERT、UPDATE 和 DELETE 操作的 BEFORE 和 AFTER 事件触发器。 安全性 所有这三个数据库都有它的脆弱性。软件肯定有一些死角故障隐藏其中,这是它的本性。此外,这三个数据库...

    mysql-oracle数据同步

    2. **编程方式**:通过编写Java、Python或其他语言的脚本,连接MySQL和Oracle数据库,读取MySQL数据,处理后写入Oracle。这种方式需要对数据库API有深入理解,比如JDBC、ODBC等。 3. **数据库复制服务**:Oracle...

    Convert Oracle to Mysql

    - Oracle的触发器、存储过程、视图等可能需要转换为MySQL的等效物。 7. **数据导出与导入**: - Oracle可以通过`expdp`或`Data Pump`进行数据导出,MySQL则可能使用`mysqldump`。 - "ora2mysqcn.exe"可能简化了...

Global site tag (gtag.js) - Google Analytics