请教db2游标问题

CREATE PROCEDURE "DB2INST1"."TB_CON_BORR_ACCT_SUMMARY_PROC" (OUT RETURNCODE INTEGER,OUT ERRORMSG VARCHAR(255)) LANGUAGE SQLP: BEGIN     DECLARE SQL_CODE INTEGER DEFAULT 0;     DECLARE SQLSTATE CHAR(5) DEFAULT '00000';   &nbs...显示全部
CREATE PROCEDURE "DB2INST1"."TB_CON_BORR_ACCT_SUMMARY_PROC" (OUT RETURNCODE INTEGER,OUT ERRORMSG VARCHAR(255))
LANGUAGE SQL
P: BEGIN
    DECLARE SQL_CODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLMSG VARCHAR(200) DEFAULT '';
    DECLARE DT_STMT VARCHAR(200) DEFAULT '';
    DECLARE V_CNT INTEGER DEFAULT 0;
    DECLARE V_BORROW_NUM VARCHAR(26);
    DECLARE V_LOAN_BAL DECIMAL(20,2) DEFAULT 0.00;
    --DECLARE STMT VARCHAR(1024);
    DECLARE STMT STATEMENT;
    --声明CURSOR
    DECLARE C_LOAN_BAL CURSOR FOR S1;  --计算当前贷款余额
--异常处理,出现异常回滚,并记录异常代码,将异常代码返回
  DECLARE EXIT HANDLER FOR SQLEXCEPTION ,SQLWARNING
  BEGIN
   SET ERRORMSG = SQLSTATE;
   SET SQL_CODE = SQLCODE ;
            SET RETURNCODE = SQL_CODE;
   SET ERRORMSG = ERRORMSG||':出现异常,事务回滚';
           
  END;
  --处理NOT FOUND 异常
  DECLARE CONTINUE HANDLER FOR NOT FOUND
  BEGIN
   SET SQL_CODE = SQLCODE;
   SET RETURNCODE = SQL_CODE;
  END;


  --判断目标是否存在记录
     SELECT COUNT(1) INTO V_CNT FROM TB_CON_BORR_ACCT_SUMMARY;
   IF V_CNT > 0 THEN  
   --清空目标表
   --SET DT_STMT = 'DELETE FROM TB_CON_BORR_ACCT_SUMMARY';
   DELETE FROM TB_CON_BORR_ACCT_SUMMARY;
   --EXECUTE IMMEDIATE DT_STMT;
   COMMIT;
   END IF;
--开始抽数
INSERT
    INTO
TB_CON_BORR_ACCT_SUMMARY   --借据帐务信息
(
        PAYOUT_ACCT_SUMMARY_ID, --支用帐务信息ID
        PAYOUT_INFO_DETAIL_ID, --支用明细ID
        BORROW_NUM,            --借据号
        CONTRACT_NUM,           --主合同编号
        CUSTOMER_NUM,           --CMIS客户编号
        CURRENCY_CD ,           --币种代码
        EXPIRATION_DATE     ,   --到期日期
        CREDIT_BALANCE  ,       --当前授信余额
       -- LOAN_BALANCE  ,         --当前贷款余额
        CLASSIFICATION_RESULT   --五级分类结果

)
SELECT  
   "DB2INST1"."UUIDGENERATOR3" () AS PAY_SUM_ID,
   "DB2INST1"."UUIDGENERATOR3" () AS PAY_INF_ID,
A.LOAN_NO,
A.COMAPACT_NO,
A.CSTM_NO,
   DECODE(A.CURR_TYPE,'CNY','001','HKD','013','USD','014','JPY','027','EUR','033','GBP','012','CAD','028') AS CURR_TYPE, --币种
   TIMESTAMP(SUBSTR(CAST(A.DUE_DATE AS CHAR(12)),1,4)|| SUBSTR(CAST(A.DUE_DATE AS CHAR(12)),6,2)||SUBSTR(CAST(A.DUE_DATE AS CHAR(12)),9,2)||'000000') AS DUE_DATE,
   COALESCE(A.DLV_GUIDELINE,0.00) AS DLV_GUIDELINE, --发放指标 金额 默认为0.00
   -- SUM(b.BAL),  --余额
    SUBSTR(A.FLAG,4,1) --五级分类标志位  取flag第4位
