[Microsoft][SQLServer JDBC Driver]Invalid parameter binding(s).错误求解

本文记录了在Java程序中调用SQL Server存储过程时遇到的“Invalid parameter binding”错误及详细堆栈跟踪。通过分析SQL Server JDBC驱动的错误信息和提供的测试存储过程代码、Java调用示例,探讨可能的问题原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做一个项目,需要用到存储过程,在java程序调用,可是执行时产生错误:

[Microsoft][SQLServer JDBC Driver]Invalid parameter binding(s).

at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
 at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
 at com.microsoft.jdbc.base.BasePreparedStatement.validateParameters(Unknown Source)
 at com.microsoft.jdbc.base.BasePreparedStatement.validateParameters(Unknown Source)
 at com.microsoft.jdbc.base.BasePreparedStatement.preImplExecute(Unknown Source)
 at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
 at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown Source)
 at com.microsoft.jdbc.base.BasePreparedStatement.executeQuery(Unknown Source)
 at com.jinchuang.huizong.Huizong2UseStoredPro.query(Huizong2UseStoredPro.java:146)
 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:324)
 at com.jinchuang.sys.GenericAction.dispatchMethod(GenericAction.java:82)
 at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
 at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
 at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:113)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:90)[12:52:59.609]   releaseConnection(), activeCount=1, useCount=0
forwardname:[TestdisplayBiao2]
Action执行完 query 方法,forward向TestdisplayBiao2

 at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:99)
 at com.jinchuang.runtime.SetEncoding.doFilter(SetEncoding.java:21)
 at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
 at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163)
 at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:207)
 at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:249)
 at com.caucho.server.port.TcpConnection.run(TcpConnection.java:327)
 at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:450)
 at com.caucho.util.ThreadPool.run(ThreadPool.java:394)
 at java.lang.Thread.run(Thread.java:534)

--------------------------------------------------------------------------------------------

这是测试存储过程:

CREATE PROCEDURE dbo.ZXQY_huiong2Test
(

 @orderIndex char OUTPUT,   --省合计索引
 @shidi      char OUTPUT,   --地市
 @zh_flag    integer                  --审核标示
)

AS
Begin
 select '1' as orderIndex, '全省合计(108个)' as shidi
 into temp_huizong2 
 from xxhxxk where flag=@zh_flag
 union
    select '11' as orderIndex, '济南' as shidi
    from xxhxxk where  flag=@zh_flag and area_id like '531%'

select @orderIndex=orderIndex,@shidi=shidi from temp_huizong2

END
print @orderIndex

return 100
 ------------------------------------------------------------------------------------------------------

JAVA 程序中调用:

CallableStatement cstmt2 = myConnection.prepareCall("{?=call dbo.ZXQY_huizong2Test(?,?,?)}");
   cstmt2.registerOutParameter(1,java.sql.Types.CHAR);
   cstmt2.registerOutParameter(2,java.sql.Types.CHAR);
   
   cstmt2.setInt(3,2);
 
   System.out.println("-------------->Register Out Parameter<----------------");
   cstmt2.executeQuery(); //执行

   System.out.println("-------------->Test the Stored Procedure<-------------------");
   System.out.println(cstmt2.getString(1));

------------------------------------------------------------------------------------------------------

结果在cstmt2.executeQuery(); //执行   这儿产生错误。

在网络上找了好多,但是也没有很好的解决方法,有说是驱动的原因,我的sqlserver2000,sp3,操作系统:XP sp2(英文),服务器:resin-3.0.9

请教高手,谢谢!

