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

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

  1. mysql存儲過程_Mysql存儲過程 | 學步園

    一.創建存儲過程 在創建存儲過程之前,首先要了解delimiter 分界符,默認sql 語句分界符是 ; 分號,但為了寫較長的存儲過程,需要將默認分割符修改掉,建議修改為 //,如此之後,sql 語句 ...

  2. mysql的to 打印_如何在MySQL存儲過程中模擬打印

    I have a MySQL stored procedure with a few cursors. I want to print a value to send output back to t ...

  3. mysql 存儲過程調用_mysql-VS2010+MYSQL 存儲過程調用出錯

    VS2010+MYSQL, 連接字符串 server=**.***.***.**; user id=*; password=*; database=*; pooling=false;charset=g ...

  4. mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據

    I have a simple form that sends (via php) some variables to a mySql database. 我有一個簡單的表單,通過PHP發送一些變量到 ...

  5. oracle cur notfound,%notfound的理解——oracle存儲過程 | 學步園

    文檔中的解釋:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO ...

  6. 利用存儲過程進行簡繁體轉換

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GB2BIG]') and xtype in (N'FN ...

  7. oracle区号,Oracle 存儲過程

    1.创建和删除存储过程 创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限.该权限可由系统管理员授予.创建一个存储过程的基本语句如下: CREAT ...

  8. 實現193.5轉為一百玖拾叁元五角的存儲過程

    一: /******************************************************** 作者:(birdie_7761@cmmail.com) 版本:1.0 创建时间 ...

  9. 簡單SQL存儲過程實例

    实例1:仅仅返回单一记录集的存储过程. 银行存款表(bankMoney)的内容例如以下 Id userID Sex Money 001 Zhangsan 男 30 002 Wangwu 男 50 00 ...

最新文章

  1. html用JQuery自定义表单验证。
  2. android 源码下载编译
  3. python中的路径问题汇总
  4. twisted.internet.error.TimeoutError错误的解决方法
  5. ExtJS专题-TreePanel(1)
  6. Linux中移动,复制,删除,打包排除某个目录或文件
  7. git安装后设置用户名和密码
  8. 深入出不来nodejs源码-从fs.stat方法来看node架构
  9. 关于ORA-00257问题的解决(归档程序错误)
  10. 【Windows】Mathpix Snip-公式神器
  11. 暗黑复制服务器物品,暗黑2战网环境下复制dupe物品装备
  12. 程序设计综合实践——京东管理系统(C语言实现)
  13. magic2怎样升级HarmonyOS,鸿蒙2.0怎么升级 华为鸿蒙新系统升级方法步骤
  14. 关于Unknown property ' ' on class 的解决
  15. 什么情况下JVM内存中的一个对象会被垃圾回收
  16. MySQL 5.7.20 Group Relication(组复制)搭建手册
  17. matlab repmat(,matlab中 repmat([1:N]',[1,2]),p)什么意思?
  18. ssm整合redis和mysql_ssm整合redis - 开源中国首席碉堡了的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. js中的定时器 setTimeout()和setInterval() (保姆级教程)
  20. latex 箭头上带_LaTeX技巧931: 让你的公式带上箭头指示

热门文章

  1. CSS 相对|绝对(relative/absolute)定位系列(三)
  2. c语言八个方向迷宫课程设计,【精品资料最新版】C语言课程设计-迷宫游戏.doc...
  3. (理论)数据库建模三步骤:概念模型-逻辑模型-物理模型
  4. 基本卷-动态卷性能测评(未完待续)
  5. hihocoder offer收割编程练习赛8 B 拆字游戏
  6. Notes of the scrum meeting(2013/10/23)
  7. Linux文件系统中的链接
  8. springboot : Failed to decode downloaded font 和 OTS parsing error
  9. vue-js 特殊变量$event常识
  10. String 字符串去除特殊字符和空格,正则表达式使用,%1$s