ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 5052|回复: 15

[PL/SQL] 帮忙看下这段代码为什么总是报无效的游标,谢谢

[复制链接]
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
发表于 2016-12-28 09:26 | 显示全部楼层 |阅读模式

declare
cursor c_cur1 is
   
    select distinct c.segment1 as productno1
      from BOM_BILL_OF_MATERIALS        a,   ---bom头表
               BOM_INVENTORY_COMPONENTS     b,   ---bom明细
               mtl_system_items_b           c,   ---物料表
               mtl_system_items_b           d,
               bom_operation_sequences      bos, ---工序明细(料品制程明细表)
               bom_operational_routings     bor, ---工艺路线
               BOM_DEPARTMENTs              bd,  ---部门代码对应表
               org_organization_definitions ood
       where a.BILL_SEQUENCE_ID = b.BILL_SEQUENCE_ID      ---清单序号(关键字)无实际含义,类似序列
           and a.ORGANIZATION_ID = c.organization_id        ---组织代码
           and a.ASSEMBLY_ITEM_ID = c.inventory_item_id     ---a.装配件内码 c 料品id
           and a.ORGANIZATION_ID = d.organization_id
           and b.COMPONENT_ITEM_ID = d.inventory_item_id    --- b 构件序号  d 料品id
           and bos.routing_sequence_id = bor.common_routing_sequence_id
           and bor.assembly_item_id = a.ASSEMBLY_ITEM_ID    ---bor 料品id
           and bor.organization_id = a.ORGANIZATION_ID
           and nvl(bor.alternate_routing_designator, 1) = nvl(a.ALTERNATE_BOM_DESIGNATOR, 1)
           and bos.operation_seq_num = b.OPERATION_SEQ_NUM
           and nvl(bos.disable_date, trunc(sysdate) + 1) >= sysdate
           and nvl(operation_type, 1) = 1
           and bos.department_id = bd.department_id
           and a.ORGANIZATION_ID = ood.ORGANIZATION_ID
           and c.segment1 like'5%'  ---半成品
           and b.disable_date is null  
           and b.IMPLEMENTATION_DATE is not null
           ;
           
     
  /**计算半成品成本**/   
      cursor c_cur3(v_productno1 IN mtl_system_items_b.segment1 %type) is
select a.segment1
          ,to_number(listagg(DECODE(a.costs_flag,'SB',a.costs),'') within group (order by DECODE(a.costs_flag,'SB',a.costs))) AS costs_sb
          ,to_number(listagg(DECODE(a.costs_flag,'RG',a.costs),'') within group (order by DECODE(a.costs_flag,'RG',a.costs))) AS costs_rg
  from
(
SELECT msi.segment1
            ,case when br.resource_code like '%-SB' then 'SB' else 'RG' end as costs_flag
            ,sum(v.resource_rate*decode(bors.basis_type, 2, NULL, bors.usage_rate_or_amount))  as costs   -- 成本
      FROM   bom_operational_routings     bor
            ,bom_operation_sequences      bos
            ,bom_operation_resources      bors
            ,bom_sub_operation_resources  bsor
            ,org_organization_definitions ood
            ,mtl_system_items_b           msi
            ,bom_resources                br
            ,bom_resources                br1
            ,bom_departments              bod
            ,cst_resource_costs_v v
      WHERE  bor.routing_sequence_id = bos.routing_sequence_id
      AND    bos.operation_sequence_id = bors.operation_sequence_id
      AND    bors.operation_sequence_id = bsor.operation_sequence_id(+)
      AND    bors.substitute_group_num = bsor.substitute_group_num(+)
      AND    bor.organization_id = ood.organization_id
      AND    bor.assembly_item_id = msi.inventory_item_id
      AND    bor.organization_id = msi.organization_id
      AND    bors.resource_id = br.resource_id
      AND    bsor.resource_id = br1.resource_id(+)
      AND    bos.department_id = bod.department_id
      AND    V.resource_id = BORS.RESOURCE_ID
      AND    nvl(bos.effectivity_date, SYSDATE - 1) < SYSDATE
      AND    nvl(bos.disable_date, SYSDATE + 1) > SYSDATE
      AND    bor.organization_id = 84
      AND    msi.segment1 = v_productno1
GROUP BY msi.segment1,case when br.resource_code like '%-SB' then 'SB' else 'RG' end
) a
group by a.segment1
;
    row_semi_product c_cur3%rowtype;
   
     BEGIN