FROM
T_LOAN_IOU A;

   IF SQL_CODE <> 0 THEN
        SET SQLMSG = '处理公司客户-借据登记簿(T_LOAN_IOU)数据到TB_CON_BORR_ACCT_SUMMARY(借据帐务信息表)出错!';
        SET ERRORMSG =  SQLMSG;
        GOTO ERROR_RETURN;
           END IF;
      COMMIT;
--声明定义临时表

  -- INSERT INTO SESSION.TEMP_LOAN_BAL(borrow_num1,loan_bal1)
   --select b.LOAN_NO,sum(b.BAL) from  T_LOAN_LEDGER b  group by b.LOAN_NO
    -- having exists
         --    (select 1 from T_LOAN_LEDGER a,TB_CON_BORR_ACCT_SUMMARY b where a.LOAN_NO=b.BORROW_NUM);

    --计算当前贷款余额
-- SET STMT = 'select  a.LOAN_NO,sum(a.BAL) from  T_LOAN_LEDGER a,TB_CON_BORR_ACCT_SUMMARY b where a.LOAN_NO=b.BORROW_NUM  group by a.LOAN_NO';
SET V_CNT =0;
   SET STMT ='select  a.LOAN_NO,sum(a.BAL) from  T_LOAN_LEDGER a,TB_CON_BORR_ACCT_SUMMARY b
           where a.LOAN_NO=b.BORROW_NUM  group by a.LOAN_NO ';
   PREPARE S1 FROM STMT;
   OPEN C_LOAN_BAL;
   C_LOAN_BAL_FETCH_LOOP:
   LOOP
    FETCH C_LOAN_BAL INTO V_BORROW_NUM,V_LOAN_BAL;
    SET V_CNT = V_CNT+1;
    IF SQL_CODE <> 0 THEN    --注意sqlcode已经在前面被初始化了,所以这里要用 sql_code
      LEAVE C_LOAN_BAL_FETCH_LOOP;
    END IF;
    UPDATE TB_CON_BORR_ACCT_SUMMARY TB
          SET TB.LOAN_BALANCE =COALESCE( V_LOAN_BAL,0.00)
              WHERE TB.BORROW_NUM =V_BORROW_NUM;
    END LOOP C_LOAN_BAL_FETCH_LOOP;
    CLOSE C_LOAN_BAL;
    COMMIT;
  
    SET SQLMSG   = '处理公司客户-借据登记簿(T_LOAN_IOU)数据到TB_CON_BORR_ACCT_SUMMARY(借据帐务信息表)成功!';
    SET ERRORMSG =  SQLMSG;
    SET SQL_CODE = 0;
    SET RETURNCODE = SQL_CODE;
    RETURN 1;
    ERROR_RETURN:
        ROLLBACK;
        RETURN -1;
END P

请问 该过程中游标处理部分有什么问题,我单步跟踪没问题,就不到两万条数据,执行十多分钟还没执行完,问题出在什么地方呢?收起
参与7

查看其它 5 个回答泊涯的回答

泊涯泊涯系统测试工程师高伟达公司
清空目标表
   --SET DT_STMT = 'DELETE FROM TB_CON_BORR_ACCT_SUMMARY';
   DELETE FROM TB_CON_BORR_ACCT_SUMMARY;
   --EXECUTE IMMEDIATE DT_STMT;
优化建议
truncate大表还是小表速度都非常快,。delete要产生回滚信息来满足回滚需求,而truncate是不能进行回滚操作
银行 · 2010-11-09
浏览714

回答者

泊涯
系统测试工程师高伟达公司
擅长领域: 云计算数据库中间件

泊涯 最近回答过的问题

回答状态

  • 发布时间:2010-11-09
  • 关注会员:1 人
  • 回答浏览:714
  • X社区推广