Oracle初识笔记(三)

来源:互联网 发布:智多星造价软件多少钱 编辑:程序博客网 时间:2024/06/06 01:29

初识Oracle数据库,学习中的一些笔记及所遇问题。
这些天学习了Oracle一些基础,开始尝试做查询和一些报表,过程中遇到一个报错卡了很长时间,做个记录。
开始SQL代码如下:
select
a.fnumber 订单号,
c.fnumber || f.fname_l2 物料编码,
c.fname_l2 物料名称,
c.fmodel 规格型号,
cast(b.fprice as real) 单价,
cast(b.fbaseqty as real) 数量,
cast(b.fbaseqty-b.FTotalIssueBaseQty as real) 未执行数,
d.fname_l2 销售组,
e.fname_l2 销售员
from T_SD_SaleOrder a
left join T_SD_SaleOrderEntry b on b.fparentid = a.fid
left join T_BD_Material c on c.fid = b.fmaterialid
left join T_BD_SaleGroup d on d.fid = a.fsalegroupid
left join T_BD_Person e on e.fid = a.fsalepersonid
left join T_BD_AsstAttrValue f on f.fid = b.FAssistPropertyID
where --a.fnumber = 'JXP201705160099'
to_char(a.fbizdate,'YYYY-MM-DD') between '2017-05-01' and '2017-05-31'
and b.fbasestatus != -3
and b.FStorageOrgUnitID = 'ad79fmlWRlahwk9K4KQrZ8znrtQ='--购销
and a.fnumber in (select aa.fnumber from T_SD_SaleOrder aa
join T_SD_SaleOrderEntry bb on bb.fparentid = aa.fid
where bb.fbaseqty - bb.FTotalIssueBaseQty > 0
and bb.fbasestatus = 4)
union
select d.fname_l2 || '合计' 订单号,
'' 物料编码,
'' 物料名称,
'' 规格型号,
'' 单价,
sum(b.fbaseqty) 数量,
sum(b.fbaseqty-b.FTotalIssueBaseQty) 未执行数,
'' 销售组,
'' 销售员
from T_SD_SaleOrder a
left join T_SD_SaleOrderEntry b on b.fparentid = a.fid
left join T_BD_SaleGroup d on d.fid = a.fsalegroupid
where --a.fnumber = 'JXP201705160099'
to_char(a.fbizdate,'YYYY-MM-DD') between '2017-05-01' and '2017-05-31'
and b.fbasestatus != -3
and b.FStorageOrgUnitID = 'ad79fmlWRlahwk9K4KQrZ8znrtQ='--购销
and a.fnumber in (select aa.fnumber from T_SD_SaleOrder aa
join T_SD_SaleOrderEntry bb on bb.fparentid = aa.fid
where bb.fbaseqty - bb.FTotalIssueBaseQty > 0
and bb.fbasestatus = 4)
group by rollup (d.fname_l2)

比较明显,是用union将两个查询拼接成一张表格。

  1. 首先了解了union和union all的用法,后一个语句查询的是合计,所以前面几个字段不需要值,将其设置为空拼接一下,开始在字段前未加N,报错:
    这里写图片描述
    字符集不匹配,在字段前加N ‘,N”是将‘’转换为Unicode编码。
  2. 再加上N解决了字符集不匹配之后执行,结果另报错:
    这里写图片描述
    这次是数据类型不匹配,在Oracle中是用union和union all时相连接的两句sql必须字段数一致、数据类型一致或可以自动转换,对第二句sql的单价字段进行强制转换cast(” as real),到了此时SQL如下:
    select
    a.fnumber 订单号,
    c.fnumber || f.fname_l2 物料编码,
    c.fname_l2 物料名称,
    c.fmodel 规格型号,
    cast(b.fprice as real) 单价,
    cast(b.fbaseqty as real) 数量,
    cast(b.fbaseqty-b.FTotalIssueBaseQty as real) 未执行数,
    d.fname_l2 销售组,
    e.fname_l2 销售员
    from T_SD_SaleOrder a
    left join T_SD_SaleOrderEntry b on b.fparentid = a.fid
    left join T_BD_Material c on c.fid = b.fmaterialid
    left join T_BD_SaleGroup d on d.fid = a.fsalegroupid
    left join T_BD_Person e on e.fid = a.fsalepersonid
    left join T_BD_AsstAttrValue f on f.fid = b.FAssistPropertyID
    where --a.fnumber = 'JXP201705160099'
    to_char(a.fbizdate,'YYYY-MM-DD') between '2017-05-01' and '2017-05-31'
    and b.fbasestatus != -3
    and b.FStorageOrgUnitID = 'ad79fmlWRlahwk9K4KQrZ8znrtQ='--购销
    and a.fnumber in (select aa.fnumber from T_SD_SaleOrder aa
    join T_SD_SaleOrderEntry bb on bb.fparentid = aa.fid
    where bb.fbaseqty - bb.FTotalIssueBaseQty > 0
    and bb.fbasestatus = 4)
    union
    select d.fname_l2 || '合计' 订单号,
    N'' 物料编码,
    N'' 物料名称,
    N'' 规格型号,
    cast ('' as real) 单价,
    sum(b.fbaseqty) 数量,
    sum(b.fbaseqty-b.FTotalIssueBaseQty) 未执行数,
    N'' 销售组,
    N'' 销售员
    from T_SD_SaleOrder a
    left join T_SD_SaleOrderEntry b on b.fparentid = a.fid
    left join T_BD_SaleGroup d on d.fid = a.fsalegroupid
    where --a.fnumber = 'JXP201705160099'
    to_char(a.fbizdate,'YYYY-MM-DD') between '2017-05-01' and '2017-05-31'
    and b.fbasestatus != -3
    and b.FStorageOrgUnitID = 'ad79fmlWRlahwk9K4KQrZ8znrtQ='--购销
    and a.fnumber in (select aa.fnumber from T_SD_SaleOrder aa
    join T_SD_SaleOrderEntry bb on bb.fparentid = aa.fid
    where bb.fbaseqty - bb.FTotalIssueBaseQty > 0
    and bb.fbasestatus = 4)
    group by rollup (d.fname_l2)

  3. 仔细检查语句之后未发现错误然后执行仍然报错:
    这里写图片描述
    期间网上搜索了大量资料,只是了解到00600是oracle自带的BUG,中间还查找到两个类似的报错,解决方法都是修改相应的参数设置,但是却未找到有关qerixGetKey:optdesc的解决方法,其中也修改了几个参数都不起作用。之后加了几个ORACLE相关的技术QQ群,在一阵请教咨询之后,终于在一个群里得到了解决:
    alter session set "_disable_function_based_index" = false;
    (关闭连接失效,下次连接查询需要重新设置)
    也是修改了一个参数设置,ORACLE官方文档说会影响性能,需谨慎使用。

  4. 关于参数设置:
    alter session 是会话级别,关闭连接即失效;
    alter system 是系统级别,对所有会话生效;
    有些参数的改变会影响系统性能,甚至会造成很严重的影响,需要谨慎使用。

总结:

ORA-00600是ORACLE自带的BUG问题,报错可以通过升级补丁或者修改相应的参数设置解决;
qerixGetKey:optdesc是oracle在使用函数索引中引起的问题,具体机理不清楚。。。。

原创粉丝点击