Oracle迁移postgreSQL部分问题解决方案

    “去IOE化"理念最早是由阿里巴巴提出。具体就是要把公司里IBM服务器、Oracle数据库、EMC存储都替换掉,
更换为开源或国产化的选项,postgreSQL 对Oracle兼容性比较好。

1.当前时间 oracle的sysdate

处理方法:未开启事务时用now()替换,一般项目也是没有事务的。在事务中用到sysdate时,建议用clock_timestamp()替换。

例子

select sysdate from dual   等价于  select now()

2.序列 oracle的SEQNAME.NEXTVAL

处理方法:pg的NEXTVAL('SEQNAME')等效于SEQNAME.NEXTVAL
pg还提供了其他几种处理序列的方法currval('SEQNAME')  输出sequence的当前值 setval('SEQNAME')   设置sequence将要输出的下一个值

例子

select SEQNAME.NEXTVAL from dual 等价于 NEXTVAL('SEQNAME')

3.虚表 oracle的from dual

处理方法:直接去掉

4.空值处理函数 Oracle的nvl

处理方法: NVL可以用COALESCE函数替换

例子

select nvl(null,0) from dual 等价于 select COALESCE(null,0)

5.空值处理函数 Oracle的nvl2

处理方法:select nvl2(列名,1,0) from dual 等价于 select case when 列名 is null then 0 else 1   ------用case when 解决

例子

select nvl2(null,1,0) from dual 等价于 select case when null is null then 0 else 1 end

6.自动类型转换

pg不支持强自动类型转换 解决方法 使用
方法1:cast(列名 as 类型)或者
方法2:列名::类型    来转换
类型问题多集中在字符和数字之间
pg支持弱自动转换 比如  numeric和integer,smallint,bigint之间是可以自动转换的。text和character之间的转换

例子 字符和数字之间的转换解决方案

select * from  tb_hello where '1'=1
等价于
select * from  tb_hello where cast('1' as integer)=1
select * from  tb_hello where '1' :: integer=1

7.INSTR函数 字符查找函数

Oracle的instr()有两种表达格式
格式一:instr( string1, string2 )    // instr(源字符串, 目标字符串)格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )   // instr(源字符串, 目标字符串, 起始位置, 匹配序号)对于格式1
处理方法  直接用strpos替换对于格式2
处理方法  重写一个函数instr来处理(百度搜一下)

例子

select instr('hello','l') from dual 等价于
select strpos('hello','l')

8.substr() 截取字符函数

oracle的substr()有两种格式
格式1: substr(string string, int a, int b);##从字符串的第a位开始截取b个字符形成新字符串
格式2:substr(string string, int a) ;对于格式1:
如果a>0 那么可以直接替换为substring()
如果a=0 那么替换为1
如果小于0  处理就比较麻烦 下面会给出具体处理办法。对于格式2:
直接替换为substring()

例子

格式1(a>0)和a=0的情况   --格式2情况就不讲解了
select substr('hello',0,2) from dual   ##截取字符第一位开始2位 返回截取的字符
select substr('hello',1,2) from dual   ##截取字符第一位开始2位 返回截取的字符  两者结果一致
等价于
select substring('hello',1,2)
select substr('hello',1,2)对于a<0的情况
select substr('hello',-a,2) from dual ##oracle从字符串倒数定位字符,所以意思就是从str倒数第一位开始截取2位组成字符串
解决方法:
select substring('hello',CHAR_LENGTH('hello')-a+2,2) ##具体意思自己理解

9.连接

oracle的连接可以简写为(+)
解决办法:替换为join   口诀:那个表的字段后(+) 那么就left join 那个表。

例子

select a.id,b.namefrom tb_hello a,tb_hi bwhere a.id=b.id(+)
等价于
select a.id,b.namefrom tb_hello aleft join tb_hi b on a.id=b.id

10,层次查询(递归)

oracle的start with connect by 函数实现层次查询  对于下表sr_menu给出递归查询在oracle和pg的实现
id | parent |  title  | recursion_level
----+--------+---------+-----------------1 |        | level 0 |               12 |      1 | level 1 |               23 |      1 | level 1 |               24 |      1 | level 1 |               25 |      3 | level 2 |               3解决:pg中使用WITH RECURSIVE语句实现递归

例子(对于上面的sr_menu表给的例子)

oracle 写法:select * from sr_menu          ##需要查询的列。start with id = 1            ##查询初始条件connect by prior id = parent;      ##递归条件pgsql 写法:WITH RECURSIVE a AS (SELECT id, parent, titleFROM sr_menuWHERE id = 1               ##查询初始条件UNION ALLSELECT d.id, d.parent, d.titleFROM sr_menu dJOIN a ON a.id = d.parent )   ##递归条件SELECT * FROM a;                 ##需要查询的列。

11.数据库对象大小写

