MySQL與Oracle SQL語言差異比較
阿新 • • 發佈:2018-11-05
Oracle與MySQL的SQL語句區別
1資料庫
/*
mysql可以建立資料庫,而oracle沒有這個操作,oracle只能建立例項;
sql資料庫操作:database
格式:
* create database 資料庫名;
* create database 資料庫名 character set 字符集;
*/
CREATE DATABASE j0815_1;
CREATE DATABASE j0815_2 CHARACTER SET utf8;
-檢視資料庫
SHOW DATABASES;
-檢視定義的資料庫
SHOW CREATE DATABASE j0815_1;
-刪除資料庫
DROP DATABASE j0815_1;
-切換資料庫
USE j0815_1;
-檢視正在使用的資料庫:
SELECT database();
2 表
2.1 建立表(異)
/*
mysql:
1、mysql沒有number、varchar2()型別;
2、mysql可以宣告自增長:auto_increment;
3、mysql有double型別;
oracle:
1、oracle沒有double型別、有int型別但多數會用number來代替int;
2、oracle不可以宣告自增長:auto_increment,主鍵自帶自增長;
3、oracle小數只有float型別;
*/
--MySQL:
create TABLE emp(
eno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20) NOT NULL UNIQUE,
job VARCHAR(10) DEFAULT '員工',
mgr INT(10),
hiredate DATE,
comm DOUBLE
);
--Oracle:
create table emp(
empno number(10) primary key ,--主鍵
ename varchar2(20) not null unique,--不能為空,唯一
job varchar2(10) default '匿名',--預設值,用單引號
mgr number(10),
hiredate date,--預設格式DD-MM-YY
sal number(10,2),
comm float,
deptno number(10)
);
2.2 刪除表(異)
/*
MySQL:
DROP TABLE IF EXISTS 表名;
或drop table if exists 表名;
Oracle:
drop table 表名;
注:Oracle沒有if exists關鍵字,也沒用類似if exists的SQL語法。
*/
--MySQL:
DROP TABLE IF EXISTS emp;
drop table if exists emp;
--Oracle:
drop table emp
3 列
3.1 新增列(異)
/*
MySQL:
A. alter table 表名 add column 欄位 資料型別;
B. alter table 表名 add column 欄位1 資料型別, add column 欄位2 資料型別;
注:其中關鍵字column可有可無。
Oracle:
A. alter table 表名 add 欄位 資料型別;
B. alter table 表名 add (欄位 資料型別);
C. alter table 表名 add (欄位1 資料型別, 欄位2 資料型別);
注:對於A,只有新增單列的時候才可使用,對於新增多列時需要使用C,不能像MySQL那樣重複使用add column關鍵字。
*/
--MySQL:
ALTER TABLE emp ADD COLUMN marriage VARCHAR(2);
ALTER TABLE emp ADD marriagedate DATE;
ALTER TABLE emp ADD COLUMN lovename VARCHAR(50), ADD COLUMN loveage INT;
--Oracle:
alter table emp add marriage varchar2(2);
alter table emp add (marriagedate DATE);
alter table emp add (lovename varchar2(50),loveage INT);
desc emp;
3.2 刪除列(異)
/*
MySQL:
A. alter table 表名 drop column 欄位;
B. alter table 表名 drop column 欄位, drop column 欄位;
注:其中關鍵字column可有可無。
Oracle:
A. alter table 表名 drop column 欄位;
B. alter table 表名 drop (欄位);
C. alter table 表名 drop (欄位1,欄位2);
注:對於A,只有刪除單列的時候才可使用,對於刪除多列時需要使用C,不能像MySQL那樣重複使用drop column關鍵字。
*/
--MySQL:
ALTER TABLE emp DROP COLUMN marriage;
ALTER TABLE emp DROP COLUMN marriagedate, DROP COLUMN lovename,DROP COLUMN loveage;
--Oracle:
alter table emp drop column marriage;
alter table emp drop (marriagedate);
alter table emp drop (lovename,loveage);
3.3 修改列名(異)
/*
MySQL:
alter table 表名 change column 原來欄位 新的欄位 欄位型別(必須);
Oracle:
alter table 表名 rename column 原來欄位 to 新的欄位; 注:不能有欄位型別
修改欄位型別:alter table 表名 modify(欄位 資料型別 約束條件);
*/
--MySQL:
ALTER TABLE emp CHANGE COLUMN mgr manager VARCHAR(20);
--Oracle:
alter table emp rename column mgr to manager;
3.4 修改列型別(說明)
/*
Oracle中,在列有資料的時候,無法修改列型別;沒有資料時可以。
alter table 表名 modify(欄位 資料型別 約束條件);
MySQL中,無論列是否有資料都可以修改列型別。
alter table 表名 modify column 欄位名 型別;
但是當有資料時,直接修改列型別都可能對資料造成丟失等,所以一般需要結合具體的業務來對列資料做處理後,再修改列型別型別。所以修改列的型別並非使用SQL語句進行一步到位的修改,而是通過以下流程:
A. 新增臨時列
B. 將需要更改的列的值經過型別轉換的驗證後,賦值給臨時列
C. 刪除原有列
D. 將臨時列的列名修改為原有列列名
*/
--MySQL:
ALTER TABLE emp MODIFY COLUMN manager VARCHAR(20);
--Oracle:
alter table emp modify(manager varchar2(20));
4 索引
/*
在整個資料庫內,MySQL的索引可以同名,也就是說MySQL的索引是表級別的;但是Oracle索引不可以同名,也就是說Oracle的索引是資料庫級別的。
4.1 建立索引(同)
create index indexName on tableName (columnName);
4.2 刪除索引(異)
MySQL:
alter table tableName drop index indexName
Oracle:
drop index indexName
4.3 查詢表的索引(異)
MySQL:
show index from tableName
Oracle:
select index_name, table_name, column_name from user_ind_columns where table_name=' tableName '
*/
5 空字串問題
/*
Oracle中空字串''就是null(也就是說,只有null,沒有空字元),而MySQL是區分null和''的。
對於使用語句:select * from table1 where user_name <> ''來查詢列user_name不為空(不為null且不為空字元)時,Oracle會查不出任何結果,而MySQL可以正常執行。這裡MySQL之所以可以得到正確結果,還因為比較符號<>會先將列為null的內容進行過濾,然後再比較內容是否為空字串。
這就要求一方面,以後在編寫程式碼的時候,儘量保證不會往資料庫插入空字串''這樣的值,要麼保持有資料,要麼保持為null。另外,對於MySQL中已經同時存在Null和''時,所有判斷是否為null或者''的地方改為判斷列的長度是否為0。
*/
MySQL與Oracle SQL語言差異比較
- 資料型別
編號 | ORACLE | MYSQL | 註釋 |
1 | NUMBER | int / DECIMAL | DECIMAL就是NUMBER(10,2)這樣的結構INT就是是NUMBER(10) MYSQL有很多類int型,tinyint mediumint bigint等,不同的int寬度不一樣 |
2 | Varchar2(n) | varchar(n) | |
3 | Date | DATATIME | 日期欄位的處理 MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的系統時間為 SYSDATE, 日期欄位的數學運算公式有很大的不同。MYSQL找到離當前時間7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到離當前時間7天用 DATE_FIELD_NAME >SYSDATE - 7; MYSQL中插入當前時間的幾個函式是:NOW()函式以`'YYYY-MM-DD HH:MM:SS'返回當前的日期時間,可以直接存到DATETIME欄位中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE欄位中。CURTIME()以’HH:MM:SS’的格式返回當前的時間,可以直接存到TIME欄位中。例:insert into tablename (fieldname) values (now()) 而oracle中當前時間是sysdate |
4 | INTEGER | int / INTEGER | Mysql中INTEGER等價於int |
5 | EXCEPTION | SQLEXCEPTION | 詳見<<2009001-eService-O2MG.doc>>中2.5 Mysql異常處理 |
6 | CONSTANT VARCHAR2(1) | mysql中沒有CONSTANT關鍵字 | 從ORACLE遷移到MYSQL,所有CONSTANT常量只能定義成變數 |
7 | TYPE g_grp_cur IS REF CURSOR; | 游標 : mysql中有替代方案 | 詳見<<2009001-eService-O2MG.doc>>中2.2 游標處理 |
8 | TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; | 陣列: mysql中藉助臨時表處理 或者直接寫邏輯到相應的程式碼中, 直接對集合中每個值進行相應的處理 |
詳見<<2009001-eService-O2MG.doc>>中2.4 陣列處理 |
9 | 自動增長的序列 | 自動增長的資料型別 | MYSQL有自動增長的資料型別,插入記錄時不用操作此欄位,會自動獲得資料值。ORACLE沒有自動增長的資料型別,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。 |
10 | NULL | NULL | 空字元的處理 MYSQL的非空欄位也有空的內容,ORACLE裡定義了非空欄位就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導資料的時候會產生錯誤。因此導資料時要對空字元進行判斷,如果為NULL或空字元,需要把它改成一個空格的字串。 |
- 基本語法
編號 | 類別 | ORACLE | MYSQL | 註釋 |
1 | 變數的宣告方式不同 | li_index NUMBER := 0 | DECLARE li_index INTEGER DEFAULT 0 | 1. mysql 使用DECLARE定義區域性變數. 定義變數語法為: DECLARE var_name[,...] type [DEFAULT value] 要給變數提供一個預設值,需要包含一個DEFAULT子句。值可以被指定為一個表示式,不需要為一個常數。如果沒有DEFAULT子句,初始值為NULL。 |
2 | 變數的賦值方式不同 | lv_inputstr := iv_inputstr | SET lv_inputstr = iv_inputstr | 1. oracle變數賦值使用:= mysql 使用賦值使用set關鍵字. 將一個值賦給一個變數時使用"=". |
3 | 跳出(退出)語句不同 | EXIT; | LEAVE procedure name; | 1. oracle: 如果exit語句在迴圈中就退出當前迴圈.如果exit語句不再迴圈中,就退出當前過程或方法. Mysql: 如果leave語句後面跟的是儲存過程名,則退出當前儲存過程. 如果leave語句後面跟的是lable名. 則退出當前lable. |
while 條件 loop exit; end loop; |
label_name:while 條件 do leave label_name; end while label_name; |
|||
4 | 定義遊標 | TYPE g_grp_cur IS REF CURSOR; |
DECLARE cursor_name CURSOR FOR SELECT_statement; | oracle可以先定義遊標,然後給遊標賦值. mysql定義遊標時就需要給遊標賦值. Mysql定義遊標出自 Mysql 5.1 參考手冊20.2.11.1.宣告游標. |
5 | 定義陣列 | TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; | 可以使用臨時表代替oracle陣列, 也可以迴圈拆分字元來替代oracle陣列. | 目前可以使用臨時表來代替oracle陣列. 詳見<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.4 Mysql陣列處理部分 |
6 | 註釋方式不同 | "-- message" 或 "/** …. */" 或"/* …. */" | "-- message" 或 "/* …. */" 或 "#" | mysql註釋來自 MySQL 5.1參考手冊 9.5. 註釋語法, 建議同oracle一樣, 單行用--, 多行/* */ |
7 | 自帶日期時間函式格式不同 | Oracle時間格式:yyyy-MM-dd hh:mi:ss | Mysql時間格式:%Y-%m-%d %H:%i:%s | 1. MYSQL日期欄位分DATE和TIME兩種. ORACLE日期欄位只有DATE,包含年月日時分秒資訊. 2. mysql中取當前系統時間為now()函式,精確到秒. oracle中取當前資料庫的系統時間為SYSDATE, 精確到秒. |
8 | 日期加減 | 當前時間加N天: sysdate+N 當前時間減N天: sysdate-N |
日期相加: date_add(now(), INTERVAL 180 DAY) 日期相減: date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
|
9 | 字串連線符不同 | result := v_int1||v_int2; | set result =concat(v_int1,v_int2); | 1. oracle使用||連線字串,也可以使用concat函式. 但Oracle的concat函式只能連線兩個字串. Mysql使用concat方法連線字串. MySQL的concat函式可以連線一個或者多個字串,如 mysql> select concat('10'); 結果為: 10. mysql> select concat('11','22','33','aa'); 結果為: 112233aa 2. "||"在Mysql是與運算 |
10 | 定義遊標不同 | CURSOR l_bk_cur IS SELECT B.BK_HDR_INT_KEY, B.BK_NUM FROM ES_SR_DTL_VRB A, ES_BK_HDR B WHERE A.BK_HDR_INT_KEY = B.BK_HDR_INT_KEY AND b.BK_STATUS != ES_BK_PKG.g_status_can AND A.SR_HDR_INT_KEY = ii_sr_hdr_int_key; |
DECLARE l_bk_cur CURSOR FOR SELECT B.BK_HDR_INT_KEY, B.BK_NUM FROM ES_SR_DTL_VRB A, ES_BK_HDR B WHERE A.BK_HDR_INT_KEY = B.BK_HDR_INT_KEY AND b.BK_STATUS != ES_BK_PKG.g_status_can AND A.SR_HDR_INT_KEY = ii_sr_hdr_int_key; |
詳見<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.2 Mysql遊標處理部分 |
11 | 事務回滾 | ROLLBACK; | ROLLBACK; | oracle和mysql中使用方法相同 |
12 | GOTO語句 | GOTO check_date; | GOTO check_date; | oracle和mysql中使用方法相同 |
- 函式
編號 | 類別 | ORACLE | MYSQL | 註釋 |
1 | 數字函式 | round(1.23456,4) | round(1.23456,4) | 一樣: ORACLE:select round(1.23456,4) value from dual MYSQL:select round(1.23456,4) value |
2 | abs(-1) | abs(-1) | 功能: 將當前資料取絕對值 用法: oracle和mysql用法一樣 mysql: select abs(-1) value oracle: select abs(-1) value from dual |
|
3 | ceil(-1.001)) | ceiling(-1.001) | 功能: 返回不小於 X 的最小整數 用法: mysqls: select ceiling(-1.001) value oracle: select ceil(-1.001) value from dual |
|
4 | floor(-1.001) | floor(-1.001) | 功能: 返回不大於 X 的最大整數值 用法: mysql: select floor(-1.001) value oracle: select floor(-1.001) value from dual |
|
5 | Max(expr)/Min(expr) | Max(expr)/Min(expr) | 功能:返回 expr 的最小或最大值。MIN() 和 MAX() 可以接受一個字串引數;在這 種情況下,它們將返回最小或最大的字串傳下。 用法: ROACLE: select max(user_int_key) from sd_usr; MYSQL: select max(user_int_key) from sd_usr; |
|
6 | 字串函式 | ascii(str) | ascii(str) | 功能:返回字串 str 最左邊的那個字元的 ASCII 碼值。如果 str 是一個空字串, 那麼返回值為 0。如果 str 是一個 NULL,返回值也是 NULL. 用法: mysql:select ascii('a') value oracle:select ascii('a') value from dual |
7 | CHAR(N,...) | CHAR(N,...) | 功能:CHAR() 以整數型別解釋引數,返回這個整數所代表的 ASCII 碼值給出的字元 組成的字串。NULL 值將被忽略. 用法: mysql:select char(97) value oracle:select chr(97) value from dual |
|
8 | REPLACE(str,from_str,to_str) | REPLACE(str,from_str,to_str) | 功能: 在字串 str 中所有出現的字串 from_str 均被 to_str 替換,然後返回這個字串. 用法: mysql: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value oracle: SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual |
|
9 | INSTR('sdsq','s',2) | INSTR('sdsq','s') | 引數個數不同 ORACLE: select INSTR('sdsq','s',2) value from dual(要求從位置2開始) MYSQL: select INSTR('sdsq','s') value(從預設的位置1開始) |
|
10 | SUBSTR('abcd',2,2) | substring('abcd',2,2) | 函式名稱不同: ORACLE: select substr('abcd',2,2) value from dual MYSQL: select substring('abcd',2,2) value |
|
11 | instr(‘abcdefg’,’ab’) | locate(‘ab’,’abcdefg’) | 函式名稱不同: instr -> locate(注意:locate的子串和總串的位置要互換) ORACLE: SELECT instr('abcdefg', 'ab') VALUE FROM DUAL MYSQL: SELECT locate('ab', 'abcdefg') VALUE |
|
12 | length(str) | char_length() | 函式名稱不同: ORACEL: SELECT length('AAAASDF') VALUE FROM DUAL MYSQL: SELECT char_length('AAAASDF') VALUE |
|
13 | REPLACE('abcdef', 'bcd', 'ijklmn') | REPLACE('abcdef', 'bcd', 'ijklmn') | 一樣: ORACLE: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value from dual MYSQL: SELECT REPLACE('abcdef', 'bcd', 'ijklmn') value |
|
14 | LPAD('abcd',14, '0') | LPAD('abcd',14, '0') | 一樣: ORACLE: select LPAD('abcd',14, '0') value from dual MYSQL: select LPAD('abcd',14, '0') value from dual |
|
15 | UPPER(iv_user_id) | UPPER(iv_user_id) | 一樣: ORACLE: select UPPER(user_id) from sd_usr; MYSQL: select UPPER(user_id) from sd_usr; |
|
16 | LOWER(iv_user_id) | LOWER(iv_user_id) | 一樣: ORACLE: select LOWER(user_id) from sd_usr; MYSQL: select LOWER(user_id) from sd_usr; |
|
17 | 控制流函式 | nvl(u.email_address, 10) | IFNULL(u.email_address, 10) 或 ISNULL(u.email_address) |
函式名稱不同(根據不同的作用進行選擇): ORACLE: select u.email_address, nvl(u.email_address, 10) value from sd_usr u (如果u.email_address=NULl,就在DB中用10替換其值) MYSQL: select u.email_address, IFNULL(u.email_address, 10) value from sd_usr u(如果u.email_address=NULl,顯示結果中是10,而不是在DB中用10替換其值) select u.email_address, ISNULL(u.email_address) value from sd_usr u(如果u.email_address是NULL, 就顯示1<true>,否則就顯示0<false>) |
18 | DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) | 無,請用IF或CASE語句代替. IF語句格式:(expr1,expr2,expr3) |
說明: 1. decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值) 該函式的含義如下: IF 條件=值1 THEN RETURN(翻譯值1) ELSIF 條件=值2 THEN RETURN(翻譯值2) ...... ELSIF 條件=值n THEN RETURN(翻譯值n) ELSE RETURN(預設值) END IF 2. mysql If語法說明 功能: 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字串值,具體情況視其所在 語境而定。 用法: mysql: SELECT IF(1>2,2,3); |
|
19 | 型別轉換函式 | TO_CHAR(SQLCODE) | date_format/ time_format | 函式名稱不同 SQL> select to_char(sysdate,'yyyy-mm-dd') from dual; SQL> select to_char(sysdate,'hh24-mi-ss') from dual; mysql> select date_format(now(),'%Y-%m-%d'); mysql> select time_format(now(),'%H-%i-%S'); |
20 | to_date(str,format) | STR_TO_DATE(str,format) | 函式名稱不同: ORACLE:SELECT to_date('2009-3-6','yyyy-mm-dd') VAULE FROM DUAL MYSQL: SELECT STR_TO_DATE('2004-03-01', '%Y-%m-%d') VAULE |
|
21 | trunc(-1.002) | cast(-1.002 as SIGNED) | 函式名稱不同: TRUNC函式為指定元素而截去的日期值。 ORACLE: select trunc(-1.002) value from dual MYSQL:select cast(-1.002 as SIGNED) value MYSQL: 字符集轉換 : CONVERT(xxx USING gb2312) 型別轉換和SQL Server一樣,就是型別引數有點點不同 : CAST(xxx AS 型別) , CONVERT(xxx,型別),型別必須用下列的型別: 可用的型別 二進位制,同帶binary字首的效果 : BINARY 字元型,可帶引數 : CHAR() 日期 : DATE 時間: TIME 日期時間型 : DATETIME 浮點數 : DECIMAL 整數 : SIGNED 無符號整數 : UNSIGNED |
|
22 | TO_NUMBER(str) | CAST("123" AS SIGNED INTEGER) | 函式名稱不同 ORACLE:SELECT TO_NUMBER('123') AS VALUE FROM DUAL; MYSQL: SELECT CAST("123" AS SIGNED INTEGER) as value; SIGNED INTEGER:帶符號的整形 |
|
23 | 日期函式 | SYSDATE | now() / SYSDATE() | 寫法不同: ORACLE:select SYSDATE value from dual MYSQL:select now() value select sysdate() value |
24 | Next_day(sysdate,7) | 自定義一個函式:F_COMMON_NEXT_DAY(date,int) | 函式名稱不同: ORACLE: SELECT Next_day(sysdate,7) value FROM DUAL MYSQL: SELECT F_COMMON_NEXT_DAY(SYSDATE(), 3) value from DUAL; (3:指星期的索引值)返回的指定的緊接著下一個星期的日期 |
|
25 | ADD_MONTHS(sysdate, 2) | DATE_ADD(sysdate(), interval 2 month) | 函式名稱不同: ORACLE: SELECT ADD_MONTHS(sysdate, 2) as value from DUAL; MYSQL: SELECT DATE_ADD(sysdate(), interval 2 month) as value from DUAL; |
|
26 | 2個日期相減(D1-D2) | DATEDIFF(date1,date2) | 功能: 返回兩個日期之間的天數。 用法: mysql: SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate oracle: 直接用兩個日期相減(比如d1-d2=12.3) |
|
27 | SQL函式 | SQLCODE | MYSQL中沒有對應的函式,但JAVA中SQLException。getErrorCode()函式可以獲取錯誤號 | Oracle內建函式SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤程式碼和錯誤訊息。 MYSQL: 可以從JAVA中得到錯誤程式碼,錯誤狀態和錯誤訊息 |
28 | SQLERRM | MYSQL中沒有對應的函式,但JAVA中SQLException。getMessage()函式可以獲取錯誤訊息 | Oracle內建函式SQLCODE和SQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤程式碼和錯誤訊息。 MYSQL: 可以從JAVA中得到錯誤程式碼,錯誤狀態和錯誤訊息 |
|
29 | SEQ_BK_DTL_OPT_INT_KEY.NEXTVAL | 自動增長列 | 在MYSQL中是自動增長列. 如下方法獲取最新ID: START TRANSACTION; INSERT INTO user(username,password) VALUES (username,MD5(password)); SELECT LAST_INSERT_ID() INTO id; COMMIT; |
|
30 | SUM(enable_flag) | SUM(enable_flag) | 一樣: ORCALE: SELECT SUM(enable_flag) FROM SD_USR; MYSQL: SELECT SUM(enable_flag) FROM SD_USR; |
|
31 | DBMS_OUTPUT.PUT_LINE(SQLCODE) | 在MYSQL中無相應的方法,其作用是在控制檯中列印,用於測試,對遷移無影響。 | dbms_output.put_line每行只能顯示255個字元,超過了就會報錯 |
- 迴圈語句
編號 | 類別 | ORACLE | MYSQL | 註釋 |
1 | IF語句使用不同 | IF iv_weekly_day = 'MON'THEN ii_weekly_day := 'MON'; ELSIF iv_weekly_day = 'TUE' THEN ii_weekly_day := 'TUE'; END IF; |
IF iv_weekly_day = 'MON'THEN set ii_weekly_day = 'MON'; ELSEIF iv_weekly_day = 'TUE' THEN set ii_weekly_day = 'TUE'; END IF; |
1. mysql和oracle除了關鍵字有一個字差別外(ELSEIF/ELSIF),if語句使用起來完全相同. 2. mysql if語句語法: 摘自 MySQL 5.1 參考手冊 20.2.12.1. IF語句 IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF IF實現了一個基本的條件構造。如果search_condition求值為真,相應的SQL語句列表被執行。如果沒有search_condition匹配,在ELSE子句裡的語句列表被執行。statement_list可以包括一個或多個語句。 |
2 | FOR語句不同 | FOR li_cnt IN 0..(ii_role_cnt-1) LOOP SELECT COUNT(*) INTO li_role_ik_cnt FROM SD_ROLE WHERE ROLE_CD = lo_aas_role_upl(li_cnt); IF li_role_ik_cnt = 0 THEN RETURN 'N'; END IF; li_role_ik_cnt := -3; END LOOP; |
loopLable:LOOP IF i > (ii_role_cnt-1) THEN LEAVE looplable; ELSE SELECT COUNT(*) INTO li_role_ik_cnt FROM SD_ROLE WHERE ROLE_CD = 'ADMIN_SUPER'; /*lo_aas_role_upl(li_cnt);*/ IF li_role_ik_cnt = 0 THEN RETURN 'N'; END IF; SET li_role_ik_cnt = -3; SET i = i+1; END IF; END LOOP loopLable; |
1. oracle使用For語句實現迴圈. Mysql使用Loop語句實現迴圈. 2. oracle 使用For…loop關鍵字. Mysql使用loopLable:LOOP實現迴圈. |
3 | while語句不同 | WHILE lv_inputstr IS NOT NULL LOOP ... END LOOP; |
WHILE lv_inputstr IS NOT NULL DO ... END WHILE; |
1. oracle 中使用while語句關鍵字為: while 表示式 loop… end loop; mysql 中使用while語句關鍵字為: while 表示式 do… end while; |
- 儲存過程&Function
編號 | 類別 | ORACLE | MYSQL | 註釋 |
1 | 建立儲存過程語句不同 | create or replace procedure P_ADD_FAC( id_fac_cd IN ES_FAC_UNIT.FAC_CD%TYPE) is |
DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`; create procedure P_ADD_FAC( id_fac_cd varchar(100)) |
1.在建立儲存過程時如果存在同名的儲存過程,會刪除老的儲存過程. oracle使用create or replace. mysql使用先刪除老的儲存過程,然後再建立新的儲存過程. 2. oracle 儲存過程可以定義在package中,也可以定義在Procedures中. 如果定義在包中,一個包中可以包含多個儲存過程和方法.如果定義在Procedures中,儲存過程中不可以定義多個儲存過程. Mysql 儲存過程中不可以定義多個儲存過程. 3. oracle中字串型別可以使用varchar2. Mysql 需要使用varchar 4. Oracle中引數varchar長度不是必須的, Mysql中引數varchar長度是必須的, 比如varchar(100) |
2 | 建立函式語句不同 | CREATE OR REPLACEFUNCTION F_ROLE_FACS_GRP( ii_role_int_key IN SD_ROLE.ROLE_INT_KEY%TYPE ) RETURN VARCHAR2 |
DROP FUNCTION IF EXISTS `SD_ROLE_F_ROLE_FACS_GRP`; CREATE FUNCTION `SD_ROLE_F_ROLE_FACS_GRP`( ii_role_int_key INTEGER(10) ) RETURNS varchar(1000) |
1.在建立函式時如果存在同名的函式,會刪除老的函式. oracle使用create or replace. mysql使用先刪除老的函式,然後再建立新的函式. 2. oracle 函式可以定義在package中,也可以定義在Functions中. 如果定義在包中,一個包中可以包含多個儲存過程和函式.如果定義在Functions中,每個函式只能定義一個函式. Mysql Functions不可以定義多個函式. 3. oracle返回值用return. Mysql返回值用returns. |
3 | 傳入引數寫法不同 | procedure P_ADD_FAC( id_fac_cd IN ES_FAC_UNIT.FAC_CD%TYPE) |
create procedure P_ADD_FAC( (in) id_fac_cd varchar(100)) |
1. oracle儲存過程引數可以定義為表的欄位型別. Mysql儲存過程不支援這種定義方法.需要定義變數的實際型別和長度. 2. oracle 引數型別in/out/inout寫在引數名後面. Mysql 引數型別in/out/inout寫在引數名前面. 3. oracle 引數型別in/out/inout 都必須寫. Mysql 引數型別如果是in,則可以省略. 如果是out或inout則不能省略. 注意: mysql中指定引數為IN, OUT, 或INOUT 只對PROCEDURE是合法的。(FUNCTION引數總是被認為是IN引數) RETURNS字句只能對FUNCTION做指定,對函式而言這是強制的。它用來指定函式的返回型別,而且函式體必須包含一個RETURN value語句。 |
function func_name( gw_id in(out) varchar2 ) |
create function func_name( gw_id varchar(100)) |
|||
4 | 包 |