java.sql.SQLException: ORA-00971: 缺失 SET 关键字

news/2024/11/1 2:26:20/

目录

背景:

过程:

错误原因: 

解决办法:

总结:


背景:

正在运行某个项目程序,提交信息之后发现库中并没有刚刚的相关数据,后来查看后台信息,发现提示错误,java.sql.SQLException: ORA-00971: 缺失 SET 关键字,下面一片红色,经过筛选,我看到(UserManage.java:194),显然是UserManage类里面的代码出现了错误,后来经过在网上查询有了些眉目。

过程:

java.sql.SQLException: ORA-00971: 缺失 SET 关键字这个错误通常发生在尝试执行一个UPDATE SQL语句时,但是该语句少了必要的SET字句。SET子句在UPDATE语句中用于指定要吸怪以及它们的新值,这个错误一般不是由Javadiamante本身引起的,而是由Java代码生成的SQL语句不正确所导致的,在Java程序中构建SQL语句时,如果忘记添加SET字句,或者由于某种原因(如字符串拼写错误、变量为正确替换等)导致SET字句被遗漏或格式不正确,就会触发这错误。

经过分析我锁定了下面的这行段代码,因为在这个代码中包含了SET子句

sbSql.append("update t_user" ).append("set user_name =?, ")

错误原因: 

我在sqlSql.append(“update t_user”)后面没有加空格直接拼接了set子句,会导致生成的SQL语句中update 和set两个关键字之间紧密相连,没有适当的空格分隔。在SQL语法中,update语句的SET字句是用来指定要修改的列级其新值的,而这两个部分(update和set)之间需要用空格或其它SQL语句分隔符(如换行符,尽管在大多数SQL解析器中换行符被视为空白字符,但不影响语句的解析)来正确的分隔

由于我缺少了整个空格,生成的SQL语句看起来像这样:

update t_userset user_name = ?, password = ?, contact_tel = ?, email = ? where user_id = ?

这里t_userset不是一个有效的SQL标识符,它们两个之间粘连在了一起,所以SQL引擎无法识别它,因此会抛出一个语法错误。实际上,SQL引擎在常识解析这条语句时,会在update关键字之后立即遇到它不认识的字符(即s,它是set的第一个字符,由于没有空格分隔,它被错误地解释为update语句的一部分),从而无法正确识别接下来的set字句。

因此,SQL引擎会报出一个错误,提示在解析过程中遇到了问题。在Oracle数据库中,这个错误的标记为ORA-00971: 缺失 SET 关键字,意味着在SQL引擎期望找到子句的地方没有找到它(实际是因为set被错误地解释为了其它内容的一部分)

解决办法:

为了解决整个问题,需要在update和set之间添加一个空格

sbSql.append("update t_user " )//注意这里面的空格.append("set user_name =?, ")

总结:

关于ORA-00971错误(缺失SET关键字)的引发多种情况如下:

引发情况描述
SQL语句错误在UPDATE或MERGE语句中,未使用SET关键字来指定要更新的列和新的值。这是ORA-00971错误最常见的引发原因。
语法错误SQL语句的其余部分可能存在语法错误,导致Oracle解析器无法正确识别SET关键字的位置。例如,可能在不支持SET关键字的语句中错误地使用了它,或者在不需要SET关键字的上下文中错误地包含了它(尽管这种情况较少见)。
复制粘贴错误在编写SQL语句时,可能从其他地方复制了部分代码,但遗漏了SET关键字。
编辑器或IDE问题在某些情况下,编辑器或IDE的自动完成功能或语法高亮可能误导了开发者,导致他们错误地认为SET关键字已经被包含在内。
变量替换失败在使用动态SQL或参数化查询时,如果变量替换失败或未正确执行,可能导致SET关键字被遗漏或格式不正确。
代码逻辑错误在构建SQL语句的Java代码中,由于逻辑错误(如条件判断错误、循环结构错误等),导致SET子句没有被正确添加。

http://www.ppmy.cn/news/1543463.html

相关文章

ReactNative 启动应用(2)

ReactNative 启动应用 简述 本节我们来看一下ReactNative在Android上启动Activity的流程,ReactNative在Android上也是一个Apk,它的实现全部都在应用层,所以它肯定也是符合我们Android应用的启动流程的,UI页面的载体也是一个Acti…

appium文本输入的多种形式

目录 一、send_keys方法 二、press_keycode方法 三、subprocess方法直接通过adb命令输入 一、send_keys方法 这个是最常用的方法,不过通常使用时要使用聚焦,也就是先点击后等待: element wait.until(EC.presence_of_element_located((By…

Redis 淘汰策略 问题

前言 相关系列 《Redis & 目录》《Redis & 淘汰策略 & 源码》《Redis & 淘汰策略 & 总结》《Redis & 淘汰策略 & 问题》 参考文献 《Redis过期策略和淘汰策略》 在内存耗尽的情况访问Redis会发生什么? 如果是读指令会正常返回…

初识字节码文件--Java

1,问题:请问以下代码,每行创建了几个对象? public static void main(String[] args) {String a "你好";String b new String("你好");String c "你" "好";} 如何查看字节码 方法一…

Python中的`update`方法详解及示例

Python中的update方法详解及示例 1. update方法简介2. update方法的应用场景3. 代码示例示例代码代码解释运行结果 4. 总结 在Python编程中,update方法是一个非常实用的工具,尤其是在处理集合(Set)数据类型时。本文将详细介绍upda…

数据库的三范式是什么?

数据库的三范式(3NF)是数据库规范化过程中的三个不同层次,旨在减少数据冗余和提高数据完整性。以下是三个范式的详细说明: 1. **第一范式(1NF)**: - **原子性**:确保数据库表的每…

深入分析-MySQL中的死锁问题排查与解决(二)

深入分析:MySQL中的死锁问题排查与解决 在高并发的数据库环境中,死锁是一个不可避免的问题。它发生在两个或多个事务互相等待对方持有的资源,导致所有相关事务无法继续执行。本文将通过一个实际案例,详细分析死锁的成因、排查过程…

深入探讨 Go 语言的函数基本概念

在现代编程中,函数是构建可重用和模块化代码的基本单元。Go 语言以其简洁和高效的特性而受到广泛欢迎,而函数在其中扮演着至关重要的角色。本文将深入探讨 Go 语言中函数的基本概念,包括函数的定义、参数、返回值、作用域以及高阶函数等内容。…