/**将半成品的成本数据插入新建的临时表semi_product_costs**/
   
   FOR r_cur1 IN c_cur1 LOOP
      
  
      
       FOR r_cur3 IN c_cur3(r_cur1.productno1) loop
         fetch c_cur3 into row_semi_product;
         exit when c_cur3%notfound;
        Insert Into semi_product_costs values row_semi_product;
           
            
             DBMS_OUTPUT.ENABLE(1000000);
             DBMS_OUTPUT.PUT_LINE(r_cur3.segment1||' '||r_cur3.costs_rg||' '||r_cur3.costs_sb);
             END LOOP;
commit;
            END LOOP;
            
            end;
论坛徽章:
395
阿斯顿马丁
日期:2014-01-03 13:53:52马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31
发表于 2016-12-28 10:57 | 显示全部楼层
你把生产代码这么一大段贴出来,又没有错误信息,怎么分析

使用道具 举报

回复
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
 楼主| 发表于 2016-12-28 11:01 | 显示全部楼层
〇〇 发表于 2016-12-28 10:57
你把生产代码这么一大段贴出来,又没有错误信息,怎么分析

错误信息就是ORA-01001:无效的游标啊  在fetch那一行

使用道具 举报

回复
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
 楼主| 发表于 2016-12-28 11:15 | 显示全部楼层
错误信息
O)RXSLMORJDCX5UB7)H(_KO.png

使用道具 举报

回复
论坛徽章:
25
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-18 09:31:302016猴年福章
日期:2016-02-23 09:58:342015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29
发表于 2016-12-28 11:23 | 显示全部楼层
你都已经FOR LOOP  c_cur3 了为啥还要fetch c_cur3????

使用道具 举报

回复
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
 楼主| 发表于 2016-12-28 11:34 | 显示全部楼层
gyhgood 发表于 2016-12-28 11:23
你都已经FOR LOOP  c_cur3 了为啥还要fetch c_cur3????

我要把数据插入到表semi_product_costs去啊  输出语句是用来测试的  我试了把fetch语句去掉  确实可以执行成功  但是插入到表的数据就全是空值  

使用道具 举报

回复
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
 楼主| 发表于 2016-12-28 11:45 | 显示全部楼层
gyhgood 发表于 2016-12-28 11:23
你都已经FOR LOOP  c_cur3 了为啥还要fetch c_cur3????

输出是有值的 但就是插入不了临时表 执行完后表里面数据全是空值

使用道具 举报

回复
论坛徽章:
25
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-18 09:31:302016猴年福章
日期:2016-02-23 09:58:342015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29
发表于 2016-12-28 13:50 | 显示全部楼层
OwenCO 发表于 2016-12-28 11:45
输出是有值的 但就是插入不了临时表 执行完后表里面数据全是空值

你这个row_semi_product都没往里放东西当然是空的

使用道具 举报

回复
论坛徽章:
1
水瓶座
日期:2016-06-17 18:06:04
 楼主| 发表于 2016-12-28 14:10 | 显示全部楼层
gyhgood 发表于 2016-12-28 13:50
你这个row_semi_product都没往里放东西当然是空的

是啊 但是加上fetch语句又报错  应该怎样改写??

使用道具 举报

回复
论坛徽章:
395
阿斯顿马丁
日期:2014-01-03 13:53:52马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31
发表于 2016-12-28 16:07 | 显示全部楼层
cursor全改成for loop

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表