oracle 中怎样执行自定义函数(函数中有修改数据库的操作)

houwenlong789 2010-05-08 04:59:08
最近写了一个函数,函数中有修改数据库中表的数据操作,函数原型为:

create or replace
FUNCTION SYS_FILL_GS
(
evaluationSet in number
)

假如我现在执行 select SYS_FILL_GS(32783) from dual;
则会出现:
Error report:
SQL Error: ORA-14551: 无法在查询中执行 DML 操作
ORA-06512: 在"KFEPMS.SYS_FILL_GS", line 17
14551. 00000 - "cannot perform a DML operation inside a query "
*Cause: DML operation like insert, update, delete or select-for-update
cannot be performed inside a query or under a PDML slave.
*Action: Ensure that the offending DML operation is not performed or
use an autonomous transaction to perform the DML operation within
the query or PDML slave.
这个问题怎样解决
...全文
1417 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
q4383194 2011-11-09
  • 打赏
  • 举报
回复
我执行包里面的函数 ,提示没有对应函数或过程。
houwenlong789 2010-05-08
  • 打赏
  • 举报
回复

create or replace
FUNCTION SYS_FILL_GS
(
evaluationSet in number
)
RETURN VARCHAR2 AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_test number(8);
v_masterCounts number(3) ;--部门主管个数
v_lastOfEvaluationSet date ;
v_index number(3);-- for循环指针
v_currentMasterID varchar2(200);--当前部门主管id

BEGIN
select evaluation_date into v_lastOfEvaluationSet from dep_evaluation_set where PK_auto_ID=evaluationSet;
select count(*) into v_test from dep_GS_examin_sup where FK_dep_evaluation_set_ID = evaluationSet;
if v_test = 0 then
-- 1插入督查督导的所有内容(行政正职,书记,主管领导打分表)
insert into dep_GS_examin_sup (FK_sup_record_ID,FK_dep_evaluation_set_ID)
select r.PK_auto_ID, evaluationSet
from sup_record r,sup_Info i
where r.FK_SPI_ID = i.PK_SUP_ID and Is_GSProject = 1 and
last_day(workOut_date) = last_day(v_lastOfEvaluationSet);
--2 插入月综合计划的所有内容(行政正职,书记,主管领导打分表)
insert into dep_GS_examin_complex (FK_complex_plan_detail_ID,FK_dep_evaluation_set_ID)
select d.PK_auto_ID ,evaluationSet
from complex_plan_detail d,complex_month_plan c
where d.FK_complex_ID = c.PK_auto_ID and is_GS_plan = 1
and finish_state_check=3 and last_day(d.end_date) =last_day(v_lastOfEvaluationSet);
--3其它领导打分表打分表 的插入
select count(*) into v_masterCounts from (select distinct(FK_dpt_Master) from department);
for v_index in 1..v_masterCounts loop
--选出一个主管领导
select FK_dpt_Master into v_currentMasterID from
(select FK_dpt_Master,rownum rn from ( select distinct(FK_dpt_Master) from department))
where rn = v_index;
--插入这个主管领导可以打分的督查督导内容
insert into dep_GS_other_charger_sup(FK_dep_evaluation_set_ID,FK_employee_ID,score,FK_sup_record_ID)
select evaluationSet,v_currentMasterID,80,r.PK_auto_ID
from sup_record r,sup_Info i
where r.FK_SPI_ID = i.PK_SUP_ID and Is_GSProject = 1 and
SYS_MASTER_CAN_SCORE_BY_ID(v_currentMasterID,i.cooperate_Dep) > 0
and last_day(workOut_date) = last_day(v_lastOfEvaluationSet);

-- 插入这个主管领导可以打分的月综合计划
insert into dep_GS_other_charger_complex(FK_dep_evaluation_set_ID,FK_employee_ID,score,FK_complex_plan_detail_ID)
select evaluationSet,v_currentMasterID,80 ,d.PK_auto_ID
from complex_plan_detail d,complex_month_plan c
where d.FK_complex_ID = c.PK_auto_ID and is_GS_plan = 1 and SYS_MASTER_CAN_SCORE_By_Name(v_currentMasterID,d.cooperate_dept)>0
and finish_state_check=3 and last_day(d.end_date) =(v_lastOfEvaluationSet);
end loop;

-- 插入月综合计划的所有内容(其它领导打分表打分表)

end if;
COMMIT;
RETURN NULL;
END SYS_FILL_GS;



这次可以用的代码 ,假如大家遇到这种问题,可以参看以下,假如,函数中有修改数据库的操作,只需要加
PRAGMA AUTONOMOUS_TRANSACTION;
和 COMMIT;
心中的彩虹 2010-05-08
  • 打赏
  • 举报
回复
函数的全部代码 ,怎么没有返回


create or repacle function fun1(vn in varchar2) return varchar2
as
v varchar2;
begin
......

return(v);
end;
houwenlong789 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 robinson_0612 的回复:]

DML在函数中可以直接操作数据库吗?
[/Quote] 答案是可以的
houwenlong789 2010-05-08
  • 打赏
  • 举报
回复
答案找到了,遇到相同问题的可以查看这篇文章http://www.cnblogs.com/pengyq/archive/2008/11/26/1341656.html
清风智语 2010-05-08
  • 打赏
  • 举报
回复
DML在函数中可以直接操作数据库吗?
zhangwonderful 2010-05-08
  • 打赏
  • 举报
回复
function中一般不出现delete,insert,update等语句。如果要对表进行delete,insert,update,用存储过程或触发器即可。
zhangwonderful 2010-05-08
  • 打赏
  • 举报
回复
把sql语句完整粘贴出来看看
1、易于使用:资源附带的示例代码Demo和示例DML数据,有详细的函数说明和注释,以及请求demo示例,方便用户快速上手。 2、自定义分隔符:支持用户自定义分隔符,如英文逗号、分号等,满足各种复杂的字段拆分需求。 3、灵活扩展:提供函数接口,支持用户根据实际需求进行二次开发和功能扩展。 4、易于集成:函数设计简洁,易于集成到现有的Oracle数据库系统,无需复杂的配置和改造。 5、优化查询性能:通过避免复杂的子查询和嵌套循环,我们的函数显著提升了数据处理的速度,减少了数据库资源的消耗,让您的应用运行更加流畅。 6、灵活的数据检索:不仅能拆分字段,还能根据您的需求检索出特定的数据项,无论是查找、统计还是进一步处理,都能轻松应对。 7、高效字段拆分:此函数能够迅速将字段的多个值按逗号或其他自定义分隔符拆分成独立的行,极大地简化了对复合字段的操作过程。 使用场景: 商品分类管理:当您的商品分类信息存储在一个字段时,此函数可以帮助您快速拆分并检索特定分类下的所有商品,极大地提高了商品管理的效率。 用户权限分配:在用户权限系统,如果权限信息被压缩存储,使用本函数可以轻松地拆分权限字段

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