Oracle与MySQL的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 | Varchar2(n) | varchar(n) | |
3 | Date | DATATIME | 日期字段的处理 MYSQL日期字段分DATE和TIME两种,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 > 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语法说明 |
|
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; |