1. 程式人生 > >MySQL與Oracle SQL語言差異比較

MySQL與Oracle SQL語言差異比較

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 Varchar2n varchar(n)  
3 Date DATATIME 日期欄位的處理
MYSQL日期欄位分DATETIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的系統時間為 SYSDATE, 
精確到秒,或者用字串轉換成日期型函式TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)-- 24小時:分鐘:的格式YYYY-MM-DD HH24:MI:SS TO_DATE()還有很多種日期格式可以參看ORACLE DOC.日期型欄位轉換成字串函式TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期欄位的數學運算公式有很大的不同。MYSQL找到離當前時間7天用DATE_FIELD_NAME  SUBDATENOW(),INTERVAL 7 DAYORACLE找到離當前時間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 MysqlINTEGER等價於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裡定義了非空欄位就不容許有空的內容。按MYSQLNOT 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) 一樣:
ORACLEselect round(1.23456,4) value from dual
MYSQL
:select round(1.23456,4) value
2 abs(-1) abs(-1) 功能將當前資料取絕對值
用法
: oraclemysql用法一樣
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 lengthstr 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_addressNULL, 就顯示1<true>,否則就顯示0<false>
18 DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) 無,請用IFCASE語句代替.
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;
否則返回值則為 expr3IF() 的返回值為數字值或字串值,具體情況視其所在
語境而定。
用法

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內建函式SQLCODESQLERRM是特別用在OTHERS處理器中,分別用來返回Oracle的錯誤程式碼和錯誤訊息。
MYSQL: 可以從JAVA中得到錯誤程式碼,錯誤狀態和錯誤訊息
28 SQLERRM MYSQL中沒有對應的函式,但JAVA中SQLException。getMessage()函式可以獲取錯誤訊息 Oracle內建函式SQLCODESQLERRM是特別用在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%TYPEis
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 varchar100))
4