Oracle如何手工执行job,求助高手,JOB执行和手工执行执行结果不同,JOB执行不出来,手工却没问题...
求助:JOB执行异常,手工执行没问题。这个存储过程实现按相关维度聚集明细数据(按月);之后,从1月-12月,依次向上补充当期未发生数据(累计值补0) 。问题是,这个存储过程,手工执行没问题,每次通过JOB调用,执行到第二部补充数据的按月双层循环,就卡住了。卡在第一次循环,COMMIT总是不执行。试图跟踪SQL,但是总是跟踪不到,服务器没有标识的trace文件生成。跟踪SQL这个问题如果手工执行这个过程的话也没问题。。。。期间,查看alert文件,没有错误记录。存储过程本身也没有异常抛出。 数据库服务器是ORACLE 9I的。插入数据的目标表按月分区的。插入新数据之前,跑循环删除两年内的所有数据所在分区。
FUNCTION F_ETL_M1_SB_SP_JL_MX_Y(AN_YEARS NUMBER) RETURN NUMBER IS
LN_RETURN NUMBER;
LVC_BBQ_MAX VARCHAR2(6);
LVC_SQLSTR VARCHAR2(100);
BEGIN
SELECT SYSDATE INTO ldt_zxsj_q FROM DUAL;
--LN_RETURN := F_ETL_INDEX_REBUILD('M1_SB_SPXX_JL_MX_Y', 0);
LVC_SQLSTR := 'ALTER SESSION SET SQL_TRACE = TRUE';
EXECUTE IMMEDIATE LVC_SQLSTR;
LVC_SQLSTR := 'ALTER SESSION SET TRACEFILE_IDENTIFIER = ' ||
'''yuanchh_test_131029''';
EXECUTE IMMEDIATE LVC_SQLSTR;
FOR REC_ND IN 1 .. AN_YEARS LOOP
FOR REC_YF IN 1 .. 12 LOOP
LVC_FQXH := (TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) ||
LPAD(REC_YF, 2, '0');
LVC_SQLSTR := 'ALTER TABLE M1_SB_SPXX_JL_MX_Y TRUNCATE PARTITION ' ||
'PART' || LVC_FQXH;
EXECUTE IMMEDIATE LVC_SQLSTR;
END LOOP;
END LOOP;
--1、抽取每月发生数据
FOR REC_ND IN 1 .. AN_YEARS LOOP
INSERT
INTO M1_SB_SPXX_JL_MX_Y NOLOGGING
(BBQ,
NSRDZDAH,
HYMX_DM,
DJZCLX_DM,
SKSS_SWJG_DM,
NSR_SWJG_DM,
SE_BQ,
SE_BQLJ,
BBQ_TQ,
NSRSBH,
NSRMC,
HYMX_DM_BI,
SJLY) /* NSR_SWJG_NOW*/
SELECT /*+ PARALLEL(a,8) */
A.BBQ,
A.NSRDZDAH,
MAX(A.HYMX_DM),
MAX(A.DJZCLX_DM),
A.SKSS_SWJG_DM,
A.NSR_SWJG_DM,
SUM(A.SE) SE_BQ,
SUM(SUM(A.SE)) OVER(PARTITION BY SUBSTR(A.BBQ, 1, 4), A.NSRDZDAH, /*A.HYMX_DM, A.DJZCLX_DM,*/ A.SKSS_SWJG_DM, A.NSR_SWJG_DM ORDER BY SUBSTR(A.BBQ, 5, 6) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) SE_BQLJ,
A.BBQ - '100' BBQ_TQ, --数据抽取用
MAX(A.NSRSBH),
MAX(A.NSRMC),
MAX(A.HYMX_DM_BI),
'1'
FROM M1_SB_SPXX_DH_MX_Y A --, DIM_HY B
WHERE /*A.HYMX_DM = B.HY_DM_SJ(+)
AND */A.BBQ >= (TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) || '01'
AND A.BBQ <= (TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) || '12'
GROUP BY A.BBQ,
A.NSRDZDAH,
--A.HYMX_DM, --CHANGED @20131027
--A.DJZCLX_DM,
A.SKSS_SWJG_DM,
A.NSR_SWJG_DM;
COMMIT;
END LOOP;
COMMIT;
--2、按数据粒度补齐各月未发生数据的累计值(当期值补0),补到当前发生数据的最大月为止
SELECT MAX(T.BBQ)
INTO LVC_BBQ_MAX
FROM M1_SB_SPXX_DH_MX_Y T
WHERE T.BBQ <= TO_CHAR(SYSDATE, 'YYYYMM');
FOR REC_ND IN 1 .. AN_YEARS LOOP
FOR REC_YF IN 1 .. 11 LOOP
INSERT /*+append*/ INTO M1_SB_SPXX_JL_MX_Y nologging
(BBQ,
NSRDZDAH,
HYMX_DM,
DJZCLX_DM,
SE_BQ,
SE_TQ,
SKSS_SWJG_DM,
NSR_SWJG_DM,
SE_BQLJ,
SE_SNTQLJ,
NSRSBH,
NSRMC,
HYMX_DM_BI,
TBZF_DY,
TBZF_LJ,
SJLX,
BBQ_TQ,
NSR_SWJG_NOW,
SJLY)
SELECT /*+full(t)*/
(TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) ||
LPAD((REC_YF + 1), 2, '0') BBQ,
NSRDZDAH,
HYMX_DM,
DJZCLX_DM,
0 SE_BQ,
0 SE_TQ,
SKSS_SWJG_DM,
NSR_SWJG_DM,
SE_BQLJ,
0 SE_SNTQLJ,
NSRSBH,
NSRMC,
HYMX_DM_BI,
TBZF_DY,
TBZF_LJ,
SJLX,
(TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) ||
LPAD((REC_YF + 1), 2, '0') - '100' BBQ_TQ,
NSR_SWJG_NOW,
'0' SJLY --'0'标识为补的数据
FROM M1_SB_SPXX_JL_MX_Y T
WHERE T.BBQ = (TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) ||
LPAD(REC_YF, 2, '0')
AND T.BBQ <= LVC_BBQ_MAX
AND NOT EXISTS
(SELECT /*+full(b)*/1
FROM M1_SB_SPXX_JL_MX_Y B
WHERE B.NSRDZDAH = T.NSRDZDAH
--AND B.HYMX_DM = T.HYMX_DM --CHANGED @20131027
--AND B.DJZCLX_DM = T.DJZCLX_DM
AND B.SKSS_SWJG_DM = T.SKSS_SWJG_DM
AND B.NSR_SWJG_DM = T.NSR_SWJG_DM
AND B.BBQ = (TO_CHAR(SYSDATE, 'YYYY') - REC_ND + 1) ||
LPAD((REC_YF + 1), 2, '0'));
COMMIT;
END LOOP;
END LOOP;
PKG_GY.P_GY_WRITE_ETL_LOG(lvc_etl,
'F_ETL_M1_SB_SP_JL_MX_Y',
lvc_zxjg,
ldt_zxsj_q,
sysdate,
'01',
null);
RETURN 0;
EXCEPTION
WHEN OTHERS THEN
PKG_GY.P_GY_WRITE_ETL_LOG(lvc_etl,
'F_ETL_M1_SB_SP_JL_MX_Y',
lvc_zxjg_err,
ldt_zxsj_q,
sysdate,
'01',
substr(TO_CHAR(SQLCODE) || SQLERRM, 1, 500));
RETURN 1;
END F_ETL_M1_SB_SP_JL_MX_Y;
总结
以上是生活随笔为你收集整理的Oracle如何手工执行job,求助高手,JOB执行和手工执行执行结果不同,JOB执行不出来,手工却没问题...的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 勒索团伙声称窃取3000份SpaceX火
- 下一篇: c语言编写程序平均值,编写求一组整数的和