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

embedded/2024/12/27 9:20:48/

目录

背景:

过程:

错误原因: 

解决办法:

总结:


背景:

正在运行某个项目程序,提交信息之后发现库中并没有刚刚的相关数据,后来查看后台信息,发现提示错误,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/embedded/133983.html

相关文章

音视频同步版本【基于音频】

其实和基于外部时钟的原理操作基本上一模一样。只不过音频帧不需要去匹配现实时钟了,只有视频帧需要匹配现实时钟。而视频帧需要去匹配音频帧的时间,那么就需要给时钟设置一个补偿,因为现在是以音频帧为标准。假如现在现实时钟到了50pts&…

学会定制化 Go 项目的 error,回溯错误的原因和发生位置

‍Go语言的Error处理一直被人吐槽,吐槽的点除了一个接一个的 if err ! nil 的判断外,还有人说Go的错误太原始不能像其他语言那样在抛出异常的时候的时候传一个Casue Exception 把导致异常的整个原因链串起来。 第一点确实是事实,但…

《MYSQL 实战45讲》深入浅出ORDER BY底层

慢查询日志这个路径下,但是打不开 内存临时表 现在有一个业务功能是从一个单词表里面随机选出3个单词出来 这个表有10000条数据。 select word from words order by rank() limit 3 使用执行计划查看结果: select_type是SIMPLE表示改查询不包含子查询…

Vue前端开发:事件绑定方式

事件定义 在Vue中,当一个元素通过使用v-on或语法糖指令绑定某个事件后,则完成了事件被定义的过程,在这定义的过程中,指令的后面是定义事件的名称,等号的后面是事件被触发后执行的函数,当然,也可…

MySQL——test4(综合练习)

目录 建库建表(题目)处理表1. 修改student 表中年龄(sage)字段属性,数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引,索引名为SC_INDE…

国内对接使用GPT解决方案——API中转

在这个数字化时代,人工智能(AI)已经成为各行各业不可或缺的一部分。然而,对于国内用户来说,直接对接和使用GPT等大型AI模型却面临着诸多挑战。今天,我们将一起探讨这些挑战,并介绍一种解决方案—…

unity3d——Time

在Unity3D中,Time类是一个非常重要的工具类,它提供了一系列与时间相关的属性和方法,帮助开发者在游戏中实现各种时间相关的操作。以下是一些Time类常用的方法及其示例: 一、常用属性 Time.time 含义:表示从游戏开始到…

Servlet 3.0 新特性全解

文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…