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子句没有被正确添加。 |