知识背景

存储过程 是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

​ 最近有个需求是将oracle版本的存储过程转换为mysql版本的存储过程,专门查询了两种数据库存储过程的差别,这里记录下来,方便之后的查看。

oracle版本

从user表中查询出name的值,更新到新表new_user 对应的字段。

//创建存储过程
CREATE OR REPLACE 
PROCEDURE newdata AS
BEGIN
declare
	  //定义变量
      str_1 varchar2(4000);
begin
   //循环遍历
   for row_aaa in (select id from new_user t ) loop
   //初始化
    str_1:='';
BEGIN
//buffer不受限制	
DBMS_OUTPUT.ENABLE(buffer_size => null); 
//执行查询语句
select  kk into str_1 from
	(select  name ||'' KK                           
	 from( select name as name from user
	where  id = new_id ) WHERE ROWNUM < 2 ); 
	//打印输出结果
	dbms_output.put_line(str_1 );
	update new_user set name = str_1 where id = new_id;
//抛出异常
EXCEPTION WHEN NO_DATA_FOUND THEN
	str_21 := '';
	update new_user set name = str_1  where id = new_id ;
commit;	
end;			 
END;
mysql版本

从user表中查询出name的值,更新到新表new_user 对应的字段。

//创建存储过程
DROP PROCEDURE IF EXISTS `newdata`;				
DELIMITER ;;
CREATE PROCEDURE `newdata`()
BEGIN
	//声明变量,用于循环状态的标识
	 DECLARE done INT DEFAULT FALSE;
	 declare str_1 TEXT;
	 declare new_id TEXT;
	 DECLARE cur_list CURSOR FOR select id from new_user t;
	 //抛出异常
	 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
	 set str_1 ='';
	 //打开游标
	 OPEN cur_list;
	 read_loop : LOOP
	 //赋值操作
		FETCH cur_list INTO new_id;
		//控制循环
		IF done THEN
            LEAVE read_loop;
        END IF;		
			select  kk into str_1 from
			(select  name ||'' KK                           
	 			from( select name as name from user
				where  id = new_id ) WHERE ROWNUM < 2 )dm; 

if str_1  is not null THEN
		update new_user set name = str_1 where id = new_id;
		commit;			
end if;
	//重置游标 当查询结果为空时,程序继续执行
	SET done = false;   
	set str_1 = null;
	 END LOOP read_loop;
	CLOSE cur_list ;
END ;;
DELIMITER;-- 游标结束
//调用存储过程
CALL newdata();

oracle和mysql在存储过程的语法上有差别,在改写过程中,发现执行的效率也是很大,oracle版本的速度很快,mysql执行的速度差了较多。

oracle与mysql存储过程的区别

  • 1、字符串数据类型 oracle :varchar2类型, mysql : varchar类型
  • 2、输出结果 oracle:dbms_output.put_line(str_1 ); mysql :select str_1
  • 3、存储过程创建 oracle :create or replace procedure mysql : drop if exists procedure ; create procedure
  • 4、返回值 oracle: return mysql:returns
  • 5、退出 oracle :方法和存储过程都可以使用return mysql:存储过程使用LEAVE 退出,方法退出可以使用return

博客来源

【1】https://www.cnblogs.com/linyuansun/p/10818753.html