在编写一个数据库函数时,方法实现需要查询后进行修改,出现ora-14551的错误

create or replace function fun_DxcBillSn(tabType integer,tabName varchar2,fieldStr varchar2)return integer
is
serialSn integer;
maxVal integer;
nowMonth varchar(20);
begin
--获取当前时间的月份--
select to_char(Sysdate,'MM') into nowMonth from dual;
--检查是否存在单号最大值 表名+ 类型 + 月份+字段 ---
select COUNT(*) into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr;
--如果大于0 ,证明存在序号记录--
if maxVal >0 then
--获取序号表的最大值 --
select MAXVAL into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr;
--获取序号ID值 --
serialSn:= maxVal+1;
--更新序号表记录的值 --
update DXC_SYSSN set MAXVAL=serialSn where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果小于等于0 ,证明不存在记录
else
--删除旧数据记录
delete from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and FIELD=fieldStr;
-- 返回序号的ID --
serialSn:=1;
--添加新的数据记录
insert into DXC_SYSSN(TABLENAME,BILLTYPE,MONTH,FIELD,MAXVAL) values(tabName,tabType,nowMonth,fieldStr,serialSn);
end if;
return serialSn;
end;

解决方法

在声明函数之前加上pragma autonomous_transaction ,在执行DML语句后Commit;

经过如上修改后的函数如下

create or replace function fun_DxcBillSn(tabType integer,tabName varchar2,fieldStr varchar2)return integer
is
--开启自治事务(解决Oracle ORA-14551: 无法在查询中执行 DML 操作的问题)--
pragma autonomous_transaction;
serialSn integer;
maxVal integer;
nowMonth varchar(20);
begin
--获取当前时间的月份--
select to_char(Sysdate,'MM') into nowMonth from dual;
--检查是否存在单号最大值 表名+ 类型 + 月份+字段 ---
select COUNT(*) into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr;
--如果大于0 ,证明存在序号记录--
if maxVal >0 then
--获取序号表的最大值 --
select MAXVAL into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr;
--获取序号ID值 --
serialSn:= maxVal+1;
--更新序号表记录的值 --
update DXC_SYSSN set MAXVAL=serialSn where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果小于等于0 ,证明不存在记录
else
--删除旧数据记录
delete from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and FIELD=fieldStr;
-- 返回序号的ID --
serialSn:=1;
--添加新的数据记录
insert into DXC_SYSSN(TABLENAME,BILLTYPE,MONTH,FIELD,MAXVAL) values(tabName,tabType,nowMonth,fieldStr,serialSn);
end if;
commit; -- 提交事务
return serialSn;
end;

参考来源:https://www.linuxidc.com/Linux/2013-06/86713.htm

Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决的更多相关文章

  1. .NET中集合已修改;可能无法执行枚举操作 的解决办法

    foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个问题,就应该使用for循环. https://msdn.microsoft.com/zh-cn/library/tt ...

  2. PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决

    环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...

  3. ORA-14551: 无法在查询中执行 DML 操作

    编写了一个oracle函数,函数体内实现一系列数据库的逻辑处理,涉及到数据的增删等操作,返回NCLOB类型. 然后通过查询方式调用函数: SELECT PKG.MY_FUN('A') FROM DUA ...

  4. MFC中运行出现问题“不支持尝试执行的操作”

    http://blog.csdn.net/maturn/article/details/8051987 问题描述: 基于CDialogEx的对话框工程.VS2010开发环境. 调试运行到OnInitD ...

  5. Oracle的闪回技术--闪回错误的DML操作

    提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在 ...

  6. Oracle——无法在查询中执行 DML 操作

    今天在调用Oracle Function遇到一个异常

  7. Oracle函数中将参数放在模糊查询中

    --diagnosis_name like '%'||diagnosis_names||'%' create or replace function asdf(MIN_DATE IN varchar2 ...

  8. Sql server 数据库中,纯SQL语句查询、执行 单引号问题。

    在默认值情况下, select 'abc',Titile from tb_Name;  ---输出内容 是abc: 如果想输出 单引号 'abc,需要使用select '''abc',Titile f ...

  9. myBatis中 collection 或 association 联合查询 中column 传入多个参数值

    下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap"  type="com.maidan.daas.entit ...

随机推荐

  1. leetcode 1——两数之和

    问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  2. Serializable中的serialVersionUID

    有序列化,就必然有反序列化!比如在A端为UserLogin(见上一篇对象序列化)做了序列化,然后在B端进行反序列化. 首先需要,A端和B端都定义有相同的UserLogin类.可是,万一两端的UserL ...

  3. MySQL_ALTER命令

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1)修改表名:表名可以在数据库中唯一标识一个table 命令格式:ALTER TABLE 旧名 RENAME 新名 ...

  4. inputClient.js

    $(document).ready(function () { loadData();}); //初始化数据function loadData(){ loadMList();//加载数据 $(&quo ...

  5. 原生js开发,无依赖、轻量级的现代浏览器图片懒加载插件,适合在移动端开发使用

    优势 1.原生js开发,不依赖任何框架或库 2.支持将各种宽高不一致的图片,自动剪切成默认图片的宽高 比如说你的默认图片是一张正方形的图片,则各种宽度高度不一样的图片,自动剪切成正方形. 完美解决移动 ...

  6. nodeEE双写与分布式事务要点一二

    数据库与缓存双写问题 计算机领域任何一个问题都可以通过增加一个抽象"层"来解决. 业务中为了减少热点数据不必要的db查询,往往会增加一层缓存来解决I/O性能.可是I/O多了一层也就 ...

  7. CH 6201 走廊泼水节题解

    题目链接:CH6201 当时在海亮考试的第一题: 心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的: 思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有 ...

  8. android开发_ViewGroup(组视图)-- 五大布局

    view组--ViewGroup(组视图) ViewGroup的作用:在view中添加子控件.ViewGroup的5个子类,就是五大布局: (1) LinearLayout  线性布局(常用) (2) ...

  9. fmt.Sprintf格式化使用

    格式化写法: fmt.Sprintf(格式化样式, 参数列表-) 参数说明: 格式化样式:字符串形式,格式化动词以%开头. 参数列表:多个参数以逗号分隔,个数必须与格式化样式中的动词个数对应,否则运行 ...

  10. 一些Java基础方面问题的总结

    1.Overloaded的方法是否可以改变返回值的类型? 答案:可以. overload是重载,overloaded是什么?重载的过去式?我还以为是我没见过的注解,也没有给限定条件,代码测试一下. p ...