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的同時,也會對該包進行一次編譯。那之後再次調用的時候就沒有問題了。