oracel  不区分大小写
pgsql   大小写区分 创建数据库对象时要小写,这样才不区分SQL的大小写

12.ROWNUM虚列

oracle会为每个表默认生成一个虚列ROWNUM,pg不会。
在我们使用ROWNUM一般分2种情况
1.限制结果集数量,用于翻页等    处理方法为 limit关键字
2.生成行号                   处理方法为 用ROW_NUMBER() OVER()来生成行号

例子

对于第一种情况select *  from  tb_hello  where rownum <=10
替换为
select *  from  tb_hello  where 1=1 limit 10    ##注意limit只能用在where条件结束之后第二种情况
select *,rownum from tb_hello
替换为
select *,ROW_NUMBER() OVER() as rownum from tb_hello

13.DECODE等判断函数

语法:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) ##当条件的值为值1时,返回返回值1,为值2时 返回返回值2......
oracle的decode类似java的case语句
所以在pg中也是用case when语句来实现替换

例子

select decode(X,A,B,C,D,E)from dual
等价于
select case X when A then B when C then D else E end 

14.to_char()

to_char()在oracle中几乎可以满足任何入参转换
在pg中却不同,举例说明

例子

select to_char('hello') oracle可行,pg报错  ##pg不能转换字符类型
解决: 1,重写to_char()函数 支持入参为字符串   2.使用cast()替换to_char()select to_char(1111)   oracle可行 ,pg报错  ##pg转换数值型时必须接上精度
解决
select to_char(1111,'fm99999')

15.to_date()

