开发者社区> jeanron100> 正文

MySQL和Oracle对比之存储过程

简介: 昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些Oracle中的存储过程到MySQL中来,但是改了一部分的程序,发现MySQL中没法编译了,报了很多的错误。
+关注继续查看
昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些Oracle中的存储过程到MySQL中来,但是改了一部分的程序,发现MySQL中没法编译了,报了很多的错误。
这个问题也比较典型,自己就趁热打铁总结了一下。
因为隐私的关系还有代码长度的关系,我就不罗列代码了。
假设Oracle中的存储过程如下,我们需要改写为MySQL代码:
set serveroutput on
CREATE or replace PROCEDURE test_proc( in_value IN varchar2)
as
 stmt_bz number;
 stmt_dml varchar2(200);
begin
stmt_bz:=100;
stmt_dml:=in_value||' insert into new_test(id,'
    || 'name)'
    || ' values('||stmt_bz||','||''''||stmt_bz||''''||')';
dbms_output.put_line(stmt_dml);
end;


exec test_proc('test');
运行情况如下:
SQL> exec test_proc('test');
test insert into new_test(id,name)values(100,'100')
PL/SQL procedure successfully completed.

看起来逻辑也不复杂,但是要迁移到MySQL中还是有不少的细节需要注意。
delimiter //
DROP PROCEDURE IF EXISTS `test_proc`//
CREATE PROCEDURE test_proc(IN in_value varchar(2000))
begin
  declare stmt_bz int;
  declare stmt_dml varchar(200);
  set stmt_bz=100;
  set stmt_dml=concat(' insert into new_test(id,'
    , 'name)'
    , 'values(',stmt_bz,',','''',stmt_bz,'''',')');
  select  stmt_dml;  
  end
//
delimiter ;
call test_proc('test');
输出结果如下:
mysql> call test_proc('test');
+-------------------------------------------------+
| stmt_dml                                        |
+-------------------------------------------------+
|  insert into new_test(id,name)values(100,'100') |
+-------------------------------------------------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)
第一处是分隔符的问题,delimiter 在MySQL在是可以自行制定的。我们暂定为//
第二处是关于drop procedure和create procedure,在Oracle中就可以直接制定为create or replace procedure
第三处是关于传入参数in_value,字符型传入参数在MySQL中就是varchar(2000),在Oracle就是varchar2 (注意不是varchar2(2000))
第四处是begin的部分,在Oracle中就是as begin来开启的,但是在MySQL就可以直接begin了。
第五处是声明变量在MySQL中就需要逐步声明,declare,但是在Oracle中是作为匿名pl/sql块一样来处理
第六处是变量初始化,在oracle中直接使用stmt_bz:=100; 但是在MySQL中需要用set stmt_bz=100;
第七处是关于字符串拼接,在MySQL中会用concat,在Oracle中可以使用||来拼接。
第八处就是输出变量,MySQL中使用
select  stmt_dml;  直接查询即可,在oracle可以调用dbms_output来输出。
第九处就是调用存储程序,在Oracle中使用exec,call都可以,在MySQL中只能使用call

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28077 0
+关注
jeanron100
Oracle ACE,《Oracle DBA工作笔记》作者 现就职于国内某互联网公司,擅长数据管理,数据迁移,性能优化,目前专注于开源技术,运维自动化和性能优化。
1179
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载