Oracle中ORA-06508错误解决,触发器调用存储过程

Oracle中ORA-06508错误解决,触发器调用存储过程

by yanleigis, Email:[email protected]

1.触发器如下:

create or replace trigger TIG_CW_ChargeInfo
after update on CW_ChargeInfo
for each row

declare
SFCW_FORMID CONSTANT integer := 347; --财务表收费FormID
PrecordsumID integer;
pid integer;
num integer;
str varchar2(1024);

--获得一个Formid的主键id值

begin
begin
delete from tt;
PrecordsumID := :new.recordsumID;
insert into tt (text, d) values ('开始,' || PrecordsumID, sysdate);

pid := cwnew_pack.GetPIDbyFormID(SFCW_FORMID, PrecordsumID);
insert into tt (text) values ('pid=' || pid);

if pid < 1 then
return;
end if;
select count(*)
into num
from SF_ChargeInfosub
where ChargeInfoID = pid;
insert into tt (text) values ('pid=' || pid || ',num=' || num);
if num = 0 then
return;
end if;
str := cwnew_pack.updateSF_ChargeInfosub(precordsumid, 0);
insert into tt
(text, d)
values
('最后,pid=' || pid || ',num=' || num || ',' || str, sysdate);
exception
when others then
str := '最后,pid=' || pid || ',num=' || num || ',' || '失败:' ||
sqlcode || ':' || sqlerrm;
insert into tt (text, d) values (str, sysdate);
end;

end;
执行cwnew_pack.GetPIDbyFormID(SFCW_FORMID)出现
ORA-06508: PL/SQL: 无法在调用之前找到程序单元的问题

Create or replace package cwnew_pack is

申明如下

type tt_type is table of varchar2(32) INDEX BY BINARY_INTEGER;

SFCW_FORMID CONSTANT integer := 347; --财务表收费FormID
--国有土地供应(方案)签报审批单
GY_FormID CONSTANT integer := 120; --国有土地供应(方案)签报审批单FormID
--处室填写收费表
DCW_FormID CONSTANT integer := 480; --处室填写收费表FormID

end;

解决方法:
将上面的声明部分放入包体最上面

现在的解决方法:
把包头的声明去掉,然后包体中使用这两个变量的存储过程中进行声明。

参考:http://www.fish888.com/Oracle-ORA-06508-t108001

深表感谢

有的时候还可以调用成功' 那是因為該procedrue在第一次被調用後,在報ORA-06508的同時,也會對該包進行一次編譯。那之後再次調用的時候就沒有問題了。


你可能感兴趣的:(oracle)