【问题标题】:JDBC execute SQL Server stored procedure with return value and input/output parametersJDBC 执行带有返回值和输入/输出参数的 SQL Server 存储过程
【发布时间】:2013-01-27 21:03:02
【问题描述】:

我有一个存储过程,它接受 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 spName(?, ?, ?)}

标签: sql-server stored-procedures jdbc


【解决方案1】:

调用存储过程的语法是:

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

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

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

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

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

【讨论】:

  • 你是对的!它是“?=呼叫”而不是“呼叫?=”。我多么愚蠢:-)谢谢!
【解决方案2】:

此外,对于没有任何参数的存储过程,它看起来就像...

this.connection.prepareCall("{call dbo.storedProcedure()}")

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多