首页 > 数据库 >java.sql.SQLException: ORA-00971: 缺失 SET 关键字

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

时间:2024-11-01 14:46:50浏览次数:3  
标签:00971 语句 SET java 错误 update 关键字 SQL

目录

背景:

过程:

错误原因: 

解决办法:

总结:


背景:

正在运行某个项目程序,提交信息之后发现库中并没有刚刚的相关数据,后来查看后台信息,发现提示错误,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子句没有被正确添加。

标签:00971,语句,SET,java,错误,update,关键字,SQL
From: https://blog.csdn.net/weixin_59272777/article/details/143372527

相关文章

  • 2024最新IntelliJ IDEA常用的小技巧汇总,JAVA 新手上路必备
    目录一、IntelliJIDEA概述二、下载与安装2.1下载2.2安装三、快速创建并运行Java工程3.1创建Java工程3.2创建package和class四、详细设置4.1字体大小设置4.2字符编码设置4.3大小写不敏感设置4.4自动导包4.5启动退出设置4.6自动更新五、快速开发5.1代码模板......
  • java--标识符、常量、变量、类型 转换
    1、注释(增强代码可读性)java中的注释单行注释(“//”)多行注释(/**/)tips:多行注释不能嵌套,否则会报错文档注释(/***/)源代码文件(Xxxx.java)通过编译生成字节码文件(Xxxx.class)的过程中编译器会忽略掉源码中的注释部分2、关键字(赋予特定含义的单词)特点组成关键字的字母全部小......
  • 【日常记录-Java】应用引入Slf4J
    1.简介    SLF4J(SimpleLoggingFacadeforJava)是Java的一个简单日志门面,为Java日志访问提供了一套标准、规范的API框架。而具体日志的实现则可以根据这套接口去实现具体的日志框架,以便将来需要更换日志框架时,只替换实现框架即可。常见的具体实现有JUL、log4j、......
  • 【日常记录-Java】SLF4J扫描实现框架的过程
    1.简介    SLF4J(SimpleLoggingFacadeforJava)作为一种简单的门面或抽象,服务于其他各种日志框架,例如JUL、log4j、logback等,核心作用有两项:提供日志接口;提供获取具体日志对象的方法;2.扫描过程 2.1引入依赖    在使用SLF4J时,需要引入其API依赖以及......
  • JAVA 二叉树面试题
    @目录摘要代码Node节点main函数问题1:递归——求二叉树的最大深度问题2:求二叉树的最小深度问题3:求二叉树中节点的个数问题4:求二叉树中叶子节点的个数问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数问题6:判断两棵树是否相同问题7:给定一个二叉树,检查它是否是镜像对称的。问......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......
  • GEE 高阶应用:下载全球任何国家的森林损失保存到assets中
    目录简介数据函数filterMetadata(name, operator, value)Arguments:Returns: Collectionaggregate_array(property)Arguments:Returns: Listee.Number.parse(input, radix)Arguments:Returns: NumberclipToCollection(collection)Arguments:Returns: Ima......
  • Java 传参时,如何做到两个 String 实参的实际值交换_3
    ###Java传参时,如何做到两个String实参的实际值交换在Java中,所有的参数传递都是值传递,这意味着方法接收的是实参值的一个副本。对于基本数据类型,这个副本是实际值;对于对象,副本是引用的一个拷贝。因此,直接在方法内部交换两个`String`实参的实际值是不可能的。然而,可以通过一......
  • 一文彻底熟练掌握并使用Java的NIO操作
    一、基本概念JavaNIO是Java1.4引入的,用于处理高速、高并发的I/O操作。与传统的阻塞I/O不同,NIO支持非阻塞I/O和选择器,可以更高效地管理多个通道。二、核心组件通道(Channel)Channel是NIO中用于读取和写入数据的主要接口,提供双向数据传输的能力。常见的通道实现......
  • 基于Java的医疗保险报销系统设计与实现
    基于Java语言、Spring框架、SpringBoot、HTML/CSS/JavaScript、Vue、Jwt、Element-ui等技术,进行医疗保险报销系统的设计。本系统旨在将医疗保险报销系统中的分散信息进行归纳与整合,对其进行统一的信息管理,使其整个报销流程更加的系统化、科学化、透明化。在医疗保险报销系统......