当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-05-23

    本文导语: 环境 Oracle 11.2.0 + SQL Plus 问题 根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数。PL/SQL中有更新的操作,执行此函数报如下错误:ORA-16551: 无法在查询中执行 DML 操作。 解决 ...

环境

Oracle 11.2.0 + SQL Plus

问题

根据以下要求编写函数:将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数。PL/SQL中有更新的操作,执行此函数报如下错误:ORA-16551: 无法在查询中执行 DML 操作。

解决

在声明函数时加上: 并在执行完DML后。

操作日志

--登录到Oracle
C:UsersWentasy>sqlplus wgb

SQL*Plus: Release 11.2.0.1.0 Production on 星期六 6月 29 15:32:21 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

输入口令:

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

--编写函数
SQL> CREATE OR REPLACE FUNCTION raise_sal
  2  RETURN NUMBER
  3  IS
  4  v_num NUMBER:=0;
  5  v_avg emp.sal%TYPE;
  6  BEGIN
  7    SELECT AVG(sal) INTO v_avg FROM emp;
  8    UPDATE emp SET sal=sal+200 WHERE sal < v_avg;
  9    v_num:=SQL%ROWCOUNT;
 10    RETURN v_num;
 11  END raise_sal;
 12  /

函数已创建。

--调用函数,出现错误
SQL> SELECT raise_sal() FROM DUAL;
SELECT raise_sal() FROM DUAL
      *
第 1 行出现错误:
ORA-14551: 无法在查询中执行 DML 操作
ORA-06512: 在 "WGB.RAISE_SAL", line 8

--加上PRAGMA AUTONOMOUS_TRANSACTION和COMMIT。
SQL> CREATE OR REPLACE FUNCTION raise_sal
  2  RETURN NUMBER
  3  IS
  4  PRAGMA AUTONOMOUS_TRANSACTION;
  5  v_num NUMBER:=0;
  6  v_avg emp.sal%TYPE;
  7  BEGIN
  8    SELECT AVG(sal) INTO v_avg FROM emp;
  9    UPDATE emp SET sal=sal+200 WHERE sal < v_avg;
 10    v_num:=SQL%ROWCOUNT;
 11    COMMIT;
 12    RETURN v_num;
 13  END raise_sal;
 14  /

函数已创建。

--验证第一步:查询薪水平均值
SQL> SELECT AVG(sal) FROM emp;

  AVG(SAL)
----------
  2543.75

--验证第二步:查询薪水比平均薪水低的员工的总数
SQL> SELECT count(sal) FROM emp WHERE sal < (SELECT AVG(sal) FROM emp);

COUNT(SAL)
----------
        8

--验证第三步:查询数据
SQL> SELECT ename, sal FROM emp;

ENAME            SAL
---------- ----------
SMITH            1600
ALLEN            2400
WARD            2050
JONES            2975
MARTIN          2050
BLAKE            2850
CLARK            2450
KING            5000
TURNER          2300
JAMES            1750
FORD            3000

ENAME            SAL
---------- ----------
MILLER          2100

已选择12行。

--验证第四步:调用函数,如果为8,则实现功能
SQL> SELECT raise_sal() FROM dual;

RAISE_SAL()
-----------
          8

--验证第五步:再次查询表数据
SQL> SELECT ename, sal FROM emp;

ENAME            SAL
---------- ----------
SMITH            1800
ALLEN            2600
WARD            2250
JONES            2975
MARTIN          2250
BLAKE            2850
CLARK            2650
KING            5000
TURNER          2500
JAMES            1950
FORD            3000

ENAME            SAL
---------- ----------
MILLER          2300

已选择12行。

参考资料

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

引用文字——更好的理解自治事务

数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。针对这种困境,Oracle提供了一种便捷的方法,即自治事务。自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。因为自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQLServer语句都是自治的。触发无法包含COMMIT语句,除非有PRAGMA AUTONOMOUS_TRANSACTION标记。但是,只有触发中的语句才能被提交,主事务则不行。


    
 
 

您可能感兴趣的文章:

  • SQL Server统计SQL语句执行时间的脚本
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • SQL Server 中查看SQL句子执行所用的时间
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 循环里面执行sql插入语句只执行第一个插入,为什么??
  • 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql无效字符引起的执行sql语句报错的解决方法
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • 为什么 java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性
  • sql无效字符 执行sql语句报错解决方案
  • 如何判断一条sql(update,delete)语句是否执行成功
  • Java的SQL语句执行错误问题
  • 请问如何在Java中执行SQL的块语句?
  • 当ResultSet执行SQL成功后,我如何取得ResultSet的记录部条数
  • 了解 sql server 语句的执行时间
  • oracle sql执行过程(流程图)
  • jsp中sql语句执行时间太长,用浏览器打开时,页面超时,如何处理?
  • ~~进门就送分!~~ 如何执行包含多语种的SQL语句呢?
  • oracle中得到一条SQL语句的执行时间的两种方式
  • SQL语句执行顺序图文介绍
  • (X86/X64)安装sql server 2005 过程中提示“无法启动sql server的 启动”的解决方法
  • SQL Server代理服务无法启动的解决方法
  • sql2000挂起无法安装的问题的解决方法
  • sa用户无法登录sql server 2005的解决方法
  • SQL 无法装载DLL Microsoft原因(无法修改sa密码)
  • sql server 2008 无法附加数据库的解决方法
  • SQL Server提示"选定的用户拥有对象,所以无法除去该用户”
  • sql server 2008:您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • SQL Server 2012无法连接到WMI提供程序(Cannot connect to WMI provider)解决方案
  • sql server 2005维护计划无法删除怎么办呢?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍
  • JAVA JODBC中怎样连续操作两个(或以上)的SQL语句
  • SQLServer导出sql文件/表架构和数据操作步骤
  • sql2005 create file遇到操作系统错误5拒绝访问 错误1802
  • win2000 professional 操作系统上怎么用sql server 2000?(好像不支持)
  • 请问.C与.PC有什么不同,我的.C里面增加了SQL操作,如何编译?
  • 这样的操作SQL该怎么写?
  • sql数据库修改sa密码操作教程
  • sql语句之数据操作介绍
  • 比较详细的完美解决安装sql2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作。 原创
  • 一些关于c#与Sql的时间的操作
  • Sql学习第一天——SQL UNION 和 UNION ALL 操作符认识
  • linux操作系统安装sql developer步骤
  • sql字段操作的一些例子
  • SQL Server的事务操作隔离模式介绍
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等
  • 清除SQL SERVER错误日志出现操作系统错误的解决方法
  • 用jdbc对access数据库进行操作时出现异常:java.sql.SQLException: [Microsoft][ODBC 驱动程序 管理器] 非法的游标状态
  • sql server 日期操作的一些例子
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等)?
  • sql server本地查询更新操作远程数据库的代码
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,