问题叙述:            用 EXECUTE IMMEDIATE 动态往临时表插入数据,跟踪发现插入临时表后数据会立马清空,按理说等存储过程执行完才会清空临时表才对,现在是执行插入语句后下一步验证就发现临时表就没有数据了,不知道什么原因,以前系统用着都是好的,这两天突然就不行,请大神指导。下面是存储过程代码:
v_sqlstr := v_sqlstr || v_condtion;
    
      EXECUTE IMMEDIATE 'insert into wms_temp_meter_assign( meterid,barcode,boxcode,metertype,bincode,bline,brank,blayer,pilercode,isassign) ' ||   v_sqlstr;
      v_count := SQL%ROWCOUNT;
    
      v_billcode := pack_wms_utility.fu_wms_getbillcode('wms_wm_deliverybillmas',
                                                        v_wh_sort_code);
      --判断是否按品规条件找到表计
      SELECT COUNT(meterid)
      INTO   v_count
      FROM   wms_temp_meter_assign;
      IF (v_count = 0) THEN
        SELECT COUNT(DISTINCT b.pilercode)
        INTO   v_count
        FROM   wms_pub_bin b
        WHERE  b.state = '0';
        IF (v_count > 0) THEN
          v_errormsg := '堆垛机故障出库任务号:' || taskcur.io_task_no;
        ELSE
          v_errormsg := '按平台给的品规条件未能找到满足条件的出库表计信息,请检查平台给予条件后一会再试!出库任务号:' ||
                        taskcur.io_task_no;
        
        END IF;
        RAISE v_exception;
        EXIT;

解决方案 »

  1.   

    确定数据在某一时刻成功插入表中了吗,没有看见你的commit操作呀。另外从跟踪日志看,在什么时机删除了数据?
      

  2.   

    临时表是怎么定义的,加一下 on delete reserve rows 这个选项,你先百度一下!
      

  3.   

    数据在某一时刻确定插入成功了,上面只是存储过程的部分代码,代码下面是由commit提交操作的!删除数据机制是在整个存储过程执行完删除临时表的数据! 现在是在执行插入后临时表立马就没有数据了,着急死了
      

  4.   

    借用,应该是ON COMMIT PRESERVE ROWS 和ON COMMIT DELETE ROWS 吧
      

  5.   

    查看下pack_wms_utility.fu_wms_getbillcode 函数是否存在commit和rollback或者DDL语句
    如果pack_wms_utility.fu_wms_getbillcode 函数需要单独事务请加上关键字pragma  autonomous_transaction;
      

  6.   

    看下这个表的建表语句,如果是create global temporary table,清空是正常的啊