2007-11-02
一个存储过程[insert into ... select * from ...]执行报错误
关键字: 数据库sql 代码
- create or replace procedure GETREMAIN_JSZX1(
- P_SETID IN NUMBER, --帐套
- P_YEAR IN NUMBER, --年度
- P_MONTH IN NUMBER, --月份
- P_UNITID IN VARCHAR2, --乡镇编号
- P_EID IN Varchar2, --单位
- P_SID IN Varchar2) --会计科目
- Is
- PA_YEAR NUMBER;
- Begin
- PA_YEAR := P_YEAR+1;
- If P_SID='1' Then
- INSERT INTO REMAIN (
- SELECT SETID,PA_YEAR AS YEAR,UNITID,
- SEQ_REMAIN_ID.NEXTVAL AS ID,
- SID,P_EID AS EID,'' AS BID,
- '' AS IID,BAL00,0 AS ISPLAN,'' AS ENAME,'' AS BNAME,'' AS INAME
- From
- (
- SELECT SETID,YEAR,UNITID,
- PID,SID,NAME AS SNAME,DEBCRE,ISLEAF,NVL(BAL00+(DEBMONEY_TOT-CREMONEY_TOT)*DEBCRE,0) AS BAL00
- FROM(
- SELECT SETID,YEAR,UNITID,SID,NAME
- ,(CASE WHEN DEBCRE='1' THEN 1 ELSE -1 END) AS DEBCRE
- ,ISLEAF,PID
- ,NVL(COUNTLEDGER('1','2','1',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS DEBMONEY_TOT
- ,NVL(COUNTLEDGER('1','2','2',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS CREMONEY_TOT
- ,NVL(COUNTREMAIN(P_UNITID,P_SETID,P_YEAR,TRIM(SID),P_EID,TRIM(''),TRIM('')),0) AS BAL00
- FROM
- (
- SELECT SETID,YEAR,UNITID,SID,NAME,DEBCRE,ISLEAF,PID
- FROM ACCOUNTSECTIONS
- WHERE
- SID<>'0.' AND UNITID=P_UNITID AND SETID=P_SETID AND YEAR=P_YEAR
- And SID Like '1%'
- AND ISLEAF=1 AND ENABLED=1
- ORDER BY ID1,ID2,ID3,ID4,ID5,ID6
- )
- )
- ) where BAL00<>0
- );
- Elsif P_SID = '1,2' Then
- INSERT INTO REMAIN (
- SELECT SETID,PA_YEAR AS YEAR,UNITID,
- SEQ_REMAIN_ID.NEXTVAL AS ID,
- SID,P_EID AS EID,'' AS BID,
- '' AS IID,BAL00,0 AS ISPLAN,'' AS ENAME,'' AS BNAME,'' AS INAME
- From
- (
- SELECT SETID,YEAR,UNITID,
- PID,SID,NAME AS SNAME,DEBCRE,ISLEAF,NVL(BAL00+(DEBMONEY_TOT-CREMONEY_TOT)*DEBCRE,0) AS BAL00
- FROM(
- SELECT SETID,YEAR,UNITID,SID,NAME
- ,(CASE WHEN DEBCRE='1' THEN 1 ELSE -1 END) AS DEBCRE
- ,ISLEAF,PID
- ,NVL(COUNTLEDGER('1','2','1',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS DEBMONEY_TOT
- ,NVL(COUNTLEDGER('1','2','2',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS CREMONEY_TOT
- ,NVL(COUNTREMAIN(P_UNITID,P_SETID,P_YEAR,TRIM(SID),P_EID,TRIM(''),TRIM('')),0) AS BAL00
- FROM
- (
- SELECT SETID,YEAR,UNITID,SID,NAME,DEBCRE,ISLEAF,PID
- FROM ACCOUNTSECTIONS
- WHERE
- SID<>'0.' AND UNITID=P_UNITID AND SETID=P_SETID AND YEAR=P_YEAR
- And (SID Like '1%' OR SID LIKE '2%')
- AND ISLEAF=1 AND ENABLED=1
- ORDER BY ID1,ID2,ID3,ID4,ID5,ID6
- )
- )
- ) where BAL00<>0
- );
- Elsif P_SID = '1,2,3' Then
- INSERT INTO REMAIN
- (SETID,Year,UNITID,ID,SID,EID,BID,IID,BAL00,ISPLAN,ENAME,BNAME,INAME)
- (
- SELECT SETID,PA_YEAR AS YEAR,UNITID,
- SEQ_REMAIN_ID.NEXTVAL AS ID,
- SID,P_EID AS EID,'' AS BID,
- '' AS IID,BAL00,0 AS ISPLAN,'' AS ENAME,'' AS BNAME,'' AS INAME
- From
- (
- SELECT SETID,YEAR,UNITID,
- PID,SID,NAME AS SNAME,DEBCRE,ISLEAF,NVL(BAL00+(DEBMONEY_TOT-CREMONEY_TOT)*DEBCRE,0) AS BAL00
- FROM(
- SELECT SETID,YEAR,UNITID,SID,NAME
- ,(CASE WHEN DEBCRE='1' THEN 1 ELSE -1 END) AS DEBCRE
- ,ISLEAF,PID
- ,NVL(COUNTLEDGER('1','2','1',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS DEBMONEY_TOT
- ,NVL(COUNTLEDGER('1','2','2',P_UNITID,P_SETID,P_YEAR,P_MONTH,TRIM(SID),TRIM(P_EID),TRIM(''),TRIM('')),0) AS CREMONEY_TOT
- ,NVL(COUNTREMAIN(P_UNITID,P_SETID,P_YEAR,TRIM(SID),P_EID,TRIM(''),TRIM('')),0) AS BAL00
- FROM
- (
- SELECT SETID,YEAR,UNITID,SID,NAME,DEBCRE,ISLEAF,PID
- FROM ACCOUNTSECTIONS
- WHERE
- SID<>'0.' AND UNITID=P_UNITID AND SETID=P_SETID AND YEAR=P_YEAR
- And (SID Like '1%' OR SID LIKE '2%' OR SID LIKE '3%')
- AND ISLEAF=1 AND ENABLED=1
- ORDER BY ID1,ID2,ID3,ID4,ID5,ID6
- )
- )
- ) where BAL00<>0
- );
- commit;
- End If;
- end GETREMAIN_JSZX1;
我在
exec Getremain_Jszx1(2,2007,12,'1004','100.','1,2,3');
报错误..
错误信息为:
sql 代码
- ORA-04091: 表 XZKJ.REMAIN 发生了变化,触发器/函数不能读
- ORA-06512: 在"XZKJ.COUNTREMAIN", line 37
- ORA-06512: 在"XZKJ.GETREMAIN_JSZX1", line 85
- ORA-06512: 在line 1
但是我把存储过程里面的sql语句拿出来将参数替换成值执行了一下.又可以正常运行..
是什么原因呢?
评论
neitnaco
2007-11-05
引用
另外看你的代码好辛苦~~~
唉.本来就是循环遍历的一个过程.我上面的错误原因找到了.是由于我下面用到的函数跟上面要插入的表是同一个表.
谢谢楼上的兄弟哈.
本人还有一个问题:
我这个存储过程大致意思就是根据一个会计科目从本年的所有账目当中去遍历属于该会计科目的金额信息.但是现在遇到一个问题就是我会计科目有3000个.然后每次都需要去遍历固定的一个数据集合(本年所作的所有账目).大概数据再5000条左右. .也就是查询数据库3000*5000...一个存储过程执行完大概要个1分多种..现在有22个单位.也就是22*1分钟..起码也得22分钟执行存储过程..效率问题问问该怎么 解决..苦恼中...
movingboy
2007-11-02
下面是Oracle联机帮助中关于ORA-04091错误的说明和建议:
也可以采用另一种办法:重写你的存储过程,在调用出错的函数之前不要改动/锁定该函数要访问的表的数据
另外看你的代码好辛苦~~~
引用
ORA-04091 table string.string is mutating, trigger/function may not see it
Cause: A trigger (or a user defined PL/SQL function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table.
Cause: A trigger (or a user defined PL/SQL function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table.
也可以采用另一种办法:重写你的存储过程,在调用出错的函数之前不要改动/锁定该函数要访问的表的数据
另外看你的代码好辛苦~~~
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 4422 次
- 性别:

- 来自: 杭州

- 详细资料
搜索本博客
我的相册
很酷的图片哦.
共 1 张
共 1 张
最近加入圈子
最新评论
-
为什么要用strust.hiberna ...
框架说白了就是JAVA工作者多年以来总结出的一些开发标准。让我们可以以成功的经验 ...
-- by neitnaco -
JBuilder编译和运行都没问 ...
原来是我机器上安装嘞两个版本的jdk版本.机器环境是jdk1.5的版本.然后jb ...
-- by neitnaco -
jsp+servlet上传
neitnaco 写道引用 还有人关注这个帖子吗,谢谢。用url在哪儿传值阿? ...
-- by assemble -
jsp+servlet上传
引用 baichunlin 3 天前 建议不要使用jspsmartu ...
-- by neitnaco -
jsp+servlet上传
建议不要使用jspsmartupload,它只能上传50M以内的文件
-- by baichunlin






评论排行榜