mysql 开发存储过程的限制

2月 1, 2015 |

前言:

随着阿里去IOE化的大获成功,同时大数据处理的风起云涌,导致MySQL更是越来越受欢迎,很多从oracle或者SQL Server转MySQL的同学会发现MySQL的存储过程是那么的弱小,下面列出我在工作中遇到的一些限制:

一、MySQL的存储过程不支持返回cursor

至少到MySQL 5.6是不支持这个特性的,没有这个特性让MySQL的存储过程功能看上去很鸡肋,很多时候,我们开发存储过程的目的是为了封装复杂的逻辑,比如为了性能,可能我们需要新建内存表来代替MySQL在SQL处理的过程中产生的临时表,因为临时表是不能使用索引的。虽然这个限制让我们不能在程序中使用存储过程来封装逻辑,但是当我们需要执行一些定时的汇总job(比如汇总某天的销售数据)还是能大显身手。

二、MySQL的存储过程中不能使用prepared statement来定义cursor

PREPARE stmt3 FROM 'select * from User where id > ?';
declare c cursor for stmt3;
MySQL根本就没有这样的用法,不过MySQL支持定义cursor时指定变量,假设存储过程声明如下所示:
create procedure xxx(in pId int)...
那么可以这样定义cursor:
declare c cursor for select * User where id> pId;

三、存储过程中定义的变量名和SELECT 语句的列名不能重复

declare a int;
declare c cursor for select a from xxx;
open c;
fetch c into a;
这样会导致a的值一直为NULL。

Posted in: MySQL practise

Comments are closed.