ORA-14400错误

编写存储过程出现错误:

ORA-14400: inserted partition key does not map to any partition

错误在于P_ODS_A_AC_ACCOUNT_GSM 

Execute Immediate 'ALTER TABLE ODS_A_AC_ACCOUNT_GSM TRUNCATE SUBPARTITION PART' || V_ACCT_MONTH || '_SP_' || V_ACCT_DAY;

V_ACCT_DAY是类似如“20090811这样的Date类型,是八位。而PART+年月+日,故此V_ACCT_DAY改为V_DAY。正确的代码如下(完整):

代码如下:

一、创建表空间。

CREATE TABLE ODS.ODS_A_AC_ACCOUNT_GSM

(

         ACCT_MONTH                           VARCHAR2(6)   ,                  -- 账期 

         DAY_ID                                                VARCHAR2(20)  ,           -- 日(子分区)                               

         AREA_NO                                 VARCHAR2(10)  ,                        -- 地市         

         CITY_NO                                  VARCHAR2(10)  ,           -- 区县         

         REGION_ID                                 VARCHAR2(18)  ,                                -- 行政区域     

         ACCTID                  CHAR(14)      ,           -- 帐户标识   

         CONTACTID               CHAR(10)      ,           -- 联系人ID   

         CUSTID                  CHAR(14)      ,           -- 客户ID     

         MEMOCODE                VARCHAR2(60)  ,           -- 备忘录       

         ACCTTYPE                CHAR(2)       ,           -- 账户类型   

         PAYWAY                  NUMBER(6)     ,           -- 支付方式   

         DEDUCTPACE              NUMBER(10)    ,           -- 扣除金额           

         BANKCODE                CHAR(2)       ,           -- 银行代码   

         BRANCHCODE              CHAR(8)       ,           -- 分行代码   

         BANKACCT                VARCHAR2(60)  ,          -- 银行账户   

         BANKACCTNAME            VARCHAR2(60)  ,                  -- 银行账户名称

         BANKACCTBALANCE         NUMBER(10)    ,                 -- 银行账户余额

         CREDITLEVEL             NUMBER(10)    ,            -- 信用级别   

         BANKACCTPWD             VARCHAR2(20)  ,                  -- 银行账户密码

         DETAILSENDTYPE          CHAR(1)       ,             -- 详细发送类型

         BILLSENDTYPE            CHAR(1)       ,              -- 账单发送类型

         SENDCONTACTID           CHAR(14)      ,            -- 发送联系人ID

         POSTADDR                VARCHAR2(256) ,             -- 邮寄地址

         POST                    CHAR(6)       ,                -- 邮编  

         ACCTSTAT                CHAR(1)       ,              -- 账户状态   

         CSGNCON                 VARCHAR2(14)  ,            --            

         CRTOPTR                 CHAR(8)       ,              -- 创建人      

         CRTDATE                 DATE          ,           -- 创建日期   

         OPTRID                  CHAR(8)       ,           -- 操作员     

         OPTDATE                 DATE          ,           -- 操作日期   

         STAND                   CHAR(1)       ,           -- 备注        

         REMARK                  VARCHAR2(60)  ,           -- 备注                  

         INSERT_DATE                             DATE                                    -- 插入时间 

)     

COMPRESS

TABLESPACE TBS_MID

PARTITION BY RANGE (ACCT_MONTH)

SUBPARTITION BY LIST (DAY_ID)

SUBPARTITION TEMPLATE

(SUBPARTITION SP_01 VALUES ('01'),

 SUBPARTITION SP_02 VALUES ('02'),

 SUBPARTITION SP_03 VALUES ('03'),

 SUBPARTITION SP_04 VALUES ('04'),

 SUBPARTITION SP_05 VALUES ('05'),

 SUBPARTITION SP_06 VALUES ('06'),

 SUBPARTITION SP_07 VALUES ('07'),

 SUBPARTITION SP_08 VALUES ('08'),

 SUBPARTITION SP_09 VALUES ('09'),

 SUBPARTITION SP_10 VALUES ('10'),

 SUBPARTITION SP_11 VALUES ('11'),

 SUBPARTITION SP_12 VALUES ('12'),

 SUBPARTITION SP_13 VALUES ('13'),

 SUBPARTITION SP_14 VALUES ('14'),

 SUBPARTITION SP_15 VALUES ('15'),

 SUBPARTITION SP_16 VALUES ('16'),

 SUBPARTITION SP_17 VALUES ('17'),

 SUBPARTITION SP_18 VALUES ('18'),

 SUBPARTITION SP_19 VALUES ('19'),

 SUBPARTITION SP_20 VALUES ('20'),

 SUBPARTITION SP_21 VALUES ('21'),

 SUBPARTITION SP_22 VALUES ('22'),

 SUBPARTITION SP_23 VALUES ('23'),

 SUBPARTITION SP_24 VALUES ('24'),

 SUBPARTITION SP_25 VALUES ('25'),

 SUBPARTITION SP_26 VALUES ('26'),

 SUBPARTITION SP_27 VALUES ('27'),

 SUBPARTITION SP_28 VALUES ('28'),

 SUBPARTITION SP_29 VALUES ('29'),

 SUBPARTITION SP_30 VALUES ('30'),

 SUBPARTITION SP_31 VALUES ('31'))

