Oracle 版本11.2.0.4 带参数游标打不开

昨天遇到一个在不同版本下,带参数游标打不开问题。代码如下

create or replace function F_Func(anCraftno in number,anGoodsid in number,anCRAFTOTAL IN NUMBER,anOLDCraftno in number,anOLDGoodsid in number) return number AS
  v_newGOODSID           Rule_Craft_Bom.Goodsid%TYPE;
  v_oldGOODSID           Rule_Craft_Bom.Goodsid%TYPE;
  v_newCraftno           Rule_Craft_Bom.Craftno%TYPE;
  v_oldCraftno           Rule_Craft_Bom.Craftno%TYPE;
  v_newCraftotal         Rule_Craft_Bom.CRAFTOTAL%TYPE;
  v_oldCraftotal         Rule_Craft_Bom.CRAFTOTAL%TYPE;
  v_count                number(10);
  v_value                number(10);
  v_ishalfgoods          number(10);
  CURSOR C(ANCraftno IN NUMBER,ANGOODSID IN NUMBER) IS SELECT * FROM Rule_Craft_Bom WHERE Nvl(Craftno,0) = ANCraftno AND Goodsid = ANGOODSID;
BEGIN
  v_newGOODSID   := anGoodsid;
  v_newCraftno   := anCraftno;
  v_newCraftotal := anCRAFTOTAL;
  v_oldGOODSID   := anOLDGoodsid;
  v_oldCraftno   := anOLDCraftno;
  v_oldCraftotal := anCRAFTOTAL;

  FOR T IN C(v_newCraftno,v_newGOODSID) LOOP
      v_newGOODSID := t.sourartid;
      v_newCraftno := 0;
      v_newCraftotal := v_oldCraftotal*t.craftotal;
      --查看没有工艺
      BEGIN
        select count(1) into v_count from Rule_Craft_Bom where Nvl(Craftno,0) = v_newCraftno AND Goodsid = v_newGOODSID;
      EXCEPTION WHEN No_Data_Found THEN
        v_count := 0;
      END;
      IF v_count = 0 THEN --没有子节点
         UPDATE RULE_CRAFT_TBOMS SET CRAFTOTAL = CRAFTOTAL + v_newCraftotal
          WHERE FIRMID = t.firmid AND CRAFTNO=v_oldCraftno AND
                GOODSID = v_oldGOODSID AND SOURARTID = v_newGOODSID;
         If Sql%RowCount = 0 Then
             INSERT INTO RULE_CRAFT_TBOMS(FIRMID,CRAFTNO,GOODSID,SOURARTID,CRAFTOTAL,FACTORYID)
             VALUES(T.FIRMID,v_oldCraftno,v_oldGOODSID,v_newGOODSID,v_newCraftotal,T.FACTORYID);
         END IF;
      ELSE --有子节点,就遍历
         --判断是否需要生产
         BEGIN
           SELECT COUNT(1) INTO v_ishalfgoods FROM t_article  WHERE genitemid = v_newGOODSID AND nvl(ishalfgoods,0) = 1;
         EXCEPTION WHEN No_Data_Found THEN
            v_ishalfgoods := 0;
         END;  
         IF v_ishalfgoods > 0 THEN --需要单独生产
             UPDATE RULE_CRAFT_TBOMS SET CRAFTOTAL = CRAFTOTAL + v_newCraftotal
              WHERE FIRMID = t.firmid AND CRAFTNO=v_oldCraftno AND
                    GOODSID = v_oldGOODSID AND SOURARTID = v_newGOODSID;
             If Sql%RowCount = 0 Then
                 INSERT INTO RULE_CRAFT_TBOMS(FIRMID,CRAFTNO,GOODSID,SOURARTID,CRAFTOTAL,FACTORYID)
                 VALUES(T.FIRMID,v_oldCraftno,v_oldGOODSID,v_newGOODSID,v_newCraftotal,T.FACTORYID);
             END IF;
         ELSE --不需要
            --不用变量接值,编译过不了
            v_value := F_Func(v_newCraftno,v_newGOODSID,v_newCraftotal,v_oldCraftno,v_oldGOODSID); 
         END IF;
         
      END IF;

      NULL;
  END LOOP;
  RETURN 0;
end F_Func;

在ORACLE 版本为11.1.0.7下能正常的打开游标,但在版本11.2.0.4下传两个参数时打不开。

头痛了很近 最后把  anCraftno in number 改为 anCraftno in Integer 就能正常打开了。

不知道是不是oracle的版本问题还是BUG 

转载于:https://my.oschina.net/u/3411429/blog/878133

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值