MySQL和Oracle对比之存储过程(r5笔记第7天)
昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些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
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- MyCat------基于java语言的数据库中间件
- Solr技术(附软件分享)
- VSFTPD技术
- Shiro——基于java的安全框架
- 电子圆二色谱(ECD)的理论计算
- 用 80 行 Javascript 代码构建自己的语音助手
- 手把手教你搭建分布式项目环境
- GraphQL两年实战避坑经验
- 基于Dubbo的服务提供者与消费者的发布(在虚拟机中)以及使用nginx对项目进行负载均衡优化
- 我们为什么不使用CSS框架
- java.lang.IllegalArgumentException: node to traverse cannot be null!
- Spring Data Jpa 异常:PropertyReferenceException: No property xxx found for type for type yyy
- Spring全家桶之SpringData——SpringData Redis(附相关jar包)
- Spring全家桶之SpringBoot——初级阶段
- Spring全家桶之SpringBoot——高级阶段