Oracle中存储过程迁移到Mysql的问题集锦

1.关于字符串拼接问题?

例如Oracle中某段字符创拼接如下:

 v_str := substr(v_resource_ids,
                    1,
                    instr(v_resource_ids, ',' || resource_id || ',')) ||
             substr(v_resource_ids,
                    instr(v_resource_ids, ',' || resource_id || ',') +
                    length(',' || resource_id || ','));

那么到Mysql中修改为如下就OK了;

 set v_str = concat_ws(substr(v_resource_ids,
                    1,
                    instr(v_resource_ids, concat_ws(',' , resource_id , ','))) ,
             substr(v_resource_ids,
                    instr(v_resource_ids, concat_ws(',' , resource_id , ',')) +
                    length(concat_ws(',' , resource_id , ','))));

注释:

使用方法:
CONCAT(str1,str2,…)  

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

使用方法: 
CONCAT_WS(separator,str1,str2,...)

CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
注意:
如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。

详细解释请参照博客:http://blog.163.com/yang_jianli/blog/static/16199000620110135214700/

2.关于显示记录的行数问题?

在Oracle中这样表示即可:

       SELECT nsrsbh
       from ctais_dj_nsrxx
       where rownum < 40
       order by nsrsbh asc;

在Mysql中如下表示即可:

       select nsrsbh
        from ctais_dj_nsrxx 
        where @num < 40
        order by nsrsbh asc;

3.关于返回值的问题?

在Oracle中如下表示

ret_str :='';
     if fpmxdzstr is null then
        ret_str:='';
        return;
     end if;
       v_temp :=fpmxdzstr;

在Mysql中这样表示

lable:begin
     set ret_str ='';
     if fpmxdzstr is null then
        set ret_str ='';
        leave lable;
     end if;
       set v_temp :=fpmxdzstr;
end lable;

注释:

也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码

关于存储过程不错的博客:http://blog.csdn.net/lpz283929516/article/details/4386258

4.关于循环的问题?

例如在Oracle中循环用 while ...loop...end loop

在Mysql中则用while...do...end while

注释:参考博客:http://blog.sina.com.cn/s/blog_4f925fc30100mw2l.html

5.关于Oracle中的序列的问题?

在oracle中有序列,但在mysql中没有序列,怎么办?

 BEGIN
declare t_id varchar(100);

set t_id = substr((select max(id) from report_compare_list),8);

select t_id;
END

6.关于删除语句的表别名问题?

在oracle中删除一条语句的时候,我可以给表起别名,如下所示:

delete from ABC a where a.id=id;

在MySQL中删除一条语句的时候,不能给表起别名,否则会出错,语句如下:

delete from ABC  where id=i.id;

如果想给表起别名也可以,如下书写

deletea from ABC a where a.id=id;

7.关于if...else...elsif...end if问题?

在Oracle中:if...else...elsif...end if

在MySQL中:if...else...elseif...end if

8.关于now(),sysdate问题?

在oracle中获取当前时间用sysdate

在mysql中获取当前时间用now()


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页