數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)

ORACLE數據庫轉MySQL數據庫遇到的坑 總結

 

最近在做Oracle轉mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉完了就總結一下。希望能幫到一些人(包括以後的自己)~

1> 基本語法

  變量聲明:

    oracle:   v_cnt varchar2(100) := ' ' ;

    mysql:   DECLARE v_cnt VARCHAR(100) DEFAULT  ' ';

 

  存儲過程聲明:

    oracle:  procedure regNewRecord(i_custno in varchar2(100))

    msyql: create procedure regNewRecord(IN i_custno VARCAHR(100))

 

  賦值:

    oracle:  v_cnt  = 'test';

    mysql:  set  v_cnt = 'test';

 

  函數:

    oracle:  nvl

    msyql: ifnull

 

  字符串的拼接:

    oracle:  str1 || str2

    mysql: concat(stra,str2)

  

  數據類型的轉換:

    oracle:  varchar2  -->  msyql:  varchar

 

2> 分頁

  oracle中使用rownum: 需要注意的是oracle的下標從1開始,mysql的下標從0開始

  select t.* from (SELECT rownum rn , a.seqid  from test a order by a.seqid ) t

  where rn >= 5 and rn <= 10   #表示取結果集中的第5到第10條記錄

  mysql中使用limit關鍵字

  select  seqid from test limit 4,6;   #表示從下標4開始,查詢后6條記錄

 

 

3> %rowtype    %rowtype是oracle中獨有的關鍵字

  oracle:     v_test test@%rowtype; 

       v_test.name = 'zhangsan';

   解析:test為一張已存在的表的表名,表示聲明一個包含test表中所有字段的變量,並且這個變量的類型會自動和表數據類型保持一致。後期使用的時候只需要 用 v_test.字段名就可以了。 假如test表中有name字段,那麼可以使用 v_test.name 去使用。

  msyql :  在mysql中實現%rowtype的辦法是根據當前表創建一張臨時表,並且定義臨時表中需要使用到的字段對應的變量。

  DECLARE t_name varchar(100);  -- 定義臨時表中的臨時變量

  drop table if exists test_temp;

  CREATE TEMPORARY TABLE IF NOT EXISTS test_temp (
    SELECT t.*  FROM test limit 1
  );  

  -- 這裡創建表之後會自動將一條數據存儲新的臨時表中。

  select name into t_name from test_temp;  -- 將臨時表中的數據放入臨時變量中,有多個的時候使用逗號分開, 例如: select name, seqid into t_name,t_seqid from test_temp;

  之後就可以直接使用 t_name 變量去代替 v_test.name了。

  如果後期還有別的存儲過程需要用到臨時表,則需要將變量數據重新update到臨時表中。

  eg:  update test_temp set name= t_name;

  

 

   如果oracle在存儲過程里調用的存儲過程的入參中使用 了 tablename%rowtype, msyql對應的解決辦法可以只講對應的表的臨時表的主鍵作為入參傳入,然後同樣定義臨時表中的變量去接收臨時表中的值。

   oracle:   procedure autoFillSysCol(v_test in test%rowtype)

   msyql實現示範:  (假定seqid是test 表中的唯一標識)

            procedure autoFillSysCol(in v_seqid varchar(100)) 

      DECLARE t_name varchar(100);

      DECLARE t_seqid varchar(100);

      select seqid,name into t_seqid,t_name from test_temp where seqid= v_seqid; #注意,這裡是承接上面的例子,test_temp臨時表已經創建后被調用的。

  到這裡就可以直接使用t_seqid,t_name變量了。。。 如果有更改t_seqid、t_name的操作,需要update test_temp表中的數據

 

4> return關鍵字

  oracle:結束存儲過程可以直接使用return關鍵字

  mysql: 需要先定義一個標籤,然後使用LEAVE關鍵字

  使用示範:      

    oracle:

    beginif  t_name is null thenreturn;end if;-- 其他操作end

    msyql:

endproc_tag:
beginif t_name is null thenLEAVE endproc_tag;end if;
end

  

      

 

5> 時間類型的轉換

  oracle: to_char(sysdate,'yyyyMMddHH24mmss')

  msyql: date_format(now(),'%Y%m%d%H%i%s')

 

