
查了一下資料,大部分的人做的事都是mysql -> oracle,這比較好解決,畢竟一般來說oracle會比mysql強一點(像是trigger mysql5才有)。當然也是cost和performance的考量啦。最後在builder.com.cn找到一篇『Oracle移植到MySQL注意事项』(作者佚名,很酷)。這篇大致上講了一下兩邊DDL的差別,但實做流程看來還是要自己手工硬幹的。
後來在硬幹的過程中發現好像有個很神的軟體可以做這件事,叫做SQLWays,號稱data、schema、functions、triggers都能轉,而且也支援市面上絕大部分的DBMS(IBM DB2, Oracle, Microsoft SQL Server, Sybase, Informix, MySQL, PostgreSQL, Progress...)。抓下來試用一下,因為他是用ODBC連database,而且我已經硬幹的差不多了,就沒試這部份了。只試用了他的SQL converter。
SQLWays的SQL converter介面蠻簡潔的,就左邊貼source,選source DBMS,右邊選target DMBS,target SQL就跑出來了。
簡單的SQL他應該都可以幫你轉好啦,for example:
SELECT COUNT (NO) FROM BANKINFORM WHERE BANKINFORM.END_TIME >= SYSDATE-7 AND BANKINFORM.BEGIN_TIME <= SYSDATE
經過轉換就會變成:
SELECT COUNT(`NO`) FROM BANKINFORM WHERE BANKINFORM.END_TIME >= CURRENT_TIMESTAMP -7 AND BANKINFORM.BEGIN_TIME <= CURRENT_TIMESTAMP;
但是在用的時候也有發現問題,像是這段code:
SELECT to_char(TIME,'MM/DD') AS TIME, (DEPOSIT-WITHDRAWAL) AS TOTAL,MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO ='49421045' ORDER BY TO_NUMBER(TRANSACTION_ACCT.NO) DESC
他轉出來的丟到mysql client commend會錯誤:
SELECT STR(`TIME`,'MM/DD') `TIME`,(DEPOSIT -WITHDRAWAL) TOTAL,MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO = '49421045' ORDER BY CAST(TRANSACTION_ACCT.`NO` AS unsigned) DESC;
正確的SQL:
SELECT DATE_FORMAT(TIME,'%m/%d') AS "TIME", (DEPOSIT-WITHDRAWAL) AS "TOTAL",MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO ='49421045' ORDER BY CAST(TRANSACTION_ACCT.NO AS SIGNED) DESC
使用上一些要注意的地方:
1.SQL一定要以分號(;)結尾,要不然他會一直說你寫錯,我試好幾次才知道問題在這裡。
2.因為Mysql是case sensitive的,和oracle不同。這在下SQL的時候會發生問題,如果之前大小寫沒統一的話。這是sematic的東西電腦不可能幫你轉,我的作法是把SQL貼到editor直接全部轉大寫再丟到SQLWays的converter去轉。
有空再寫整個porting的心得好了

0 意見:
張貼意見