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:

    begin
      if t_name is null then
      return;
      end if;
      -- 其他操作
    end

    msyql:

endproc_tag:
begin
if t_name is null then
LEAVE 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的長度,不然會出錯~

  

數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)的更多相关文章

  1. Csharp:操作存儲過程輸出參數,和返回值

    /// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...

  2. SQL存儲過程的調試方法

    1.在vs2010调试存储过程步骤如下:(要點:連接登陸賬號的權限必須是管理員,才能單步調試,否則只能直接執行存儲過程:[因此,此方式適合數據庫和vs裝在同一台電腦上]) 1.1首先,打开vs,点击 ...

  3. 簡單SQL存儲過程實例

    簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...

  4. sql server存儲過程語法

    -- 变量的声明,sql里面声明变量时必须在变量前加@符号    DECLARE @I INT -- 变量的赋值,变量赋值时变量前必须加set    SET @I = 30 -- 声明多个变量    ...

  5. MS SQLSERVER 存儲過程與緩存

    提升SQL Server最具性能的一个方面就是存储过程,SQL Server具备执行计划的缓存功能,以便计划重用.SQL Server2000增强了ad-hoc执行计划的缓存功能,就处理存储过程上性能 ...

  6. SQL使用存儲過程訪問不同服務器

    用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...

  7. Nhibernate/Hibernate 使用多参数存儲過程 出現could not execute query,Could not locate named parameter等錯誤解決

    <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns=" ...

  8. 在Android中afinal框架下實現sqlite數據庫版本升級的辦法

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫.   pub ...

  9. Scrapy——將數據保存到MySQL數據庫

    Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...

随机推荐

  1. AD中设置PCB线间距

    Design->Rules->Electrical->Clearance->Clearance

  2. 大数据新手之路三:安装Kafka

    Ubuntu16.04+Kafka1.0.0 1.下载kafka_2.11-1.0.0.tgz http://kafka.apache.org/downloads 2.解压到/usr/local/ka ...

  3. (转)基于C#的socket编程的TCP异步实现

    一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法 ...

  4. (转)C# 的 String.CompareTo、 Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...

  5. toad 快捷键大全

    现在在企业中,操作oracle数据库的客户端,除了PL/SQL外,使用的较多的就是TOAD了!toad记得F9执行全部sql和Ctrl + Enter执行选中sql就行了,有啥需要的再查吧.快捷设置在 ...

  6. 雷林鹏分享:C# 字符串(String)

    C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的 ...

  7. LeetCode--434--字符串中的单词数

    问题描述: 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符. 请注意,你可以假定字符串里不包括任何不可打印的字符. 示例: 输入: "Hello, my name is Joh ...

  8. codeforces 848B Rooter's Song 思维题

    http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...

  9. 7 selenium 模块

    selenium 模块 一.简介 1.Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. 2.自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接 ...

  10. Selenium-WebDriverApi接口详解

    浏览器操作 # 刷新 driver.refresh() # 前进 driver.forward() # 后退 driver.back() 获取标签元素 # 通过ID定位目标元素 driver.find ...