數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)
ORACLE數(shù)據(jù)庫轉(zhuǎn)MySQL數(shù)據(jù)庫遇到的坑 總結(jié)
?
最近在做Oracle轉(zhuǎn)mysql的工程,遇到的坑是真的多,尤其是存儲過程,以前都沒接觸過類似的知識,最近也差不多轉(zhuǎn)完了就總結(jié)一下。希望能幫到一些人(包括以後的自己)~
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';
?
函數(shù):
oracle:? nvl
msyql: ifnull
?
字符串的拼接:
oracle:? str1 || str2
mysql: concat(stra,str2)
數(shù)據(jù)類型的轉(zhuǎn)換:
oracle:? varchar2? -->? msyql:? varchar
2> 分頁
oracle中使用rownum: 需要注意的是oracle的下標(biāo)從1開始,mysql的下標(biāo)從0開始
select t.* from (SELECT rownum rn ,?a.seqid??from test a?order by a.seqid?) t
where rn >= 5 and rn <= 10? ?#表示取結(jié)果集中的第5到第10條記錄
mysql中使用limit關(guān)鍵字
select? seqid from test limit 4,6;? ?#表示從下標(biāo)4開始,查詢后6條記錄
?
?
3> %rowtype? ??%rowtype是oracle中獨(dú)有的關(guān)鍵字
oracle:? ???v_test test@%rowtype;?
v_test.name = 'zhangsan';
解析:test為一張已存在的表的表名,表示聲明一個包含test表中所有字段的變量,並且這個變量的類型會自動和表數(shù)據(jù)類型保持一致。後期使用的時候只需要 用 v_test.字段名就可以了。 假如test表中有name字段,那麼可以使用 v_test.name 去使用。
msyql :? 在mysql中實(shí)現(xiàn)%rowtype的辦法是根據(jù)當(dāng)前表創(chuàng)建一張臨時表,並且定義臨時表中需要使用到的字段對應(yīng)的變量。
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
);??
-- 這裡創(chuàng)建表之後會自動將一條數(shù)據(jù)存儲新的臨時表中。
select name into t_name from test_temp;? -- 將臨時表中的數(shù)據(jù)放入臨時變量中,有多個的時候使用逗號分開, 例如: select name, seqid into t_name,t_seqid from test_temp;
之後就可以直接使用 t_name 變量去代替 v_test.name了。
如果後期還有別的存儲過程需要用到臨時表,則需要將變量數(shù)據(jù)重新update到臨時表中。
eg:? update test_temp set name= t_name;
?
? 如果oracle在存儲過程里調(diào)用的存儲過程的入?yún)⒅惺褂?了 tablename%rowtype, msyql對應(yīng)的解決辦法可以只講對應(yīng)的表的臨時表的主鍵作為入?yún)魅?#xff0c;然後同樣定義臨時表中的變量去接收臨時表中的值。
?oracle:? ?procedure autoFillSysCol(v_test in test%rowtype)
msyql實(shí)現(xiàn)示範(fàn): (假定seqid是test 表中的唯一標(biāo)識)
? ? ? ? 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臨時表已經(jīng)創(chuàng)建后被調(diào)用的。
到這裡就可以直接使用t_seqid,t_name變量了。。。 如果有更改t_seqid、t_name的操作,需要update test_temp表中的數(shù)據(jù)
?
4> return關(guān)鍵字
oracle:結(jié)束存儲過程可以直接使用return關(guān)鍵字
mysql: 需要先定義一個標(biāo)籤,然後使用LEAVE關(guān)鍵字
使用示範(fàn):??
oracle:
beginif t_name is null thenreturn;end if;-- 其他操作endmsyql:
endproc_tag: beginif t_name is null thenLEAVE endproc_tag;end if; end
?
5> 時間類型的轉(zhuǎn)換
oracle:?to_char(sysdate,'yyyyMMddHH24mmss')
msyql:?date_format(now(),'%Y%m%d%H%i%s')
?
6> 日期的計(jì)算
ORACLE日期相加或者相減:?getdate('2018-08-08')+365)??getdate('2018-08-08')-365)?
msyql日期相加或者相減:adddate('2018-08-08',365)? ??adddate('2018-08-08',-365)? #後面的值為正數(shù)的時候表示相加,為負(fù)數(shù)的時候表示相減
?
7> 垮庫使用表:在當(dāng)前存儲過程中使用到其他數(shù)據(jù)庫中的表
oracle: 可以直接使用 表名@數(shù)據(jù)庫名? ,不需要做什麼配置,直接 dblink就可以了
mysql: 需要修改配置文件,更改數(shù)據(jù)庫引擎: InnoDB -->?federated ,然後建立需要引用表的對應(yīng)臨時表 再去使用
8> 存儲過程中調(diào)用存儲過程
oracle:? 直接在存儲過程中寫存儲過程名,例如:? newRegCust()
msyql: 需要添加個call關(guān)鍵字,例如: call newRegCust()
?
9> number(p,s)
oracle: 表示最多可以有p位數(shù),小數(shù)位占s為,整數(shù)位為 p-s. 例如: number(20,6) ,表示最多有20位,小數(shù)位為4位,整數(shù)位為16位。
msyql:numeric(p,s) 和oracle同理
10> 入?yún)⒑统鰠⒌亩x
oracle:需要定義入?yún)⒑统鰠?,格式: ( i_opt in varchar2,o_status out varchar2)
mysql: 出參可以不用定義,也會有結(jié)果集返回。 格式: (in i_opt varchar(255))? ?#這裡要注意,要指定varchar的長度,不然會出錯~
轉(zhuǎn)載于:https://www.cnblogs.com/DFX339/p/9441919.html
總結(jié)
以上是生活随笔為你收集整理的數據庫ORACLE轉MYSQL存儲過程遇到的坑~(總結)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SHA256算法可逆吗,SHA256算法
- 下一篇: 前端现在到底需要什么样的人才