Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决
在编写一个数据库函数时,方法实现需要查询后进行修改,出现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 操作” 如何解决的更多相关文章
- .NET中集合已修改;可能无法执行枚举操作 的解决办法
foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等).要避免这个问题,就应该使用for循环. https://msdn.microsoft.com/zh-cn/library/tt ...
- PL/SQL“ ORA-14551: 无法在查询中执行 DML 操作”解决
环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.PL/SQL中有更新的操作, ...
- ORA-14551: 无法在查询中执行 DML 操作
编写了一个oracle函数,函数体内实现一系列数据库的逻辑处理,涉及到数据的增删等操作,返回NCLOB类型. 然后通过查询方式调用函数: SELECT PKG.MY_FUN('A') FROM DUA ...
- MFC中运行出现问题“不支持尝试执行的操作”
http://blog.csdn.net/maturn/article/details/8051987 问题描述: 基于CDialogEx的对话框工程.VS2010开发环境. 调试运行到OnInitD ...
- Oracle的闪回技术--闪回错误的DML操作
提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在 ...
- Oracle——无法在查询中执行 DML 操作
今天在调用Oracle Function遇到一个异常
- Oracle函数中将参数放在模糊查询中
--diagnosis_name like '%'||diagnosis_names||'%' create or replace function asdf(MIN_DATE IN varchar2 ...
- Sql server 数据库中,纯SQL语句查询、执行 单引号问题。
在默认值情况下, select 'abc',Titile from tb_Name; ---输出内容 是abc: 如果想输出 单引号 'abc,需要使用select '''abc',Titile f ...
- myBatis中 collection 或 association 联合查询 中column 传入多个参数值
下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap" type="com.maidan.daas.entit ...
随机推荐
- vm中的nat模式不能连接到主机,以及不能上网
主机能够ping通vm中的ip,但是vm不能ping通主机ip vm不能ping通主机:主要是虚拟机中的gateway的设置和vm的网络编辑器中的网关id不一致造成的 vm不能上外网:dns没有配置正 ...
- ssh很慢的问题转子
根据网上的解决办法解决了,记录一下: 问题:ssh ***@192.*.*.* ,然后就一直卡在这个地方,很久以后才会出现让输入密码的提示 解决办法:1.关闭防火墙--chkconfig ipta ...
- sql 与 mysql 链接数据库
- 4.JAVA基础复习——JAVA中的构造函数与this关键字
构造函数:构建创造对象时调用的函数 特点: 1.函数名与类名相同. 2.不用定义返回值类型. 3.没有具体的返回值. public class Demo { private int age; priv ...
- 【js】版本号对比处理方案
今天在处理一个bug问题,适配客户端版本:若版本号未达到,则不可运行该功能,若达到则可运行. 版本号规则如下:(一般统一为2个点,其他的是数字,版本号从高位到低位,首位越大则越大,首位相同则对比下一位 ...
- 基于OpenCV做“三维重建”(3)--相机参数矩阵
通过前面的相机标定,我们能够获得一些参数模型.但是这些相机的参数矩阵到底是什么意思?怎样才能够判断是否正确?误差都会来自哪里?这里就必须要通过具体实验来加深认识.采集带相机参数的图片具有一定难度,幸好 ...
- Synchronized使用方法
Synchronized是我们常用来维持线程安全时使用的一个关键字,内部通过monitor(监视器锁,由C++实现)来实现.而monitor本质又是依赖底层操作系统的mutex lock来实现.而操作 ...
- Linux 设置系统时间和时区1.Centos
- 20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义
20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然 ...
- Linux常用命令——软件包管理
Linux常用命令--软件包管理 Linux 模块依赖查询网址http://www.rpmfind.net/ ISO挂载 将所需ISO文件添加到虚拟机 建立挂载文件夹mkdir /mnt/cdrom ...