日期:2014-05-16  浏览次数:20914 次

谈Oracle存储过程优化,有兴趣的进人人有分。
案例:

描述:1.从用户产品表关联产品价格表查询出截止当月20号正常使用产品的用户以及产品、产品价格
      2.还需要关联一张用户表去获得用户所在地市编码
      2.将获得的数据一次性插入短信表

数量级:用户产品表TF_F_USER_SP  900W数据
        价格表:6000数据
       用户表:9000W数据

最后获取满足条件的数据:300W条

过程源代码:


create or replace procedure P_SMS_SENDINFOTOUSER(V_RESULTCODE OUT NUMBER,
                                                      V_RESULTINFO OUT VARCHAR2) IS
  TYPE T_CURSOR IS REF CURSOR;

  IV_NOTICE_CONTENT TI_O_SMS.NOTICE_CONTENT%TYPE; --短信内容
  IV_EPARCHY_CODE   TF_F_USER.EPARCHY_CODE%TYPE; --地市编码
  --定制生效的SP产品
  IV_CURSOR        T_CURSOR;
  IV_SERIAL_NUMBER TF_F_USER_SP.SERIAL_NUMBER%TYPE; --手机号码
  IV_USER_ID         TF_F_USER_SP.USER_ID%TYPE; --用户标识
  IV_SP_ID           TF_F_USER_SP.SP_ID%TYPE; 
  IV_SP_PRODUCT_ID   TD_B_PARTY_PRODUCT.SP_PRODUCT_ID%TYPE;
  IV_SP_PRODUCT_NAME TD_B_PARTY_PRODUCT.SP_PRODUCT_NAME%TYPE; -- SP名称
  IV_USER_SP_ALL     VARCHAR2(500); --用户所有的SP
  IV_COUNT           NUMBER(10);
  IV_PRICE           VARCHAR(20); --价格
  IV_USE_COUNT       NUMBER(10); --记录用户个数
  IV_CU_COUNT        NUMBER(10); --记录游标存储记录数
  IV_IS_HAS_M        NUMBER(1);--产品费用中是否含有M  0:表示不含有 1反之
  
  
  IV_SERIAL_NUMBER_TEMP TF_F_USER_SP.SERIAL_NUMBER%TYPE;
  IV_USER_ID_TEMP       TF_F_USER_SP.USER_ID%TYPE;

BEGIN
  V_RESULTCODE    := -1;
  V_RESULTINFO    := 0;
  IV_EPARCHY_CODE := '';
  BEGIN
  
    IV_SERIAL_NUMBER_TEMP := '-1';
    IV_USER_ID_TEMP       := '';
    IV_USER_SP_ALL        := '';
    IV_COUNT              := 0;
    IV_PRICE              := '0';
    IV_USE_COUNT          := 0;
    IV_CU_COUNT           := 0;
    IV_IS_HAS_M           := 0;

    INSERT INTO ucr_crm1.fx_TEMP_TF_F_USER_SP_20130420
        &nbs