6> 日期的計算

  ORACLE日期相加或者相減: getdate('2018-08-08')+365)  getdate('2018-08-08')-365) 

  msyql日期相加或者相減:adddate('2018-08-08',365)    adddate('2018-08-08',-365)  #後面的值為正數的時候表示相加,為負數的時候表示相減

 

7> 垮庫使用表:在當前存儲過程中使用到其他數據庫中的表

  oracle: 可以直接使用 表名@數據庫名  ,不需要做什麼配置,直接 dblink就可以了

  mysql: 需要修改配置文件,更改數據庫引擎: InnoDB --> federated ,然後建立需要引用表的對應臨時表 再去使用

  

8> 存儲過程中調用存儲過程

  oracle:  直接在存儲過程中寫存儲過程名,例如:  newRegCust()

  msyql: 需要添加個call關鍵字,例如: call newRegCust()

 

9> number(p,s)

  oracle: 表示最多可以有p位數,小數位占s為,整數位為 p-s. 例如: number(20,6) ,表示最多有20位,小數位為4位,整數位為16位。

  msyql:numeric(p,s) 和oracle同理

10> 入參和出參的定義

  oracle:需要定義入參和出參 ,格式: ( i_opt in varchar2,o_status out varchar2)

  mysql: 出參可以不用定義,也會有結果集返回。 格式: (in i_opt varchar(255))   #這裡要注意,要指定varchar的長度,不然會出錯~

  

转载于:https://www.cnblogs.com/DFX339/p/9441919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jdbc开启事务_spring jdbc 事务配置

配置WEB.XMLxmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"version"3.0">org.springframework.web.context.ContextLoa…

python 文件指针在文件末尾_python文件操作及seek偏移详解

一、python文件操作中的编码本次测试是基于python 2.7.12 OS:Ubuntu16.04 pycharm环境&#xff0c;以及win7下2.7.12;首先说下汉字在文件中占用的字节数&#xff0c;这个先看以下实验(win7)下 因为linux下不支持gbk&#xff0c;本文不讲utf-8 ,gbk编码具体知识&#xff0c;有…

docker小实战和应用

1运行一个docker 一开始docker进不去&#xff0c;需要去https://hub.docker.com注册一个 2docker info查看信息 3docker run ubuntu echo hello world 查看第一个命令输出 4docker images 查看本地的镜像 5查看开启的容器和没有开启的容器 Docker ps -a 6 docker pull ngi…

java 窗口 单例_java单例模式实现面板切换

本文实例为大家分享了java单例模式实现面板切换的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1、首先介绍一下什么是单例模式&#xff1a;java单例模式是一种常见的设计模式&#xff0c;那么我们先看看懒汉模式&#xff1a;public class Singleton_ {//设为私有方…

java垃圾回收机制_干货:Java 垃圾回收机制

什么是自动垃圾回收&#xff1f;自动垃圾回收是一种在堆内存中找出哪些对象在被使用&#xff0c;还有哪些对象没被使用&#xff0c;并且将后者删掉的机制。所谓使用中的对象(已引用对象)&#xff0c;指的是程序中有指针指向的对象&#xff1b;而未使用中的对象(未引用对象)&…

java项目定时任务_java项目定时任务实现

首先配置spring-context.xml文件在xmlns 下加如下代码xmlns:task"http://www.springframework.org/schema/task"在xsi:schemaLocation里添加如下代码http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.1.xsd还有…

enter power save mode解决

这个问题是什么产生的呢&#xff1f;这是我刚来公司的第三天&#xff0c;公司停电&#xff0c;等重新来电的时候有三台电脑都出现了这个问题。连接显示屏没有反应 遇到这种问题&#xff0c;首先这是主机没有正常启动引起的 1第一步&#xff1a;先插拔下电源&#xff0c;重新启动…

python多线程编程_Python 多线程编程

