- 浏览: 95040 次
- 性别:
- 来自: 深圳
文章分类
最新评论
oracle移植至mysql相关sql语句
一. 项目已用到 oracle 函数的转换
1. Oracle 中的 TO_DATE ()
示例: select * from admadjustmoney t where t.sendtime> to_date(?,'yyyy-mm-dd hh24:mi:ss') and t.sendtime< to_date(?,'yyyy-mm-dd hh24:mi:ss')
转换后:
SELECT *
FROM `ADMADJUSTMONEY` t
WHERE t.SENDTIME > STR_TO_DATE(sysdate(), '%Y-%m-%d %h:%i:%s') AND
t.SENDTIME < STR_TO_DATE(sysdate(), '%Y-%m-%d %h:%i:%s') 注意表名字段名的大小写 MYSQL 大小写敏感 sql 统一大写 hql 统一小写
2. Oracle 中的 nvl ()
示例 : select distinct a.id,a.parentId,a.description,a.name,a.status, NVL(ur.roleid,'') AS roleid from admrole a left join admuserrole ur on (a.id = ur.roleid and ur.userid = ? and ur.status = 1) where a.status = ?
转换后:
select distinct a.id,a.parentId,a.description,a.name,a.status, IFNULL(ur.roleid,'') AS roleid from admrole a left join admuserrole ur on (a.id = ur.roleid and ur.userid = ? and ur.status = 1) where a.status = ?
3. Oracle 中的 decode ()
示例:
SELECT DECODE(MAX(PIECECODE), NULL, 0, MAX(PIECECODE)) AS PIECECODE FROM PUBPAGEPIECE WHERE 1=1
转换后:
SELECT if(MAX(PIECECODE) IS NULL, 0, MAX(PIECECODE)) AS PIECECODE FROM PUBPAGEPIECE WHERE 1=1
或者用 case when 的标准写法
SELECT
CASE
WHEN MAX(PIECECODE) IS NULL THEN 0
WHEN MAX(PIECECODE) IS NOT NULL THEN MAX(PIECECODE)
END AS PIECECODE
FROM PUBPAGEPIECE WHERE 1=1
4. Oracle 中的 substr ()
示例: WHERE t.aid = v.aid and t.province = v.province and t.city = v.city and t.wid = w.id AND w.startdate>=to_date( substr(?,1,10) ,'yyyy-MM-dd') and w.stopdate<=to_date( substr(?,1,10) ,'yyyy-MM-dd')
转换后:
WHERE t.aid = v.aid and t.province = v.province and t.city = v.city and t.wid = w.id AND w.startdate>= STR_TO_DATE ( substring (?,1,10) , '%Y-%m-%d' ) and w.stopdate<= STR_TO_DATE ( substring (?,1,10) , '%Y-%m-%d' )
5. Oracle 中的 trunc ()
示例:
from PUBCOINOPDETAIL where opervirtualCoin > 0 and status = 1 and operTime >= ADD_MONTHS(TRUNC(SYSDATE,'mm') ,-1) and operTime < TRUNC(SYSDATE,'mm') group by gene , geneType ,accountId
转换后:
from PUBCOINOPDETAIL where opervirtualCoin > 0 and status = 1 and operTime >= DATE_SUB(date_sub(CURDATE(),INTERVAL EXTRACT( day from CURDATE())-1 day),INTERVAL 1 MONTH) [ 上个月第一天 ] and operTime < DATE_SUB(date_sub(CURDATE(),INTERVAL EXTRACT(day from CURDATE())-1 day),INTERVAL 0 MONTH) [ 这个月第一天 ] group by gene , geneType ,accountId
再次提醒 mysql 大小写的问题 sql 统一大写 hql 统一小写 避免不必要的 BUG 出现
二.网络资料附表:oracle 常用函数 与mysql 的对照表 s:mysql o :oracle
1.
绝对值
S:select abs(-1) value
O:select abs(-1) value from dual
2.
取整
(
大
)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from dual
3.
取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from dual
4.
取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from dual
5.
四舍五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from
dual 1.2346
6.e
为底的幂
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from dual
2.71828182
7.
取
e
为底的对数
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value
from dual; 1
8.
取
10
为底对数
S:select log10(10) value 1
O:select log(10,10) value from dual; 1
9.
取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from dual 16
10.
取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from dual 2
11.
求任意数为底的幂
S:select power(3,4) value 81
O:select power(3,4) value from dual 81
12.
取随机数
S:select rand() value
O:select sys.dbms_random.value(0,1)
value from dual;
13.
取符号
S:select sign(-8) value -1
O:select sign(-8) value from dual -1
14.
圆周率
S:SELECT PI() value 3.1415926535897931
O:
不知道
15.sin,cos,tan
参数都以弧度为单位
例如:
select sin(PI()/2) value
得到
1
(
SQLServer
)
16.Asin,Acos,Atan,Atan2 返回弧度
17.
弧度角度互换
(SQLServer
,
Oracle
不知道
)
DEGREES
:弧度
-
〉角度
RADIANS
:角度
-
〉弧度
数值间比较
18.
求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from dual
19.
求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from dual
20.
如何处理
null
值
(F2
中的
null
以
10
代替
)
S:select F1,IFNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
21.
求字符序号
S:select ascii('a') value
O:select ascii('a') value from dual
22.
从序号求字符
S:select char(97) value
O:select chr(97) value from dual
23.
连接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')
33 value from dual
23.
子串位置
--
返回
3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from
dual
23.
模糊子串的位置
--
返回
2,
参数去掉中间
%
则返回
7
S:select patindex('%d%q%','sdsfasdqe')
value
O:oracle
没发现,但是
instr
可以通过第四个参数控制出现次数
select INSTR('sdsfasdqe','sd',1,2) value
from dual
返回
6
24.
求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from
dual
25.
子串代替
返回
aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn')
value
O:SELECT Replace('abcdef', 'bcd',
'ijklmn') value from dual
26.
子串全部替换
S:
没发现
O:select Translate('fasdbfasegas','fa','
我
' ) value from dual
27.
长度
S:len,datalength
O:length
28.
大小写转换
lower,upper
29.
单词首字母大写
S:
没发现
O:select INITCAP('abcd dsaf df') value
from dual
30.
左补空格(
LPAD
的第一个参数为空格则同
space
函数)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from dual
31.
右补空格(
RPAD
的第一个参数为空格则同
space
函数)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from dual
32.
删除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33.
重复字符串
S:select REPLICATE('abcd',2) value
O:
没发现
34.
发音相似性比较
(
这两个单词返回值一样,发音相同
)
S:SELECT SOUNDEX ('Smith'), SOUNDEX
('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX
('Smythe') from dual
SQLServer
中用
SELECT
DIFFERENCE('Smithers', 'Smythers')
比较
soundex
的差
返回
0-4
,
4
为同音,
1
最高
日期函数
35.
系统时间
S:select getdate() value
O:select sysdate value from dual
36.
前后几日
直接与整数相加减
37.
求日期
S:select convert(char(10),getdate(),20)
value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd')
value from dual
38.
求时间
S:select convert(char(8),getdate(),108)
value
O:select to_char(sysdate,'hh24:mm:ss')
value from dual
39.
取日期时间的其他部分
S:DATEPART
和
DATENAME
函数
(第一个参数决定)
O:to_char
函数
第二个参数决定
参数
---------------------------------
下表需要补充
year yy, yyyy
quarter qq, q (
季度
)
month mm, m (m O
无效
)
dayofyear dy, y (O
表星期
)
day dd, d (d O
无效
)
week wk, ww (wk O
无效
)
weekday dw (O
不清楚
)
Hour hh,hh12,hh24 (hh12,hh24 S
无效
)
minute mi, n (n O
无效
)
second ss, s (s O
无效
)
millisecond ms (O
无效
)
----------------------------------------------
40.
当月最后一天
S:
不知道
O:select LAST_DAY(sysdate) value from
dual
41.
本星期的某一天(比如星期日)
S:
不知道
O:SELECT Next_day(sysdate,7) vaule FROM
DUAL;
42.
字符串转时间
S:
可以直接转或者
select
cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05
22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.
求两日期某一部分的差(比如秒)
S:select
datediff(ss,getdate(),getdate()+12.3) value
O:
直接用两个日期相减(比如
d1-d2=12.3
)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.
根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM
DUAL;
45.
求不同时区时间
S:
不知道
O:SELECT New_time(sysdate,'ydt','gmt' )
vaule FROM DUAL;
-----
时区参数
,
北京在东
8
区应该是
Ydt-------
AST ADT
大西洋标准时间
BST BDT
白令海标准时间
CST CDT
中部标准时间
EST EDT
东部标准时间
GMT
格林尼治标准时间
HST HDT
阿拉斯加
?
夏威夷标准时间
MST MDT
山区标准时间
NST
纽芬兰标准时间
PST PDT
太平洋标准时间
YST YDT YUKON
标准时间
移至常见问题
一、数据库环境从oracle 转向mysql 碰到的问题。
因为逻辑不变,所以原则是不改应用程序代码,只改数据库表的创建/ 初始化sql 。下面是我们碰到的问题以及解决办法。
1 、 大小写敏感的区别( 如果服务器 OS 是linux) 。
在oracle 中一般情况下不区分大小写。有时候我们在使用oracle 不注意大小写的问题,表名和字段名不加双引号是不区分大小写的,像这样:insert into tableName 和 insert into TABLENAME 效果是一样的,用工具导出创建/ 数据初始化脚本,得到的结果一般表名和字段名转化成了大写。
但在MySQL 中,所使用操作系统 的大小写敏感性决定了数据库名和表名的大小写敏感性。数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件( 也可能是多个,取决于存储引擎) 。因此,使用数据库或表实际上是操纵这些文件( 夹) ,所以使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。在以linux 为内核的操作系统中是大小写敏感的。
解决的办法是把mysql 的数据库名和oracle 的大小写保持一致,表名与应用程序中sql 字符串中的表名保持一致,如果应用程序中字段名用了双引号,那请把sql 中的字段名大小写与双引号里的字符保持一致。如果你的应用程序所引用的表名、字段没有统一大小写,那麻烦就大了。
2 、保留字的区别。
像sql 语言的函数名( 如:inteval ,show) 等是保留字。Oracle 中保留字是可以作为表名和字段名,并且不影响使用,但mysql 中保留字是不能作为表名和字段名,如果使用会报语法错误。
解决办法,把sql 语句中的保留字用‘`’ 符号引起来,这个符号位于键盘 的tab 键上面; 如果是字段名还有另外一种方法tablename. 字段名。像这样:insert into tablename (id, `interval`) value(….. 或insert into tablename (id, tablename.inteval) value(….. 。
3 、数据类型的区别。
在mysql 中没有像oracle 中的varchar2 、number ,mysql 有与之对应的varchar 、numeric ,当然在oracle 中没有mysql 的time 类型。
解决办法是替换。
4 、自动增长类型的区别。
Oracle 有sequence ,mysql 中没有,但有auto_increment 属性。
解决办法是把Oracle 中sequence 转换成使用auto_increment 属性,某些情况可能还有一种办法可以解决问题,新建一个独立的表用来专门记录自动增长型的数据。
5 、索引长度限制的区别。
从MySQL 4.1.2 开始,MyISAM 和InnoDB 表索引长度支持1000 字节,也就是说索引字段的长度不能超过1000 字节,如果超过会报这样的错:ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 。如果是UTF-8 编码,相当于333 个字符的长度( 因为UTF8 一个字符占3 个字节) 。Oracle 的索引长度限制比mysql 要宽松得多。
解决的办法就不必要多说了,要么改索引的定义,要么改字段的定义长度。
二、为了数据库的兼容性我们应该注意些什么。
数据库的兼容性应该是数据库设计应该重视的一个问题,因为有时候客户存在已经在用的数据库,并且不希望同时维护两个数据库,这样的话兼容多种数据库还能成为产品的一个卖点。
作到数据库的兼容性关键是遵守标准用法。
1 、 遵守标准用法,尽量不使用某种数据库特有的用法。
如msyql 的‘`’ 符号的用法,
再比如,很多人有这种用法,在使用oracle 开发的时候创建sequence ,往表中插数据之前先SELECT seq.nextval FROM DUAL; ,然后把查询得到的值作为value 插入表中,这种用法没法适应没有sequence 的数据库,每个数据库都有自动增长型的用法,如果需要使用就应该完全地使用。
再举个例子,不同的数据库对分页查询作了扩展,postgresql 有offset ,limit ,oracle 就没有。
2 、 避免数据库大小写敏感的问题。
选择数据库表名和字段名采用大写还是小写,并且在数据库的设计和编码过程中完全统一。
3 、 保留字。
要求数据库设计者尽量不使用保留字作表名和字段名。也有很多人有这种用法,在表名和字段名前加‘_’ ,像这样:create table _tablename ( _id integer) 。这样永远不会出现保留字引起的问题
相关推荐
标题中的“JDBC Oracle10G MySql 5.1.57 SqlServer2k 2k5 驱动”表明这是一个关于数据库连接的资源集合,主要包括针对Oracle 10g、MySQL 5.1.57以及SQL Server 2000和2005的Java JDBC驱动程序。这些驱动程序是Java...
这些ODBC驱动在开发中的作用至关重要,它们允许应用程序通过统一的接口与不同数据库进行交互,减少了对特定数据库API的依赖,提高了代码的可移植性。例如,一个使用ODBC的应用程序可以在不修改代码的情况下,只需...
为了实现更复杂的数据操作,如查询、插入、更新和删除,你可以使用ADO.NET提供的SqlCommand对象配合SQL语句来实现。 在开发过程中,确保正确安装并引用了相应的数据库驱动,如Oracle.ManagedDataAccess、MySql.Data...
驱动文件通常是`mysql-connector-java.jar`,添加此文件到项目类路径后,Java应用程序就能与MySQL数据库进行通信,包括创建连接、执行SQL语句、管理事务等。 **JDBC驱动包** JDBC是Java平台的标准接口,它定义了...
SQL Developer是一款免费的集成开发环境(IDE),它提供了全面的数据库管理功能,如查询、编辑、调试SQL语句,以及数据模型设计和数据迁移。它的用户友好界面使得数据库管理员和开发人员能够轻松地处理复杂的数据库...
动软dbhelper类在此基础上提供了类似的功能,例如建立MySQLConnection、执行SQL语句(包括存储过程)、事务处理等,使得开发者能快速集成MySQL到他们的应用程序中。 接着,`DbHelperOra.cs`是专为Oracle数据库设计...
使用`oracle.jdbc.driver.OracleDriver`类,开发者可以编写Java代码来创建Oracle数据库的连接,执行SQL语句并处理结果集。 最后,SQL Server是微软公司提供的一个企业级数据库管理系统,尤其在Windows环境中表现...
在这种情况下,"将数据库中的数据转换成SQL语句"就显得尤为重要,因为它能有效地解决数据移植过程中的版本不兼容问题,提高迁移效率。 SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。...
它实现了Java.sql和javax.sql接口,使得Java开发者可以使用标准的JDBC API来执行SQL语句,管理数据库事务等。下载并添加这个驱动到项目的类路径中,开发者就可以通过Java代码与MySQL数据库进行交互。 SQL Server ...
JDBC JAR包在Java应用中的作用至关重要,它们包含了数据库连接的接口和实现,使得Java程序可以创建数据库连接、执行SQL语句、处理结果集等。开发者在使用时,需要将对应的JDBC驱动加入到项目的类路径中,以便编译和...
其对应的JDBC驱动jar文件(如`mysql-connector-java.jar`)允许Java程序通过JDBC API连接到MySQL数据库,执行SQL语句,进行数据的增删改查操作。在使用时,需要将该jar添加到项目的类路径中,然后通过`Class.forName...
由于Oracle和MySQL的SQL语法略有不同,迁移后可能需要对应用程序中的SQL语句进行修改。这可能涉及到列名的引用方式、SQL函数的使用、事务处理等方面。 总结来说,Oracle向MySQL的迁移是一个涉及广泛的技术任务,...
这些数据库驱动包包含了对应数据库的连接参数、SQL语句解析、结果集处理等功能,它们使得开发者能够使用统一的编程接口(如JDBC)来操作不同类型的数据库,极大地提高了开发效率和代码的可移植性。在实际开发中,...
使用SQL Server JDBC驱动,开发者可以通过`com.microsoft.sqlserver.jdbc.SQLServerDriver`类建立连接,并执行SQL语句。 在实际开发中,为了确保程序的稳定性和兼容性,通常会将这些驱动打包成JAR文件,如压缩包中...
4. 获取Statement或PreparedStatement对象,用于执行SQL语句。 5. 执行查询并处理结果集。 6. 完成操作后,记得关闭连接和其他资源以避免资源泄漏。 在数据库性能优化方面,开发者还可以利用JDBC的连接池功能,比如...
本文将详细介绍标题为"mysql oracle sqlserver数据库jar包大全"的相关知识点,并提供关于Oracle、SQL Server和MySQL数据库连接的实例。 1. JDBC(Java Database Connectivity): JDBC是Java平台的标准接口,由...
2. 查询执行:使用SQL语句(如SELECT、INSERT、UPDATE、DELETE)来检索、插入、更新和删除数据。 3. 参数化查询:防止SQL注入攻击,通过预编译的SQL语句和参数绑定来安全地处理用户输入。 4. 数据转换:将数据库中...
本主题将详细探讨MySQL、SQL Server和Oracle这三种主流数据库的驱动,以及如何使用这些驱动来建立数据库连接。 首先,MySQL是一款开源、免费的关系型数据库管理系统,广泛应用于Web应用。它的驱动通常指的是JDBC...
MySQL的视图在某些方面可能有特定限制,比如SELECT语句的复杂性,这可能影响到从Oracle移植过来的视图的兼容性。在移植过程中,需要检查并调整视图定义以适应MySQL的语法和限制。 6. **移植策略**: - 数据转换:...
总的来说,JDBC为Java开发者提供了一种统一的方式来与不同类型的数据库进行通信,无论是在SQL Server、Oracle还是MySQL环境下,都能通过标准的JDBC API进行数据操作,增强了代码的可移植性和效率。理解并熟练掌握...