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

原文地址:https://www.cnblogs.com/xielong/p/10716586.html

时间: 2024-11-03 12:46:58

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

Win7x64中使用PowerDesigner连接Oralce数据库报“[Oracle][ODBC][Ora]ORA-12154:TNS:无法解析指定的连接标识符”错误解决方法

错误描述 操作系统是Win7 x64,Oracle服务端是Oracle11g x64,客户端是Oracle10gR2 x86. 使用PL-SQL Developer连接正常 使用系统ODBC连接正常.这里要注意的是,64位系统默认启动的是64位ODBC数据源管理器,默认指向的是服务端连接,所以需要为Oracle服务端也配置TNS Service Name,否则同样会连接报错.PowerDesigner默认启动的是32位的ODBC数据源管理器,程序路径为“%SystemRoot%\SysWOW64

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

http://blog.csdn.net/maturn/article/details/8051987 问题描述: 基于CDialogEx的对话框工程.VS2010开发环境. 调试运行到OnInitDialog()的CDialogEx::OnInitDialog()方法的时候弹出提示窗口"不支持尝试执行的操作". 原因: 在函数对话框上的控件之后相应的关联变量没有取消导致出现该问题.虽然可以顺利编译通过,但会提示该问题. 解决方法: 查找该关联控件的变量,然后删除该问题控件所绑定的变量

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

提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在还原段中的时间:但是这也并不能完全保证指定的时间的数据一定能够被恢复,还原表空间没有足够的时间时,仍会覆盖要求保留的磁盘空间. 查看undo_retention的当前值: SQL> show parameter undo_retention NAME TYPE VALUE -------------

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

下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap"  type="com.maidan.daas.entity.AccoSysmanResource" >    <id column="pid" property="pid" jdbcType="INTEGER" />    <result column="cre

oracle视图总结(创建、查询、修改、删除等)

视图定义: - -视图是一种虚表. - -视图建立在已有表的基础上, 视图赖以建立的这些表称为基表. - -向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句. - -视图向用户提供基表数据的另一种表现形式 为什么使用视图? - -控制数据访问 - -简化查询 - -避免重复访问相同的数据 创建视图:在 CREATE VIEW 语句中嵌入子查询,子查询可以是复杂的 SELECT 语句 <span style="font-size:14px;&q

oracle分层查询中的start with和connect by(树结构查询)

来源:  http://blog.csdn.net/itmyhome1990/article/details/16338637 ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型 结构的联系. 例如有如下案例: 数据为节选,字段值含义分别为税务机构代码.税务机构名称.上级税务机构代码,税务机构级别 select * from extern_dm_swjg查询的时候默认顺序就是上面的顺序,可以看出是混乱的并没有特殊结构特征. 而希望的结果如下图: sj_swj

Oracle 中的SELECT 关键字(查询、检索)

1. SELECT 关键字用法: 检索单个列:select 列名 from 表名: 例:select ename from emp;检索多个列: select [列1,列2, ... ,列N] from 表名: 例:select ename , sal from emp;检索所有列:select * from 表名: 例:select * from emp; 2. 通配符(A): * :代表0个或多个列_ : 代表单个字符% : 代表0个或多个字符 使用通配符的优点:书写方便.可以检索未知列 使

为何在查询中索引未被使用 (Doc ID 1549181.1)

* 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   快速检查   表上是否存在索引?   索引是否应该被使用?   索引本身的问题   索引列或者索引的前置列是否在单表(non-join)查询的 Where 条件中(predicate list)?   索引列是否用在连接谓词中(join predicates)?   索引列在 IN 或者多个 OR 语句中?   索引列是否被函数修改?   隐式类型转换(implicit ty

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句和事物处理语句

在PL/SQL中可以使用的SQL语句主要有以下几类: SELECT 查询语句,DML语句,Transaction 事物处理语句,本文将对这几类语句在PL/SQL中的用法逐一介绍. 一.查询语句-SELECT SELECT 语句用来查询一条或多条语句.虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出. 在PL/SQL中使用SELECT 语句的格式如下:   SELECT select_list INTO {variable_name[,variable_name]...