StringMVC+Mybatis后台sql语句出现列名无效

2016-9-7 14:46:32 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet springMVC threw exception
java.sql.SQLSyntaxErrorException: ORA-00904: "交易成功": 标识符无效


at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3550)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:62)
at $Proxy25.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:59)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:73)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:60)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:137)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:96)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:77)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:108)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:102)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
at $Proxy9.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at $Proxy19.iTotalDisplayRecords(Unknown Source)
at com.tyzd.tenement.service.impl.SettleServiceImp.getSettle(SettleServiceImp.java:42)
at com.tyzd.tenement.controller.SettleController.getSettle(SettleController.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:612)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:503)

at java.lang.Thread.run(Thread.java:662)




它这个报的不是某个列,而是我传入的值。博主上网搜了各位大神的帖子,其实之前也遇到过一次。就是使用工具来创建数据表时会让列名带有双引号,不过这种一般你在数据库引用就会报错。

好了,不多说。博主的问题是:

<if test="status!=null and status!=''"> and s.name = ${status} </if>

因为用到模糊查询所以在其它地方使用了'%${historyID}%'来格式化传入的值,修改时一时疏忽,

语句应该为<if test="status!=null and status!=''"> and s.name = #{status} </if>

是因为符号的问题。


好了,博主第一次写。如果不到位的地方请各位大神见谅

### Oracle 数据库中列名正确但提示标识符无效的原因及解决方案 #### 原因分析 当在Oracle数据库操作,即使列名看起来是正确的,仍然可能收到`ORA-00904: 无效标识符`的错误消息。这通常是因为以下几个原因之一: - 输入的列名确实不存在于目标表或视图中[^2]。 - 列名包含特殊字符或大小写敏感问题,而这些细节未被正确处理[^4]。 #### 解决方案 针对上述提到的情况,可以采取如下措施来解决问题并验证修正效果: ##### 验证列的存在性和拼写准确性 确保所使用的列名称完全匹配实际存在于指定表格内的定义。可以通过查询数据字典视图`ALL_TAB_COLUMNS`获取当前用户可访问的所有表及其列的信息来进行确认: ```sql SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; ``` 注意这里的表名字母需保持与创建一致的大写形式(除非是在双引号内特别指定了其他格式),因为默认情况下Oracle会自动将其转换为大写字母存储。 ##### 检查并调整大小写敏感度 如果应用程序逻辑允许的话,考虑统一所有对象名为全大写的命名约定以减少混淆的可能性;对于那些已经被设定为区分大小写的特定情况,则务必严格遵循原始声明方式调用它们——即使用双引号包围住确切的名字字符串。 例如,假设有一个列为`"myColumn"`而不是MYCOLUMN,那么应该这样引用它: ```sql SELECT "myColumn" FROM YOUR_TABLE; ``` ##### 修改现有结构适应新需求 假如发现某些字段确实缺失并且有必要补充进去,可通过执行DDL命令如ALTER TABLE向相应位置追加必要的属性项[^3]: ```sql ALTER TABLE your_table ADD (new_column datatype); ``` 另外,若面临批量更正多处不规范命名的需求,一段PL/SQL脚本可以帮助自动化完成这一过程,比如将所有的下划线分隔小写字段改为连贯的大写字体[^5]。 ```plsql BEGIN FOR c IN ( SELECT COLUMN_NAME AS cn FROM all_tab_columns WHERE table_name='YOUR_TABLE' AND REGEXP_LIKE(column_name, '^[a-z_]+$') ) LOOP BEGIN EXECUTE IMMEDIATE 'ALTER TABLE YOUR_TABLE RENAME COLUMN "' || c.cn || '" TO ' || UPPER(c.cn); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error occurred while renaming column:' || SQLERRM); END; END LOOP; END; / ``` 以上方法能够有效应对大多数由于列名引起的有效性问题,从而保障SQL语句顺利运行而不触发`ORA-00904`异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值