( PARTITION PART200908 VALUES LESS THAN ('200909') COMPRESS NOLOGGING TABLESPACE TBS_MID,

  PARTITION PART200909 VALUES LESS THAN ('200910') COMPRESS NOLOGGING TABLESPACE TBS_MID  

);

COMMENT ON TABLE ODS.ODS_A_AC_ACCOUNT_GSM is '账户信息表';                                               

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.ACCT_MONTH        is '账期             ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.DAY_ID               is '日(子分区)        ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.AREA_NO           is '地市             ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CITY_NO           is '区县             ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.REGION_ID         is '行政区域         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.ACCTID            is '帐户标识         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CONTACTID         is '联系人ID         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CUSTID            is '客户ID           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.MEMOCODE          is '备忘录           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.ACCTTYPE          is '账户类型         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.PAYWAY            is '支付方式           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.DEDUCTPACE        is '扣除金额        ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BANKCODE          is '银行代码        ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BRANCHCODE        is '分行代码         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BANKACCT          is '银行账户         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BANKACCTNAME      is '银行账户名称           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BANKACCTBALANCE   is '银行账户余额     ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CREDITLEVEL       is '信用级别         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BANKACCTPWD       is '银行账户密码           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.DETAILSENDTYPE    is '详细发送类型     ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.BILLSENDTYPE      is '账单发送类型     ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.SENDCONTACTID     is '发送联系人ID     ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.POSTADDR          is '邮寄地址         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.POST              is '邮编             ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.ACCTSTAT          is '账户状态         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CSGNCON           is '                 ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CRTOPTR           is '创建人           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.CRTDATE           is '创建日期         ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.OPTRID            is '操作员           ';

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.OPTDATE           is '操作日期         '; 

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.STAND             is '备注             '; 

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.REMARK            is '备注             '; 

COMMENT ON COLUMN ODS.ODS_A_AC_ACCOUNT_GSM.INSERT_DATE       is '插入时间         '; 

 

二、导入数据。

CREATE OR REPLACE PROCEDURE P_ODS_A_AC_ACCOUNT_GSM(V_ACCT_DAY VARCHAR2,

                                                   V_RETCODE  OUT VARCHAR2, --输出变量

                                                   V_RETINFO  OUT VARCHAR2) IS

 

  ----------------------过程信息-------------------------------------------

  -- 名:--%NAME P_ODS_A_AC_ACCOUNT_GSM

  --功能描述:--%COMMENT 账户信息()

  -- 人:--%CREATOR 沈晓瑞

  --创建时间:--%CREATED_TIME 20090819

  --数据源  --%FROM STAGE.FT_CI_ACCTINFO_A_D

  --目标表  --%TO ODS.ODS_A_AC_ACCOUNT_GSM

  --    数:--%PARAM V_ACCT_DAY 日期(YYYYMMDD)

  --%PARAM V_RETCODE  输出变量:执行结果,SUCCESS/FAIL/WAIT

  --%PARAM V_RETINFO  输出变量:执行结果描述,比如错误信息(SQLERRM)

  --执行周期:--%PERIOD

  --执行时长:

  --注意事项:--%REMARK

  --修改记录:--%MODIFY 修改内容 修改人 修改日期

  --------------------------------------------------------------------------

 

  V_ROWCOUNT   NUMBER; ----用于保存记录数

  V_PKG        VARCHAR2(40); ----过程包名

  V_PROCNAME   VARCHAR2(100); ----过程名

  V_CNT        NUMBER;

  V_DATE       DATE;

  V_ACCT_MONTH varchar2(6);

  v_DAY        VARCHAR2(2);

