編寫存儲過程出現錯誤:
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;