日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/10 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 數據庫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

總結

以上是生活随笔為你收集整理的數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。