Thread类classThread:def __init__(self&#xff0c;groupNone&#xff0c;targetNone&#xff0c;nameNone&#xff0c;args()&#xff0c;kwargsNone&#xff0c;*&#xff0c;daemonNone)group&#xff1a;None&#xff0c;为日后扩展 ThreadGroup 类实现而保留。target&…

linux修改网卡名(亲测有效)

1查看网卡ip addr 2cd /etc/sysconfig/network-scripts Ls查看 3mv ifcfg-eno16777736 ifcfg-eth0重命名&#xff0c;然后编辑 最后一行加入IPADDR192.168.30.136 NETMASK255.255.255.0 HWADDR00:0C:29:aa?2f BOOTPROTO改成static 4 vi /etc/default/grub 5 grub2-mkconfig…

java 存储空间_Java中的存储空间类型

在Thinking in java里&#xff0c;列举了Java的六种存储类型1.寄存器编写过汇编程序的应该对寄存器非常熟悉&#xff0c;那时候用的ax&#xff0c;bx&#xff0c;cx&#xff0c;dx等等。寄存器在CPU里面&#xff0c;所以速度特别快&#xff0c;但是数量非常有限。在java中无法直…

读取html文件,让其中的内容和notepad打开这个html的样子一样。

然后我写了个python代码&#xff0c;让其读取这个html文件后&#xff0c;内容和这个一样&#xff1a; htmlfopen(13144815898.html,r,encoding"utf-8") htmlconthtmlf.read() print((htmlcont)) 转载于:https://www.cnblogs.com/www-caiyin-com/p/9447285.html

python默认参数举例_Python中的默认参数实例分析

本文研究的主要是Python中的默认参数的相关内容&#xff0c;具体如下。熟悉C语言的可以知道&#xff0c;C语言中的默认参数是写在函数声明中的&#xff0c;为语法糖&#xff0c;与函数的调用无关&#xff0c;是在函数调用的时候由编译器补齐参数然后进行调用。而Python中的默认…

centos安装ipconfig和telnet命令

1我安装的是mini版的 2首先ipconfig查看不到命令 yum -y install net-tools 解决 3在同事的要求下要安装telnet 首先 rpm -qa telnet-server yum -y install telnet-server rpm -qa telnet yum -y install telnet rpa -qa xinetd yum -y install xinetd 测试 netstat -tnl …

java 对象访问权限_Java面向对象编程之访问控制权限

5. 访问控制权限5.1 类型(4个)privatepublicprotected默认权限5.2 作用private : 私有的&#xff0c;只能类内部访问public &#xff1a; 可以在任何位置访问&#xff0c;类内部访问&#xff0c;对象访问protected: 被本类&#xff0c;和本类的子类访问默认权限&#xff1a;可以…

38. 统计一个整数的二进制表示中bit为1的个数

参考&#xff1a; https://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html 转载于:https://www.cnblogs.com/GrimMjxCl/p/9452667.html

python3.7怎么使用arcpy_从Python到空间分析Arcpy|1.3.7 神啊!救救我之如何处理报错...

今天讲的是关键时候不卡壳的技能&#xff0c;尤其是循环语句中和数据清洗中&#xff0c;先假设一种情况&#xff0c;领导安排你把&#xff0c;某机构给你们的坐标x和y数据列表中的每个元素的x偏移3个单位&#xff0c;假设你现在已经可以掌握相关的内容了&#xff0c;心里想太ea…

dockerfile使用(一)

1mkdir dl Cd dl Touch Dockerfile 2修改配置vi Dockerfile FROM alpine:latest MAINTAINER xbf CMD echo ‘hello docker’ 3 docker build -t hello_docker . 4 docker images 5 docker run hello_docker

java程序设计实验报告册_20145215《Java程序设计》实验一实验报告

实验一 Java开发环境的熟悉实验内容及步骤使用JDK编译、运行简单的Java程序命令行下程序开发&#xff1a;在命令行下建立实验目录&#xff0c;进入该目录后创建exp1目录敲入以下代码&#xff1a;package exp1;import java.util.Scanner;public class Hello{public static void …

异步汇合

//多个异步请求完成后汇总结结果&#xff08;任务执行不区分先后顺序&#xff09; dispatch_queue_t queue dispatch_get_global_queue(0,0); dispatch_group_t group dispatch_group_create(); dispatch_group_async(group, queue, ^{/*任务a */ }); dispatch_group_async(g…

dockfile应用(二)

1创建目录dl2 Cd dl2 Touch dockerfile Touch index,html 2ROM ubuntu MAINTAINER xbf RUN sed -i ‘s/archive.ubuntu.com/mirrors.ustc.edu.cn/g’ /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nginx COPY index.html /var/www/html ENTRYPOINT [&quo…