<think>我们正在处理一个Java程序调用Oracle数据库时出现的SQL语法错误:ORA-00903: invalid table name。根据提供的引用信息,我们可以看到在引用[1]中,错误是由于在SQL语句中多了一个"with"关键字导致的。去掉多余的"with"后,SQL语句执行成功。 错误分析: ORA-00903错误通常表示SQL语句中使用了无效的表名或视图名。可能的原因包括: 1. 表名或视图名拼写错误。 2. 表名或视图名不存在。 3. SQL语句语法错误,比如在应该使用一个表名的地方使用了多个表名,或者关键字使用错误(如引用[1]中多余的with)。 4. 在SQL语句中使用了保留字作为表名或列名而没有用引号括起来。 根据引用[1]的示例,错误发生在使用WITH子句时。在同一个SQL语句中,WITH子句只能出现一次,然后可以定义多个公用表表达式(CTE),每个CTE用逗号分隔。引用[1]中的错误在于重复使用了WITH关键字。 原始错误SQL(引用[1]): 1 with sss as (...), 2 with t as (...) 3 select * from t,sss 正确的写法应该是: with sss as (...), t as (...) select * from t, sss; 因此,在编写SQL时,应该确保WITH关键字只出现一次,后面跟着多个用逗号分隔的CTE。 另外,引用[2]提到了另一个错误ORA-00600,这是一个内部错误,与cursor_sharing设置为FORCE有关。但用户当前的问题是关于ORA-00903,所以我们先专注于解决ORA-00903。 解决步骤: 1. 检查SQL语句中表名和视图名的拼写是否正确,确保它们存在于数据库中。 2. 检查SQL语句的语法,特别是WITH子句的使用(如果使用了的话),确保只使用一个WITH关键字,并且多个CTE之间用逗号分隔。 3. 如果表名或列名是Oracle的保留字,需要用双引号括起来(注意:在Oracle中,使用双引号的对象名是大小写敏感的,而不用双引号则默认大写)。 4. 在Java程序中,可能是由于字符串拼接导致的SQL语句错误,建议打印出最终执行的SQL语句,以便于调试。 示例:在Java中,如果使用PreparedStatement,可以通过打印SQL字符串来检查(注意:PreparedStatement的toString()可能不会返回完整的SQL,所以最好在日志中记录拼接的SQL字符串)。 假设用户提供的错误信息与引用[1]类似,即SQL语句中出现了多余的WITH关键字,那么应该修改SQL字符串,去掉多余的WITH。 例如,将原来的: String sql = "with sss as (select ...), with t as (select ...) select * from t, sss"; 修改为: String sql = "with sss as (select ...), t as (select ...) select * from t, sss"; 另外,注意在Oracle中,CTE(公用表表达式)的名称不能重复,且每个CTE的查询语句要正确。 如果问题不是由WITH子句引起的,那么需要检查其他部分,比如FROM子句中的表名是否正确,是否有权限访问等。 总结:ORA-00903错误通常由SQL语句的语法错误或对象名无效引起。根据引用[1]的示例,我们应特别注意WITH子句的用法。在Java程序中,确保传递给数据库的SQL语句是语法正确的。 如果用户提供了具体的SQL语句,我们可以进一步分析。但基于当前信息,我们给出一般性的解决步骤。 相关问题: 1. 如何避免在Java程序中拼接SQL语句时出现语法错误? 2. 在Oracle数据库中,如何查询一个表是否存在? 3. 如何正确处理Oracle中的保留字作为表名或列名?</think>### ORA-00903: "invalid table name" 错误分析与解决方案 当 Java 程序调用 Oracle 数据库时出现 `ORA-00903: invalid table name` 错误,通常表示 SQL 语句中存在表名引用问题。根据引用[1]的案例,常见原因和解决方案如下: #### 🔍 错误原因分析 1. **SQL 语法错误**(最常见) - 在 `WITH` 子句等特殊语法中重复关键字(如引用[1]中多余的 `with`) - 表名/列名使用 Oracle 保留字未加引号(如 `USER`, `ORDER` 等) - 表名拼写错误或大小写不匹配(Oracle 默认表名大写) 2. **对象权限问题** - 当前数据库用户无目标表的访问权限 3. **JDBC 配置问题** - 连接串指向错误数据库实例 - 表名包含特殊字符未正确处理 #### 🛠️ 解决方案步骤 1. **检查 SQL 语法** ```java // 错误示例(重复 with) String sql = "WITH temp1 AS (...), WITH temp2 AS (...) SELECT ..."; // 修正后(单 with 定义多个 CTE) String sql = "WITH temp1 AS (...), temp2 AS (...) SELECT ..."; ``` 2. **验证表名有效性** - 在 SQL*Plus 中执行: ```sql SELECT owner, table_name FROM all_tables WHERE UPPER(table_name) = UPPER('你的表名'); ``` 3. **处理保留字** 对保留字表名使用双引号(需保持大小写一致): ```java // 正确写法 String sql = "SELECT * FROM \"USER\" WHERE id = ?"; ``` 4. **检查 JDBC 连接** 确认连接串包含正确 schema: ```java // 示例连接串 jdbc:oracle:thin:@//host:port/service_name?currentSchema=MY_SCHEMA ``` 5. **权限检查** 授予当前用户权限: ```sql GRANT SELECT ON 目标表名 TO 当前用户名; ``` #### 📝 最佳实践 1. 在 Java 中使用预编译语句: ```java try (PreparedStatement stmt = conn.prepareStatement( "SELECT * FROM employees WHERE dept = ?")) { stmt.setString(1, "IT"); ResultSet rs = stmt.executeQuery(); } ``` 2. 启用 JDBC 日志检查最终 SQL: ```java // 添加日志参数 jdbc:oracle:thin:...?oracle.jdbc.Trace=true ``` 3. 使用 SQL 验证工具(如 Oracle SQL Developer)预先测试语句 #### 💡 进阶排查 若问题持续: 1. 检查 `dba_objects` 确认表状态: ```sql SELECT status, created FROM dba_objects WHERE object_name = UPPER('表名') AND object_type = 'TABLE'; ``` 2. 验证同义词有效性: ```sql SELECT table_owner, table_name FROM dba_synonyms WHERE synonym_name = UPPER('表名'); ``` > 引用[1]案例表明,此类错误通常由简单的语法问题引起(如多余的 `with` 关键字),通过逐步验证 SQL 结构可快速定位[^1]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值