Oracle與MySQL遷移語法相容

2021-09-24 14:54:12 字數 3836 閱讀 1423

最近專案上使用oracle的系統,需要相容mysql,原本使用到的sql語法需要修改以相容到mysql。先記錄下目前遇到的問題,後續會繼續更新。

1,oracle nvl()

這個函式用的比較多,功能就是從兩個表示式返回乙個非 null 值,

mysql:ifnull(expr1,expr2),也有相同功能

如果第乙個引數的表示式 expression 為 null,則返回第二個引數的備用值。

2,oracle 中日期格式化

oracle中常用to_char(),to_date()這兩個函式,mysql中有對應的函式

date_format(date,'%y-%m-%d') -------------->oracle中的to_char();

str_to_date(date,'%y-%m-%d') -------------->oracle中的to_date();

另外日期格式的表示式也不相同

%y:代表4位的年份

%y:代表2為的年份

%m:代表月, 格式為(01……12)

%c:代表月, 格式為(1……12)

%d:代表月份中的天數,格式為(00……31)

%e:代表月份中的天數, 格式為(0……31)

%h:代表小時,格式為(00……23)

%k:代表小時,格式為(0……23)

%h:代表小時,格式為(01……12)

%i: 代表小時,格式為(01……12)

%l:代表小時,格式為(1……12)

%i: 代表分鐘, 格式為(00……59)

%r:代表 時間,格式為12 小時(hh:mm:ss [ap]m)

%t:代表 時間,格式為24 小時(hh:mm:ss)

%s:代表 秒,格式為(00……59)

3,oracle 日期時間的計算,後一天,上個月之類的

mysql中計算,正數表示往後,負數往前計算

select date_add('2013-01-29 13:50:27', interval 1 day);

-> '2013-01-30 13:50:27'

select date_add('2013-01-29 13:50:27', interval 1 hour);

-> '2013-01-29 14:50:27'

select date_add('2013-01-29 13:50:27', interval 1 month);

-> '2013-02-28 13:50:27'

4,oracle字串拼接

oracle中常用 『||』進行字段拼接,而在mysql中用concat()拼接,返回結果為連線引數產生的字串。

5,oracle 的decode

在oracle中使用decode方法可以輕鬆實現**和值之間的轉換,mysql中沒有直接的方法可以使用,但是我們可以通過下面兩種方法來實現:

1.case when then

如:select title,case emergency when 1 then '緊急' else '普通' end as emergency from already_sig

2.if

如:select a.title,if(a.emergency=1,'緊急','普通')emergency from already_sign a

6,oracle with as

with as短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義乙個sql片斷,該sql片斷會被整個sql語句所用到。有的時候,是為了讓sql語句的可讀性更高些,也有可能是在union all的不同部分,作為提供資料的部分。

特別對於union all比較有用。因為union all的每個部分可能相同,但是如果每個部分都去執行一遍的話,則成本太高,所以可以使用with as短語,則只要執行一遍即可。如果with as短語所定義的表名被呼叫兩次以上,則優化器會自動將with as短語所獲取的資料放入乙個temp表裡,如果只是被呼叫一次,則不會。而提示materialize則是強制將with as短語裡的資料放入乙個全域性臨時表裡。很多查詢通過這種方法都可以提高速度。

mysql的做法就是把查詢結果放到乙個臨時表

create temporary table tmp_table select * from table_name;
臨時表中就儲存了臨時資料。當斷開連線時,臨時表自動刪除。

臨時表使用有一些限制條件:

1,臨時表在 memory、myisam、merge或者innodb上使用,並且不支援mysql cluster簇);

show tables語句不會列出臨時表,在information_schema中也不存在臨時表資訊;show create table可以檢視臨時表;

2,不能使用rename來重新命名臨時表。但是可以alter table rename代替:

mysql>alter table orig_name rename new_name;

3,可以複製臨時表得到乙個新的臨時表,如:

mysql>create temporary table new_table select * from old_table;

4,同乙個query語句中,相同的臨時表只能出現一次。但不同的臨時表可以出現在同乙個query語句中,如臨時表temp_tb1, temp_tb2

可以使用:mysql> select * from temp_tb;

但不能使用:mysql> select * from temp_tb, temp_tb as t;

錯誤資訊: error 1137 (hy000): can』t reopen table: 『temp_tb』

5,臨時表可以手動刪除:

drop temporary table if exists temp_tb;

7,oracle dblink

oracle 通過dblink實現跨庫訪問,

mysql 用federated就是我們說的dblink類似的功能。遠端對映。

engine=federated   connection='mysql:';

8,oracle 字段型別轉換,to_char,to_number

mysql中提供了兩個內建函式提供我們使用分別為:cast和convert,mysql 的cast()和convert() 函式可用來轉換或者獲取乙個我們需要的型別。兩者具體的語法如下:

cast(value as type);

convert(value, type);

可以轉換的型別是有限制的。這個型別可以是以下值其中的乙個:

二進位制,同帶binary字首的效果 : binary

字元型,可帶引數 : char()

日期 : date

日期時間型 : datetime

浮點數 : decimal

整數 : signed

無符號整數 : unsigned

9,oracle 產生隨機數和隨機字串,dbms_random.value

oracle中產生隨機數:

mysql中產生隨機數的方法:

oracle與mysql之間文字遷移

文字遷移相對來說比sql的insert into 快得多,下面來說一下關於兩者之間的遷移 oracle mysql oracle 匯出 sqluldr ods ods query select from t stdname info field record 0x0a charset utf 8 s...

Oracle與Oracle的SQL操作語句

oracle 也是一種資料庫管理系統 儲存結構分類 邏輯儲存結構,物理儲存結構 邏輯儲存結構 資料塊 資料塊是oracle邏輯儲存結構的最小邏輯結構,乙個資料塊對應乙個或多個物理塊,資料塊的結構包括塊頭和儲存區的兩個部分 塊頭包括 資料塊標題,表目錄,行目錄 儲存區 自由空間,行資料 資料區 資料區...

Oracle遷移到MySQL總結

日期 2012 06 01 字型 大中小 這兩個星期裡一直都在忙於一件事兒,就是oracle資料庫的遷移問題。沒有做的時候感覺這是一件十分輕鬆的事兒,可是等到實實在在去做去實現的時候,自己傻眼了。這種糾結啊,在這裡先說下遇到的問題 1。資料庫的表結構問題 資料型別不同需要解決varchar2 var...