加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 14:05:14 所属栏目:百科 来源:网络整理
导读:原文链接:http://www.jb51.cc/article/p-skrqcnwv-tu.html ----------------------------------------------------------- Oracle触发器格式: [plain] view plain copy CREATE[ORREPLACE]TRIGGERtrigger_name BEFORE|AFTERINSERT|UPDATE|DELETEONtable_nam

原文链接:http://www.52php.cn/article/p-skrqcnwv-tu.html

-----------------------------------------------------------

Oracle触发器格式:

[plain] view plain copy
  1. CREATE[ORREPLACE]TRIGGERtrigger_name
  2. BEFORE|AFTERINSERT|UPDATE|DELETEONtable_name
  3. [FOREACHROW]
  4. DECLAREarg_nametype[CONSTANT][NOTNULL][:=value]
  5. BEGIN
  6. pl/sql语句
  7. END

MySQL触发器格式:

CREATETRIGGERtrigger_name
  • BEGIN
  • DECLAREarg_name1[,arg_name2,...]type[DEFAULTvalue]
  • sql语句
  • 创建测试表(建表语句适用于Oracle、MySQL):

    [sql] view plain copy
      CREATETABLEtest(
    1. idint,
    2. namevarchar(10),
    3. agebirthdaydate,0);background-color:inherit;">descriptionvarchar(50),153);font-size:14px;border:none;">PRIMARYKEY(id)
    4. );
    5. TABLEtest_log(
    6. dealtimedealtypeKEY(`id`)
    7. );

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

    1,创建语句格式不同

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

    SQL>CREATEORREPLACETRIGGERtrigger_test_insert
  • 2BEFOREINSERTONtest
  • 3FOREACHROW
  • 4BEGIN
  • 5insertintotest_logvalues(1,sysdate,'insert');
  • 6END;
  • 7/
  • Triggercreated
  • SQL>insertintotest(id,name)values(1,'name');
  • 1rowinserted
  • SQL>commit;
  • Commitcomplete
  • SQL>select*fromtest_log;
  • IDDEALTIMEDEALTYPE
  • ------------------------------------------------------------
  • 12014/7/161insert
  • MySQL:不包含or replace

    mysql>delimiter$
  • CREATETRIGGERtrigger_test_insert
  • BEFOREINSERTONtest
  • FOREACHROW
  • insertintotest_logvalues(1,now(),'insert');
  • END$
  • delimiter;
  • QueryOK,0rowsaffected
  • mysql>insertintotest(id,1rowaffected
  • mysql>select*fromtest_log;
  • +----+------------+----------+
  • |id|dealtime|dealtype|
  • |1|2014-07-16|insert|
  • 1rowinset
  • 2,变量的声明位置、声明格式均不相同

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

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

    SQL>CREATETRIGGERtrigger_test_insert
  • 4DECLAREid1intdefault1;
  • 5id2int:=1;
  • 6id3test_log.id%type:=1;
  • 7BEGIN
  • 8insertintotest_logvalues(id1+id2+id3,0);background-color:inherit;">9END;
  • 10/
  • Triggercreated
  • 1rowinserted
  • SQL>commit;
  • Commitcomplete
  • SQL>select*fromtest_log;
  • IDDEALTIMEDEALTYPE
  • ------------------------------------------------------------
  • 32014/7/161insert
  • MySQL:声明位置在触发时的执行语句块内部

    DECLAREid1intDEFAULT1;
  • DECLAREid2intDEFAULT1;
  • insertintotest_logvalues(id1+id2,0rowsaffected
  • mysql>select*fromtest_log;
  • +----+------------+----------+
  • |id|dealtime|dealtype|
  • |2|2014-07-16|insert|
  • 3,注释符不同

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

    CREATEORREPLACETRIGGERtrigger_test_insert
  • BEFOREINSERTONtest
  • FOREACHROW
  • BEGIN
  • --justatest
  • /*justatest*/
  • null;
  • END;
  • /
  • MySQL:使用/* */作为注释符,或者两个连续的-后加一个空格作为注释符

    delimiter$
  • TRIGGERtrigger_test_insert
  • ONtest
  • FOREACHROW
  • BEGIN
  • --两个‘-’后面必须带空格
  • END$
  • delimiter;
  • 4,赋值语法不同

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

    4DECLAREidint;
  • 5BEGIN
  • 6selectmax(tl.id)intoidfromtest_logtl;
  • 7ifidisnullthen
  • 8id:=1;
  • 9else
  • 10id:=id+1;
  • 11endif;
  • 12insertintotest_logvalues(id,0);background-color:inherit;">13END;
  • 14/
  • MySQL:可以通过select into语句赋值,还可以通过set语句进行赋值

    DECLAREidint;
  • selectmax(tl.id)intoidfromtest_logtl;
  • ifidisnullthen
  • setid=1;
  • else
  • setid=id+1;
  • endif;
  • insertintotest_logvalues(id,0);background-color:inherit;">END$
  • delimiter;
  • 5,对于行级更新触发器

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

    SQL>CREATEORREPLACETRIGGERtrigger_test_update
  • 2BEFOREUPDATEONtest
  • 5:new.description:='changename['||
  • 6:old.name||']->['||
  • 7:new.name||']';
  • 8END;
  • 9/
  • SQL>updatetestsetname='bbb'whereid=1;
  • 1rowupdated
  • SQL>selectid,name,descriptionfromtest;
  • IDNAMEDESCRIPTION
  • -----------------------------------------------------------------------
  • 1bbbchangename[aaa]->[bbb]
  • MySQL:原有行用old表示,新行用new表示

    CREATETRIGGERtrigger_test_update
  • BEFOREUPDATEONtest
  • setnew.description=concat('changename[',
  • old.name,']->[',new.name,']');
  • mysql>updatetestsetname='bbb'whereid=1;
  • Rowsmatched:1Changed:1Warnings:0
  • mysql>selectid,descriptionfromtest;
  • +----+------+-------------------------+
  • |id|name|description|
  • |1|bbb|changename[aaa]->[bbb]|
  • 6,其它一些语法、函数上的区别

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

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

    Oracle:sysdate指代系统时间

    MySQL:sysdate()指代系统时间

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    • 推荐文章
        热点阅读