MySQL数据库实现Oracle常用函数

一、前言

  随着公司的业务发展,不同类型数据库间的兼容问题也就自然形成了一个必须研究的课题。公司目前使用的是比较传统的SSH框架+Oracle数据库,但在Dao层大量使用自己封装的JDBC,使得原本就兼容多数据库的Hibernate力不从心。原本我是建议改用的MyBatis做持久层的,但是公司大多元老级的人物都不太懂这个技术,直接给否定了,而且只给两周时间将系统给改造完。当初一万个MMP就要脱口而出,后来想着还是直接硬编码改改算了,由此诞生第二方案——硬编码形式将代码中的SQL统一改成标准SQL。由于时间有限也就先将系统改成同时兼容Mysql和Oracle数据库了,先把能转换成标准SQL的语句全转了,不能转换的就从数据库表中读取一个参数(启动程序时放入缓存再从缓存中取出)用来区分数据库类型,再根据数据库类型不同分别写对应的sql语句。为了尽量减少代码的改造量,就将Oracle比较常用的函数在MySQL库中实现。

二、Oracle常用函数转换

1、仿Oracle序列的使用

1/*创建序列表,用于模拟Oracle序列*/ 2DROP TABLE IF EXISTS sequence; 3CREATE TABLE sequence ( 4 name varchar(128) NOT NULL, 5 current_value int(10) NOT NULL, 6 increment int(10) NOT NULL DEFAULT '1', 7 PRIMARY KEY (name) 8) ENGINE=InnoDB DEFAULT CHARSET=utf8; 9 10/*设置序列初始值*/ 11DELIMITER ;; 12DROP FUNCTION IF EXISTS setval;; 13CREATE FUNCTION setval(seq_name VARCHAR(128),val INTEGER) RETURNS INT(11) 14BEGIN 15 UPDATE sequence 16 SET current_value = val 17 WHERE NAME = seq_name; 18 RETURN currval(seq_name); 19END ;; 20DELIMITER ; 21 22/*获取当前序列*/ 23DELIMITER ;; 24DROP FUNCTION IF EXISTS currval;; 25CREATE FUNCTION currval(seq_name VARCHAR(128)) RETURNS INT(11) 26BEGIN 27 DECLARE VALUE INTEGER; 28 SET VALUE = 0; 29 SELECT current_value INTO VALUE 30 FROM sequence 31 WHERE NAME = seq_name; 32 33 RETURN VALUE; 34END ;; 35DELIMITER ; 36 37/*获取下一个序列值*/ 38DELIMITER ;; 39DROP FUNCTION IF EXISTS nextval;; 40CREATE FUNCTION nextval(seq_name VARCHAR(128)) RETURNS INT(11) 41BEGIN 42 UPDATE sequence 43 SET current_value = current_value + increment 44 WHERE NAME = LOWER(seq_name); 45 RETURN currval(LOWER(seq_name)); 46END ;; 47DELIMITER ;

2、仿Oracle获取uuid函数sys_guid()

1DELIMITER ;; 2DROP FUNCTION IF EXISTS sys_guid;; 3CREATE FUNCTION sys_guid() RETURNS VARCHAR(60) CHARSET utf8 4BEGIN 5 RETURN REPLACE(UUID(),'-',''); 6END ;; 7DELIMITER ;

3、仿Oracle中的decode函数(低级版)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS decode;; 3CREATE FUNCTION decode(expr VARCHAR(512),res VARCHAR(512),result1 VARCHAR(512),result2 VARCHAR(512)) RETURNS VARCHAR(512) 4BEGIN 5 DECLARE var_name VARCHAR(512); 6 IF expr = RES THEN 7 SET var_name = result1; 8 ELSE 9 SET var_name = result2; 10 END IF; 11RETURN var_name; 12END ;; 13DELIMITER ;

4、仿Oracle值为空时赋默认值函数:nvl(str,defstr)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS nvl;; 3CREATE FUNCTION nvl(param1 VARCHAR(512),param2 VARCHAR(512)) RETURNS VARCHAR(512) CHARSET utf8 4BEGIN 5 RETURN IF(param1 IS NULL AND param1<>'',param1,param2); 6END ;; 7DELIMITER ;

5、仿Oracle值为空时赋默认值1否则赋默认值2函数:nvl2(str,nulldef,elsedef)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS nvl2;; 3CREATE FUNCTION nvl2(exp1 VARCHAR(512),exp2 VARCHAR(512),exp3 VARCHAR(512)) RETURNS VARCHAR(512) CHARSET utf8 4BEGIN 5 RETURN IF(exp1 IS NULL OR exp1='',exp2,exp3); 6END ;; 7DELIMITER ;

6、仿Oracle字符串转换为数字函数:to_number(str)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS to_number;; 3CREATE FUNCTION to_number(param1 VARCHAR(40)) RETURNS DECIMAL(32,4) 4 BEGIN 5 RETURN CONVERT(param1,DECIMAL(32,4)); 6 END;; 7DELIMITER ;

7、仿Oracle判断某个字符串是否为数字函数:isnumber(str)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS isnumber;; 3CREATE FUNCTION isnumber(c VARCHAR(40)) RETURNS TINYINT(2) 4BEGIN 5 DECLARE v_param INT(10); 6 DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN 0; 7 SET v_param = to_number(c); 8 RETURN 1; 9END ;; 10DELIMITER ;

8、仿Oracle日期格式转字符串函数:to_char(date,format)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS to_char;; 3CREATE FUNCTION to_char(formatdate DATETIME,formate VARCHAR(40)) RETURNS VARCHAR(40) 4BEGIN 5 DECLARE temp VARCHAR(50); 6 SET temp = LOWER(formate); 7 SET temp = REPLACE(temp,'yyyy','%Y'); 8 SET temp = REPLACE(temp,'mm','%m'); 9 SET temp = REPLACE(temp,'dd','%d'); 10 SET temp = REPLACE(temp,'hh24','%H'); 11 SET temp = REPLACE(temp,'mi','%i'); 12 SET temp = REPLACE(temp,'ss','%S'); 13 SET temp = REPLACE(temp,'mon','%c月'); 14 RETURN DATE_FORMAT(formatdate,temp); 15END ;; 16DELIMITER ;

9、仿Oracle日期格式字符串转日期类型函数:to_date(datestr,format)

1DELIMITER ;; 2DROP FUNCTION IF EXISTS to_date;; 3CREATE FUNCTION to_date(formatdate VARCHAR(40),formate VARCHAR(40)) RETURNS VARCHAR(40) 4BEGIN 5 DECLARE temp VARCHAR(50); 6 SET temp = LOWER(formate); 7 SET temp = REPLACE(temp,'yyyy','%Y'); 8 SET temp = REPLACE(temp,'mm','%m'); 9 SET temp = REPLACE(temp,'dd','%d'); 10 SET temp = REPLACE(temp,'hh24','%H'); 11 SET temp = REPLACE(temp,'mi','%i'); 12 SET temp = REPLACE(temp,'ss','%S'); 13 RETURN STR_TO_DATE(formatdate,temp); 14END ;; 15DELIMITER ;

三、编后语

  本文提到的转换函数只是些皮毛而已,还有待今后的工作与学习中进一步完善...

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid