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

 
 注册
热搜:
查看: 485|回复: 3

[PL/SQL] 一个发生在Cursor的问题!

[复制链接]
论坛徽章:
1
秀才
日期:2017-09-25 15:10:56
跳转到指定楼层
1#
发表于 2017-12-5 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1pub币
下面是一段Procedure的代码,其中的Cursor 的Fetch into 下的循环一次都没有执行,就跳出了循环,十分费解!
重点代码已经圈出。
create or replace
procedure       P_DM6_SAP_MATERIAL_Test1
---------------------------------------------------------------------------------------------
-- SA:               Martin Mo
-- SA Doc:           DSFNPROC0068_P_DM6_SAP_MATERIAL.doc
-- Job Name:
-- Target Table:     KSDM.BO_SAP_MATERIAL
-- ETL Method:       Insert
-- Frequency:        Others
-- Parameter:
----------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
-- Code Tag          Person          Date             Comments
-- BY150918       Bert Ye          20150918          1.Change from insert to merge
----------------------------------------------------------------------------------------------
IS
   v_NEW_REQUEST_LTS    NUMBER (14, 0);--Procedure执行时间
   v_LAST_REQUEST_LTS   NUMBER (14, 0);--上次Procedure结束时间
   STDCOST_LAST_REQUEST_LTS  NUMBER (14,0);
   v_COMMITCOUNT        NUMBER (6); --批量的量级
   
   v_begintime varchar2(20);--输出的开始时间
   v_endtime varchar2(20);--输出的结束时间
    v_str varchar2(10);
BEGIN
   v_NEW_REQUEST_LTS := TO_NUMBER (TO_CHAR (SYSDATE (), 'YYYYMMDDHH24MISS'));--为了获取当前的时间
   v_LAST_REQUEST_LTS := F_GET_LAST_REQUEST_8TS ('P_DM6_SAP_MATERIAL');--获取上次Procedure执行的开始时间
   v_COMMITCOUNT      := 300;--300笔作为量级
   v_begintime := to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');

   DBMS_OUTPUT.PUT_LINE('开始时间为:'||v_begintime);
--Update from HQSTG.SAP_INFORECORD into HQDM.BO_SAP_MATERIAL
            DECLARE
                CURSOR           CUR_STDCOST
                IS
                SELECT DISTINCT  a.BWKEY as WERKS, --PLANT
                                 a.MATNR           --MATERIAL
                                 
                FROM             HQSTG.SAP_STDCOST a
                WHERE           (ETL_8TIMESTAMP >= v_LAST_REQUEST_LTS
                                 AND
                                 ETL_8TIMESTAMP < v_NEW_REQUEST_LTS)
                AND EXISTS       (SELECT  1
                                  FROM    HQDM.BO_SAP_MATERIAL b
                                  WHERE   a.matnr = b.matnr
                                      AND a.bwkey = b.werks);
               TYPE TYPE_TMP_STDCOST is table of CUR_STDCOST%rowtype;
               REC_TMP_STDCOST    TYPE_TMP_STDCOST;
       BEGIN
                OPEN  CUR_STDCOST;
                LOOP
                      FETCH CUR_STDCOST bulk collect into REC_TMP_STDCOST limit v_COMMITCOUNT;  -- Batch fetch records
                            FOR i in 1.. REC_TMP_STDCOST.COUNT LOOP
                        --Update 'Origin Group as Subdivision of Cost Element','Standard price','Price Unit'
                                        UPDATE HQDM.BO_SAP_MATERIAL a                                                
                                        SET    (HRKFT, --Origin Group as Subdivision of Cost Element
                                                STPRS, --Standard pric
                                                PEINH  --Price Unit
                                                )
                                              =(SELECT b.HRKFT,
                                                       b.STPRS,  
                                                       b.PEINH                                                                                                
                                                  FROM HQSTG.SAP_STDCOST b
                                                 WHERE b.MATNR = REC_TMP_STDCOST(i).MATNR
                                                   AND b.BWKEY = REC_TMP_STDCOST(i).WERKS)
                                        WHERE  a.WERKS = REC_TMP_STDCOST(i).WERKS
                                          AND  a.MATNR = REC_TMP_STDCOST(i).MATNR;
                                    dbms_output.put_line(i||'次---------');   
                            END LOOP;
                            COMMIT;
                            EXIT WHEN CUR_STDCOST%NOTFOUND;
                END LOOP;
                CLOSE CUR_STDCOST;
  END;
    v_endtime := to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
   dbms_output.put_line('结束时间为:'||v_endtime);
   COMMIT;
   P_BO_UPDATE_LAST_REQUEST_8TS ('P_DM6_SAP_MATERIAL', v_NEW_REQUEST_LTS);
     dbms_output.put_line('二次');  
end P_DM6_SAP_MATERIAL_test1;
--------------------------------------------------------------------------------------------------------------------
运行结果:

开始时间为:2017-12-05 15:34:59
结束时间为:2017-12-05 15:34:59
二次
--------------------------------------------------------------------------------------------------------------------
十分尴尬!!



论坛徽章:
4
蜘蛛蛋
日期:2013-03-30 23:38:44优秀写手
日期:2015-02-01 06:00:14优秀写手
日期:2015-02-12 06:00:15暖羊羊
日期:2015-04-15 09:25:35
2#
发表于 2017-12-9 10:07 | 只看该作者
游标有记录吗?

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
3#
发表于 2017-12-9 10:33 | 只看该作者
1、首先,确定游标是否有记录返回,或是否中间报错退出;
2、其实,这个程序没必要弄这么繁琐,弄个计数器,达限提交即可。

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442008新春纪念徽章
日期:2008-02-13 12:43:032010新春纪念徽章
日期:2010-03-01 11:08:322013年新春福章
日期:2013-02-25 14:51:24
4#
发表于 2017-12-13 16:20 | 只看该作者
1、确定游标有无获得记录。
2、增加异常捕获,看看在哪里出错了。

使用道具 举报

回复

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

本版积分规则

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