oracle存储过程
知识背景
存储过程 是在大型数据库系统中,一组为了完成特定功能的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