编写存储过程出现错误:
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 2009年08月19日
--数据源 :--%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;