oracle本地存储过程没问题,然后给测试线上编译都报错。。能不能帮我看看是什么原因。。
create or replace procedure PROC_XXCJ_SJTJ_TEST is
V_SQL VARCHAR2(2000);
V_ERR VARCHAR2(100);
CURSOR EXCEPTION_CURSOR IS
select 'insert into temp_xxcj_sjtj select lrdw as CODE,''' || content ||
''' as LX, count(1) as SL,to_date(to_char(lrrq,''yyyy-mm-dd''),''yyyy-mm-dd'') lrrq,''' || xzxdrlx ||''' as tp from ' || tablename || ' group by lrdw,lrrq' as exception_sql
from (select a.content, b.tablename, b.xzxdrlx
from BM_XXCJLX a,
(select f.code, t.tablename,t.xzxdrlx
from zhjg_bm_sjcj t, BM_XXCJLX f
where t.dl = '0'
and t.isdelete = 'N'
and t.cjmblx = f.code
group by f.code, t.tablename,t.xzxdrlx) b
where a.code = b.code);
begin
-- 清空临时数据
execute immediate 'truncate table temp_xxcj_sjtj';
OPEN EXCEPTION_CURSOR ;
LOOP
FETCH EXCEPTION_CURSOR INTO V_SQL;
EXIT WHEN EXCEPTION_CURSOR%NOTFOUND;
execute immediate V_SQL;
commit;
END LOOP;
CLOSE EXCEPTION_CURSOR;
-- 清空现有数据
execute immediate 'truncate table xxcj_sjtj';
--insert
insert into xxcj_sjtj
(CODE,
JCXX,
JCXXFJ,
YJXX,
XZCF,
JSXX,
NBXX,
TSXX,
XZXK,
LRRQ,
type)
select CODE,
SUM(DECODE(LX, '基本信息', SL, 0)) AS JCXX,
SUM(DECODE(LX, '业务信息', SL, 0)) AS JCXXFJ,
SUM(DECODE(LX, '司法信息', SL, 0)) AS YJXX,
SUM(DECODE(LX, '行政执法信息', SL, 0)) AS XZCF,
SUM(DECODE(LX, '公用事业信息', SL, 0)) AS JSXX,
SUM(DECODE(LX, '信用评价信息', SL, 0)) AS NBXX,
SUM(DECODE(LX, '其他信息', SL, 0)) AS TSXX,
SUM(DECODE(LX, '基础信息', SL, 0)) AS XZXK,
lrrq,
tp
from temp_xxcj_sjtj t
group by CODE,lrrq,tp;
commit;
insert into xxcj_sjtj(code,sum,jcxx,jcxxfj,jsxx,yjxx,tsxx,nbxx,xzcf,xzxk) select a.code,0,0,0,0,0,0,0,0,0 from xt_dept a where a.code not like '%00' ;
commit;
update xxcj_sjtj set sum=0 where sum is null;
commit;
update xxcj_sjtj set nbxx=0 where nbxx is null;
commit;
update xxcj_sjtj set XZCF=0 where XZCF is null;
commit;
update xxcj_sjtj set xzxk=0 where xzxk is null;
commit;
update xxcj_sjtj set tsxx=0 where tsxx is null;
commit;
insert into XXCJ_SJTJ_INDEX select code,sum(sum) from xxcj_sjtj group by code,type;
commit;
--更新小计
update xxcj_sjtj set sum=nvl(sum+jcxx+jcxxfj+jsxx+yjxx+tsxx+nbxx+xzcf+xzxk,0);
commit;
END PROC_XXCJ_SJTJ_test;
然后错误有
无效sql :execute immediate 'truncate table xxcj_sjtj';
根据你提供的存储过程代码以及报错信息,可以发现问题在于执行语句中的下划线符号“_”被转义成了“_”,导致了无效 SQL 报错。这可能是由于测试线的数据库版本不同于本地数据库版本造成的。
建议你将存储过程中的所有下划线符号“_”修改为两个下划线符号“__”,这样就可以避免被转义。修改后的语句如下:
execute immediate 'truncate table xxcj__sjtj';
希望这个答复可以帮助到你。