sql-server - JDBC执行带有返回值和输入/输出参数的SQL Server存储过程

标签 sql-server stored-procedures jdbc

我有一个存储过程,它接受 1 个输入值、2 个输出参数,并且在执行时返回一个值

在互联网上我看到了使用 Call 的引用

CallableStatement cstmt = conn.prepareCall("{call ? = spName(?, ?, ?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

但这给了我错误

"Incorrect syntax near '{'"

然后我决定像 SQL Management Studio 生成的 SQL 代码一样:

CallableStatement cstmt = conn.prepareCall("exec ? = spName ?, ?, ?");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

但这给了我错误

"Incorrect syntax near '='"

我认为这是因为查询被转换为

"exec @P1 OUT = spName @P2, @P3 OUT, @P4 OUT" 

它在 SQL Management Studio 上也不起作用,因为“OUT”出现在“=”之前

这让我没有任何想法,因为这两种方式都行不通。

有什么建议吗?

谢谢!

最佳答案

调用存储过程的语法是:

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

因此,您的第一个示例会在 JDBC 调用转义的解析器中触发异常,因为您将 call 放在返回值之前。我不确定第二个的问题。

因此,如果您将第一个示例修改为:

,我希望它能够工作:
CallableStatement cstmt = conn.prepareCall("{?=call spName(?, ?, ?)}");

您可以在 MSDN 上找到专门针对 Microsoft JDBC 驱动程序的更多信息:

关于sql-server - JDBC执行带有返回值和输入/输出参数的SQL Server存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14834544/

相关文章:

sql-server - 触发器是否有 THISROW 对象

mysql - mysql存储过程中的return关键字

sql - Postgresql,函数通过调用另一个函数返回查询

java - 无法通过 jdbc 在 11g 中启动 sql db。获取 java sql 异常

sql - SQL Server 2000 不支持 ALTER TABLE my_table ADD COLUMN column_name VARCHAR(50) AFTER col_name

sql-server - 违反外键 (SQL Server 2012)

c# - 从 C# 类创建 SQL Server 数据库表

postgresql - Postgres 存储函数可以同时具有返回值和输出参数吗?

java - 使用java将从Postgres数据库收集的数据写入文本文件

java - 事务管理器未回滚