BEGIN

  V_PKG      := 'P_ODS_O_CI_CUST_GSM';

  V_PROCNAME := 'P_ODS_O_CI_CUST_GSM';

 

  --插入开始日志

  REPORT.P_INSERT_LOG(V_ACCT_DAY, V_PKG, V_PROCNAME, '账户信息', v_date);

  V_ACCT_MONTH := SUBSTR(V_ACCT_DAY, 1, 6);

  V_DAY        := SUBSTR(V_ACCT_DAY, 7, 2);

 

  /*  --查看是过程是否正在运行

    SELECT COUNT(DISTINCT tl.procname)

      INTO V_CNT

      FROM REPORT.T_LOG tl

     WHERE tl.logdate = V_ACCT_DAY

       and tl.pkg_name = V_PKG

       and tl.procname = V_PROCNAME

       AND tl.flag = 'SUCCESS';

 

    IF V_CNT = 0 THEN

  */

  --插入开始日志

  /*    REPORT.P_INSERT_LOG(V_ACCT_DAY, V_PKG, V_PROCNAME, V_LOG_MSG, V_TIME);

  SELECT COUNT(*)

    INTO V_CNT

    FROM ODS.ODS_FT_ppsgprsflowcdr AAA

   WHERE AAA.ACCT_MONTH = V_ACCT_DAY

     AND ROWNUM <= 1;*/

 

  --如果存在则删除当期数据

  V_CNT := 1;

  IF V_CNT = 1 Then

    -----删除当期数据

 

    Execute Immediate 'ALTER TABLE ODS_A_AC_ACCOUNT_GSM TRUNCATE SUBPARTITION PART' ||

                      V_ACCT_MONTH || '_SP_' || V_DAY;

 

    --插入记录

    insert /*+APPEND*/

    into ODS.ODS_A_AC_ACCOUNT_GSM

      (ACCT_MONTH, -- 账期

       DAY_ID, -- 日(子分区)

       AREA_NO, -- 地市

       CITY_NO, -- 区县

       REGION_ID, -- 行政区域

       ACCTID, -- 帐户标识

       CONTACTID, -- 联系人ID

       CUSTID, -- 客户ID

       MEMOCODE, -- 备忘录

       ACCTTYPE, -- 账户类型

       PAYWAY, -- 支付方式

       DEDUCTPACE, -- 扣除金额

       BANKCODE, -- 银行代码

       BRANCHCODE, -- 分行代码

       BANKACCT, -- 银行账户

       BANKACCTNAME, -- 银行账户名称

       BANKACCTBALANCE, -- 银行账户余额

       CREDITLEVEL, -- 信用级别

       BANKACCTPWD, -- 银行账户密码

       DETAILSENDTYPE, -- 详细发送类型

       BILLSENDTYPE, -- 账单发送类型

       SENDCONTACTID, -- 发送联系人ID

       POSTADDR, -- 邮寄地址

       POST, -- 邮编

       ACCTSTAT, -- 账户状态

       CSGNCON, --

       CRTOPTR, -- 创建人

       CRTDATE, -- 创建日期

       OPTRID, -- 操作员

       OPTDATE, -- 操作日期

       STAND, -- 备注

       REMARK, -- 备注

       INSERT_DATE -- 插入时间

       )

      select V_ACCT_MONTH      AS ACCT_MONTH,

             v_day             AS DAY_ID,

             NULL              AS AREA_NO,

             NULL              AS CITY_NO,

             NULL              AS REGION_ID,

             A.ACCTID          AS ACCTID,

             A.CONTACTID       AS CONTACTID,

             A.CUSTID          AS CUSTID,

             A.MEMOCODE        AS MEMOCODE,

             A.ACCTTYPE        AS ACCTTYPE,

             A.PAYWAY          AS PAYWAY,

             A.DEDUCTPACE      AS DEDUCTPACE,

             A.BANKCODE        AS BANKCODE,

             A.BRANCHCODE      AS BRANCHCODE,

             A.BANKACCT        AS BANKACCT,

             A.BANKACCTNAME    AS BANKACCTNAME,

             A.BANKACCTBALANCE AS BANKACCTBALANCE,

             A.CREDITLEVEL     AS CREDITLEVEL,

             A.BANKACCTPWD     AS BANKACCTPWD,

             A.DETAILSENDTYPE  AS DETAILSENDTYPE,

             A.BILLSENDTYPE    AS BILLSENDTYPE,

             A.SENDCONTACTID   AS SENDCONTACTID,

             A.POSTADDR        AS POSTADDR,

             A.POST            AS POST,

             A.ACCTSTAT        AS ACCTSTAT,

             A.CSGNCON         AS CSGNCON,

             A.CRTOPTR         AS CRTOPTR,

             A.CRTDATE         AS CRTDATE,

             A.OPTRID          AS OPTRID,

             A.OPTDATE         AS OPTDATE,

             A.STAND           AS STAND,

             A.REMARK          AS REMARK,

             sysdate           as INSERT_DATE

        from stage.FT_CI_ACCTINFO_A_D a;

 

    V_ROWCOUNT := SQL%ROWCOUNT;

    Commit;

 

    --更新日志

    V_RETCODE := 'SUCCESS';

    V_RETINFO := '结束';

  ELSE

    V_RETCODE := 'WAIT';

    V_RETINFO := '等待';

  END IF;

 

  REPORT.P_UPDATE_LOG(V_ACCT_DAY,

                      V_PKG,

                      V_PROCNAME,

                      V_RETCODE,

                      V_RETINFO,

                      SYSDATE,

                      V_ROWCOUNT);

 

  --异常抛出

EXCEPTION

  WHEN OTHERS THEN

    V_RETCODE := 'FAIL';

    V_RETINFO := SQLERRM;

    REPORT.P_UPDATE_LOG(V_ACCT_DAY,

                        V_PKG,

                        V_PROCNAME,

                        V_RETCODE,

                        V_RETINFO,

                        SYSDATE,

                        V_ROWCOUNT);

END;

你可能感兴趣的:(Oracle)