MySQL和Oracle对比之存储过程

昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些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

时间: 2024-10-23 08:54:20

MySQL和Oracle对比之存储过程的相关文章

MySQL和Oracle对比学习之数据字典元数据

MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的. 毕竟学习的主线是MySQL,所以会从MySQL的角度来对比Oracle的一些功能.大体总结了以下的内容,欢迎大家拍砖,查看当前的数据库名mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | test         | +------------+ 1 row in set (0.00 sec) +++

MySQL和Oracle对比学习之事务

MySQL中的存储引擎很是丰富,常用的有InnoDB,MyISAM等,也查看了不少的资料,基本也有所了解,从一些参考书中看MySQL中的sql部分也是一扫而过,感觉和Oracle中的sql部分没有大的区别. 因为InnoDB和MyISAM存储引擎的一个主要区别就是对于事务的支持,所以自己也复制了oracle中的想法. 简单做了两个测试,只是想练手试一下,结果测试让我很意外. 我创建了两个表myisam_test和innodb_test,做一个insert操作,然后rollback,按照预期的想法

MySQL和Oracle行值表达式对比(r11笔记第74天)

行值表达式也叫作行值构造器,在很多SQL使用场景中会看到它的身影,一般是通过in的方式出现,但是在MySQL和Oracle有什么不同之处呢.我们做几个简单的测试来说明一下. MySQL 5.6,5.7版本的差别 首先我们看一下MySQL 5.6, 5.7版本中的差别,在这一方面还是值得说道说道的. 我们创建一个表users,然后就模拟同样的语句在不同版本的差别所在. 在MySQL 5.6版本中. create table users( userid int(11) unsigned not nu

由一条create语句的问题对比mysql和oracle中的date差别

今天开发的同事提交过来一个sql变更,在部署的时候发现了一个问题. 语句是一个简单的create语句 CREATE TABLE `test_user` (   `openid` varchar(64) NOT NULL,   `amount` varchar(11) DEFAULT 0,   `create_time` datetime DEFAULT CURRENT_TIMESTAMP,   `update_time` datetime DEFAULT CURRENT_TIMESTAMP,  

MySQL和Oracle中的delete,truncate对比

在MySQL和Oracle中的delete,truncate还是存在着一些差别,明白了这些差别可能对于处理问题,理解问题会有一些帮助. 我们来简单通过一些测试来说明.我们创建两个表test_del,test_tru来对比delete,truncate的操作.我们有一个临时表t_fund_info大概有几百万的数据量. 创建test_del > create table test_del select *from t_fund_info; Query OK, 1998067 rows affect

简单对比MySQL和Oracle中的一个sql解析细节

SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析..一大堆看起来很理论的东东,不过看起来枯燥之余,它们的价值也更加明显. 借用一下网络中的原话:如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的"世界上最厉害的程序员", Sun的JAVA之父, 贝尔实验室的C++之父 起点提得有些高了,今天和大家分享的案例是一个很简单的sq

MySQL和Oracle中的半连接测试总结(一)

SQL中的半连接在MySQL和Oracle还是存在一些差距,从测试的情况来看,Oracle的处理要更加全面. 首先我们来看看在MySQL中怎么测试,对于MySQL方面的测试也参考了不少海翔兄的博客文章,自己也完整的按照他的测试思路练习了一遍. 首先创建下面的表: create table users( userid int(11) unsigned not null, user_name varchar(64) default null, primary key(userid) )engine=

用PHP连mysql和oracle数据库性能比较

mysql|oracle|比较|数据|数据库|性能 用PHP连mysql和oracle数据库性能比较 测试硬件说明:测试使用的是我的爱机,配置如下:CPU:C433内存:128M硬盘:酷鱼2代20G 测试软件说明:WIN32下用的是windows nt server4,sp5,apache 1.3.12,php3.0.15和php4rc1,mysql 3.22.29,oracle 8.0.5linux下用的是bluepoint linux1.0, apache 1.3.12, php4rc1,m

mysql树形结构查询(存储过程)

就用数据数据库表地址数据(中国地区)来说吧(用Windows请使用gbk !!) 可直接运行(去除注解) 存储过程: DELIMITER //drop procedure if exists findLChild///* iid 递归父节点 , layer 允许递归深度 */CREATE PROCEDURE findLChild(iid bigint(20),layer bigint(20))BEGIN /*创建接受查询的临时表 */ create temporary table if not