帮客户创建视图,要求:1、新建视图;2、新建用户;3、授权新用户访问该视图。 创建的过程中遇到几个小问题,记录下处理方法
客户提供的SQL
--已脱敏
select human.fnumber,
human.fname_l2,
pxk.humangree.fenrolldate,
pxk.humangree.fgraduatedate,
pxk.humangree.fgraduateschool,
pxk.humangree.fspecialty,
pxk.humangree.fstudylength,
pxk.BDSpecialtyType.Fname_L2,
pxk.uateTyp.Fname_L2,
pxk.T_HRDiploma.Fname_L2,
pxk.T_HRDegree.Fname_L2,
pxk.T_HRDiplomaModality.Fname_L2,
pxk.humangree.fdegreenumber,
pxk.humangree.fdegreecountrystr,
pxk.humangree.fdegreeunit,
decode(pxk.humangree.fishighworkdip, 0, '是', 1, '否') as asd1,
decode(pxk.humangree.cfgscrxl, 1, '是', 0, '否') as ffdl,
pxk.humangree.fremark_L2
from pxk.human
left join pxk.humangree
on pxk.human.Fid = pxk.humangree.Fpersonid
left join pxk.BDSpecialtyType
on pxk.BDSpecialtyType.Fid = pxk.humangree.fspecialtytype
left join pxk.uateTyp
on pxk.humangree.Fgraduatetype = pxk.uateTyp.Fid
left join pxk.T_HRDiploma
on pxk.T_HRDiploma.Fid = pxk.humangree.Fdiploma
left join pxk.T_HRDegree
on pxk.T_HRDegree.Fid = pxk.humangree.fdegree
left join pxk.T_HRDiplomaModality
on pxk.T_HRDiplomaModality.Fid = pxk.humangree.fdiplomamodality where rownum <2;
意思是缺少右括号,错误提示定位到 decode(pxk.humangree.fishighworkdip, 0, ‘是’, 1, ‘否’) as asd1 这一行,检查后发现前后并没有缺失括号。
果然就不报错了,那么问题很明显就出在decode这两行上
又检查了下decode的写法,没问题 尝试用case when 改写也是报错
怀疑是中文字符问题,尝试将中文是否改为YES NO,不再报错
decode(pxk.humangree.fishighworkdip, 0, ‘YES’, 1, ‘NO’)
另外根据网上查询的一些信息测试,只有单一中文字符才报错,改为"是的" "不是"也不会报错
decode(pxk.humangree.fishighworkdip, 0, ‘是的’, 1, ‘不是’)
这个问题非常奇怪,怀疑是bug导致,但是并没有查询到关于这个问题的记录
生产环境是11.2.0.4,在19c测试的目的就是看看19c是否还有该问题,结果依然存在该问题
在同事的帮助下终于解决,方法就是修改CRT的字符集编码,原先为UTF-8,改为GB2312
重复的列名,查询的sql中确实有不同表的相同列名
pxk.BDSpecialtyType.Fname_L2,
pxk.uateTyp.Fname_L2,
pxk.T_HRDiploma.Fname_L2,
pxk.T_HRDegree.Fname_L2,
pxk.T_HRDiplomaModality.Fname_L2,
给这些列加别名 as XXX