当前位置: 首页 > article >正文

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

目录

背景:

过程:

错误原因: 

解决办法:

总结:


背景:

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

相关文章:

  • 【原创分享】JVM服务调优实战
  • 安卓开发之数据库的创建与删除
  • 渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下
  • appium+mumu模拟器+python 嚼碎菜鸟教程
  • 「C/C++」C++标准库之#include<fstream>文件流
  • paimon实战 -- Changelog Producer到底有什么用?
  • 瑞格智慧心理服务平台 NPreenSMSList.asmx sql注入漏洞复现
  • Python 从入门到实战43(Pandas数据结构)
  • Ika赋予Sui开发者与其他链交互的能力
  • Java | Leetcode Java题解之第517题超级洗衣机
  • 如何实现易快报合同付款申请单对接金蝶云星空
  • python 模块和包、类和对象
  • 【JSON改】同结构JSON的批量修改工具
  • 高并发设计模式之ForkJoin模式
  • ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
  • Vue学习笔记(十二)
  • 【AAOS】【源码分析】CarSystemUI
  • 分库分表常见面试问题
  • 进一步认识ICMP协议
  • PAT甲级-1074 Reversing Linked List
  • H5中文可以换行,英文无法换行
  • [nssround#4 swpu]1zweb
  • 计算合约方法的签名
  • Terraform Provider 加速方案
  • Mybatis-17.动态SQL-foreach
  • 【Unity】游戏UI中添加粒子特效导致穿层问题的解决