问题一:ORA-25156:旧样式的外部联接(+)不能与 ANSI链接一起使用
由于sql的部分改动导致了上面的问题,其实是由于之前sql中使用了一下外连接方法
AND a.C_FUNDACCO = b.c_fundacco(+)
所以新增的sql中,left join也要改成使用这种连表方式(表逗号分隔,where后面关联条件和上面一样写)
参考:http://t.zoukankan.com/alphajuns-p-12216971.html
问题二:ora-00979:不是group by 表达式
group by函数 和case when 或者decode的函数结合使用导致的结果,后面发现oracle中应该是不能智能识别decode的书写顺序(开发过程中遇见的这个问题,举个简单的例子)
比如:
-- 如果入参类型为1:按名称排序,取名称的字段值;
--如果入参类型不为1:按年龄排序,取年龄的字段值
-- 错误sql如下:
select decode(type,2,t.age,1,t.name,t.age) from tuser t
group by t.l_rowid,decode(type,1,t.name,t.age)
-- 正确sql:
select decode(type,1,t.name,t.age) from tuser t
group by t.l_rowid,decode(type,1,t.name,t.age)
问题三:ORA-01861: 文字与格式字符串不匹配
在数据库中利用两个日期的相差月份计算年龄时报了这个错误
错误语法:
trunc(months_between(to_date(sysdate,'yyyyMMdd'),to_date(19960522,'yyyyMMdd'))/12,0)
解释:1、因为sysdate的格式是2021/7/8 0:27:01这样的,无法直接转为日期格式,需要使用to_char先转一遍,如下
to_char(sysdate,'yyyyMMdd')
2、由于19960522是我的表字段,且这个字段是非必填的,很可能设置值的时候会为一个空格(’ '),to_date入参如果为空格也会报错,所以这里用decode做了优化
正确语法:
trunc(months_between(to_date(to_char(sysdate,'yyyyMMdd'),'yyyyMMdd'),to_date(decode(t.c_birthday,' ',to_char(sysdate,'yyyyMMdd'),0,to_char(sysdate,'yyyyMMdd'),t.c_birthday),'yyyyMMdd'))/12,0)