to_date()函数
oracle:to_date('','YYYYMMDD')只能匹配'20200102'
'yyyy/MM/dd'和'yyyy-MM-dd'匹配所有三种时间格式字符串('20200304','2020-03-04',2020/03/04')
pg:pgsql的to_date()函数格式要求严格一些,‘yyyyMMdd’匹配‘2020-01-03’和‘20200103’ 。 ‘yyyy/MM/dd’匹配‘2020-01-03’和 ‘2020/01/03’  。 ‘yyyy-MM-dd' 匹配  ‘2020-01-03’和 ‘2020/01/03’  。   

16.NULL和''

ORACLE认为''等同于NULL
pg认为NULL和''不同
关于null和''解决可以用case when或者COALESCE来处理oracle的 LENGTH('')为NULL
pg的LENGTH('')为0oracle的TO_DATE('','YYYYMMDD')为空
pg的TO_DATE('','YYYYMMDD')为0001-01-01 BCoracle的TO_NUMBER('',1)为NULL
pg的TO_NUMBER('',1),报错

18.ADD_MONTHS(DATE,INT)

oracle的ADD_MONTHS(DATE,INT) 指在给定的时间戳上增加或减少固定个月份
解决方法 1.创建add_month(date,int)函数  2.用- interval关键字解决

例子

select add_months(sysdate,1) from dual
等价于
select now() -interval '1 month'

19.子查询别名

oracle 子查询可以没有别名
select * from (
select * from tb_b_dim_latn_all);
或者
select * from (
select * from tb_b_dim_latn_all);
pg 必须写别名
select * from (
select * from tb_b_dim_latn_all) t;

20.查询当前登陆用户

SELECT USER FROM DUAL  ##oracle
select current_user    ##pg

21.MINUS 取差集

##orace
MINUS语句:返回两个结果集的差(即从左查询中返回右查询没有找到的所有非重复值)。##pg
EXCEPT 返回两个结果集的差(即从左查询中返回右查询没有找到的所有非重复值)

例子

select 1,2,3 from dual
MINUS
select 1,2,3 from dual
等价于
select 1,2,3
EXCEPT
select 1,2,3 

扩展

pg中INTERSECT 返回 两个结果集的交集(即两个查询都返回的所有非重复值)。union返回两个结果集的并集。

22.update语句

uodate 语句 在pg中尽量不要别名,oracle可以使用别名。在pg使用别名会报错

例子

update tb_hello t
set t.hello_id=1           ##在oracle可以,在pg会报错。

23.分组连接函数和group by连用(列转行)

oracle中wmsys.wm_concat(列)默认拼接逗号LISTAGG()和wmsys.wm_concat(列)类似
解决办法
pg中提供三个函数解决string_agg(列,‘,’  order by 列)来替换wmsys.wm_concat()函数array_agg()来替换LISTAGG()函数。同时pg还提供了xml_agg()函数。

例子

select id,wmsys.wm_concat(name)from tb_hello group by id等价于
select id,string_agg(name,',' order by name)from tb_hellogroup by id

【Oracle】去IOE(IBM服务器,Oracle,EMC存储),Oracle迁移postgreSQL部分问题解决方案相关推荐

  1. 中国企业去除oracle,去IOE浪潮之下,Oracle再次大规模裁员,企业全面上云成大趋势...

    原标题:去IOE浪潮之下,Oracle再次大规模裁员,企业全面"上云"成大趋势 2019年5 月 7 日上午,Oracle对外宣布中国区将进行业务结构调整,裁撤研发中心相关人员约 ...

  2. oracle无法重命名服务器名字,重命名Oracle数据库服务器

    因工作需要准备了一台服务器专门按照oracle数据库,并且服务器上安装了windows 2003操作系统,在安装系统是没有指定计算机名称, 网络改造等情况下,需要修改数据库服务器的名称或者IP地址.这 ...

  3. ibm服务器中文件存储设置,IBMv7000存储服务器双活配置流程

    <IBMv7000存储服务器双活配置流程>由会员分享,可在线阅读,更多相关<IBMv7000存储服务器双活配置流程(20页珍藏版)>请在人人文库网上搜索. 1.v 70 0 0 ...

  4. 【服务器数据恢复】存储之间迁移数据时数据损坏的数据恢复案例

    服务器数据恢复环境&故障: 一台某品牌的存储设备,Windows操作系统.由于业务需求,需要把这台存储设备中的数据迁移到另外一台存储设备中,在迁移数据过程中突然无法读取数据,管理界面报错.管理 ...

  5. 也谈 往emc 存储上迁移

    最近,客户要求从ds4700 到emc 上迁移数据,具体的步骤如下: 关于 emc 的存储的引入: Step1:   等emc 的盘划好以后,开始:   看一下啊原来的lv:   lsvg -l ts ...

  6. 去IOE:去掉“IE”就Ok?

    2009年4月底,Oracle宣布收购Sun.尘埃落定后开始集中全力推动其软硬件集于一身的工程系统(Engineered System,通称"集成系统"),很快成为传统" ...

  7. oracle中间键配置,Oracle Exalogic中间件云服务器简介及产品配置特点(2)

    Oracle Exalogic中间件云服务器 -- 软硬件结合的优化平台 目前,企业所面临的应用挑战大多集中在异构环境.复杂的多层应用以及现有环境的低利用率等.于是,企业开始根据实际业务需求和投资情况 ...

  8. 战略变了 IBM服务器由产品到解决方案的转变

    近日,IBM大中华区硬件系统部在京举办媒体沟通会,出席活动的嘉宾有IBM大中华区硬件系统部服务器解决方案副总裁施东峰.IBM杰出工程师,大中华区硬件系统部首席技术官李永辉.IBM大中华区硬件系统部Li ...

  9. windows重启oracle监听口令,oracle_windows下命令启动oracle监听和服务

    1.检查监听器状态 C:\Users\Administrator>lsnrctl status 2.启动监听程序 C:\Users\Administrator>lsnrctl start ...

最新文章

  1. 目标检测--DSOD: Learning Deeply Supervised Object Detectors from Scratch
  2. 霸气!曝阿里于AI方面取得卓越成绩
  3. 2014年百度之星资格赛第一题Energy Conversion
  4. Linux之scp命令实现远程服务器的文件拷贝
  5. Qt学习笔记-----QListWidget,QTableWidget和QTreeWidget
  6. 渤海发现大油田,证券会提示风险,微博回应流量造假,刘国梁制定史上最严奖惩体系,这就是今天的大新闻。...
  7. 华中科技大学文华学院 CSDN 高校俱乐部成立啦!
  8. 一篇了解什么是Spring AOP
  9. java 类加载器_Java 类加载器
  10. 英特尔推出锐炬Xe MAX独立显卡 可提升AI及视频编码速度
  11. 50道编程小题目之【判断是一年的第几天】
  12. 使用客户端行为来丰富 ASP.NET的DataGrid(转)
  13. 智能美观网速快 有这样的无线路由吗?
  14. vsftpd配置详解
  15. java疯狂讲义精粹第2版_疯狂Java讲义精粹(第2版)(含CD光盘1张)
  16. vue热敏打印机_如何在vue项目中调用打印机,打印指定区域
  17. SendGrid -- Stressful Subject
  18. 一些开发时的用法经验
  19. slideup()和slideDown()方法的使用
  20. miix4linux双系统,联想MIIX4笔记本U盘重装win10系统教程

热门文章

  1. KERNELBASE.dll错误的解决方法
  2. BI家族又添新军 用户该如何选择??
  3. 图像处理程序框架—MFC相关知识点
  4. 用LSTM进行情感分析原理
  5. 怎样才能开通微信公众号留言功能?
  6. 在模拟器上玩儿魅族版的游戏(手机平台版本的游戏)
  7. 基于python的飞机大战游戏设计与实现
  8. 宋佳机器人_丝路电影节|宋佳专访:特殊时期用电影抚慰人心 是很温暖的事
  9. WPF RadioButton 基本使用演示
  10. 第十三届蓝桥杯模拟赛(第二期)试题与题解 C++