2 u014606879 u014606879 于 2014.04.08 16:38 提问

为后台执行加载数据 可以加载到临时表 却不能加载到表区间(调用存储过程)

CREATE OR REPLACE PROCEDURE PRC_DET_01026_DAY
(

IN_DAY IN NUMBER, --统计日期yyyymmdd
ON_RtnCode OUT NUMBER, --返回值,正确为0,错误为ORACLE的错误代码
ON_RtnMsg OUT VARCHAR2 --返回信息,正确为'NO ERROR',否则为ORACLE的出错信息

)

AS

-----程序固定变量,不要修改---------------------------
vn_RtnCode NUMBER(8) :=0; --程序返回代码,正确为0,错误为ORACLE的错误代码
vv_RtnMsg VARCHAR2(600) := 'NO ERROR'; --程序返回信息,正确为'NO ERROR',否则为ORACLE的出错信息
vd_BegDate DATE := SYSDATE; --程序起始时间
vd_EndDate DATE; --程序结束时间
vn_Step NUMBER(4) := 0; --运行步骤(如果程序较长,可以根据实际情况对此变量做增量,出错时根据此变量当前值比较容易分析,运行到最后赋值为-1,标识正常退出)
vn_batchid NUMBER; --处理批次号
vn_mdutype NUMBER := 100; --模块类型,100: 数据库存储过程
vn_statdate NUMBER(8); --处理日期参数
vn_statcity NUMBER(8); --处理地市参数
vv_statother VARCHAR2(600); --其它参数信息
vn_ninfo NUMBER(10); --其它返回数字信息
vv_vinfo VARCHAR2(800); --其它返回字符信息
vv_PrcName VARCHAR2(30) := UPPER('PRC_DET_01026_DAY'); --存储过程名称

vn_partflag NUMBER(1); --分区标志

var_day NUMBER(2); --日期参数
var_partno VARCHAR2(10); --分区参数
var_delpartno VARCHAR2(10); --需要删除的分区参数
var_addpartno VARCHAR2(10); --需要新增的分区参数
var_month NUMBER(2); --月份参数
var_delday VARCHAR2(6); --需要删除分区日期
var_count NUMBER(5); --计数器
var_tdate NUMBER(6); --动态表参数
var_info VARCHAR2(1000); --错误信息

BEGIN

vn_Step:=1;
--******此部分根据需要修改,如果没有值,则赋值为NULL;******---

vn_statdate := IN_DAY; --获取处理日期参数
vv_statother := NULL; --获取其它参数信息
--********************************************************---

var_tdate:=SUBSTR(IN_DAY,1,6); --截取动态表参数
var_partno := 'P'||IN_DAY; --计算表分区参数
--var_delday := TO_CHAR(ADD_MONTHS( TO_DATE(IN_DAY,'YYYYMMDD'), -12 ),'YYYYMM'); --计算12个月以前的时间
var_delday := TO_CHAR(TO_DATE(IN_DAY,'YYYYMMDD') - 2,'YYYYMMDD'); --计算2以前的时间
var_delpartno := 'P'||var_delday; --计算需要添加的分区参数
var_count:=0; --初始化计数器

vn_Step:=2;

FOR CUR_P
IN
(SELECT PARTITION_NAME
FROM ALL_TAB_PARTITIONS
WHERE TABLE_NAME='RELATION_USER'
AND PARTITION_NAME LIKE '%'||var_delday||'%')
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE RELATION_USER DROP PARTITION '||CUR_P.PARTITION_NAME;
END LOOP;

vn_Step:=3;

SELECT COUNT(*)
INTO vn_partflag
FROM ALL_TAB_PARTITIONS
WHERE TABLE_NAME='RELATION_USER'
AND PARTITION_NAME=var_partno;

IF vn_partflag=0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE RELATION_USER ADD PARTITION '||var_partno||' VALUES( '||IN_DAY||' ) TABLESPACE TBS_TOTAL';
ELSE
EXECUTE IMMEDIATE 'ALTER TABLE RELATION_USER TRUNCATE PARTITION '||var_partno;
END IF;

vn_Step:=4;

INSERT INTO RELATION_USER
SELECT IN_DAY,a.*
FROM TMP_01026 a
;

COMMIT;

---*************************************---

--******此部分根据需要修改,如果没有值,则赋值为NULL;******---
--******如:如果没有地市参数,则vn_statcity := NULL; ******---
vn_ninfo := NULL; --获取其它返回数字信息
vv_vinfo := NULL; --获取其它返回字符信息
--********************************************************---

vn_Step := -1; --赋值为负1,标识正常退出

--返回信息设置

--程序结束时间
vd_EndDate := SYSDATE;

EXCEPTION
WHEN OTHERS THEN

vn_RtnCode := SQLCODE;
vv_RtnMsg := SUBSTR(SQLERRM, 1, 600);
ROLLBACK;
ON_RtnCode := vn_RtnCode;
ON_RtnMsg := vv_RtnMsg;
vd_EndDate := SYSDATE;

DBMS_OUTPUT.PUT_LINE( 'INDEX: '||vn_Step||' ERR_CODE: '||vv_RtnMsg );

END;
求大神帮忙看下问题出在哪?为什么不能自动调用存储过程

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!