我有一个调用另一个存储过程的存储过程。内部存储过程返回结果集。使用CallableStatement
执行调用存储过程后,我无法获取被调用的存储过程返回的结果集。
我尝试了execute
和executeQuery
来执行可调用语句。当我从SQL Server执行调用存储过程时,我得到了正确的结果。
通话程序: -
ALTER PROC [User].[Get_Data]
(@UserID NVARCHAR(20))
AS
BEGIN
Select 'User Data'
Exec [Order].[Get_Order] @UserID
END
被叫程序: -
ALTER PROC [Order].[Get_Order]
(@UserID NVARCHAR(20))
AS
BEGIN
Select * from orders where userId=@UserID
END
答案 0 :(得分:0)
您无法直接在 SQL Server 本身中选择存储过程的结果。您需要先将结果插入临时表中,如下例所示。
使用示例:
-- Create a tempoary table to store the results.
CREATE TABLE #UserOrderDetail
(
UserData NVARCHAR(50) -- Your columns here
)
-- Insert result into temp table.
-- Note that the columns returned from procedure has to match columns in your temp table.
INSERT INTO #UserOrderDetail
EXEC [Order].[Get_Order] @UserID
-- Select the results out of the temp table.
SELECT *
FROM #UserOrderDetail
如果只想将一个或多个结果集返回给客户端应用程序,则应确保将SET NOCOUNT ON语句添加到存储过程的顶部,这将阻止SQL Server将DONE_IN_PROC消息发送到存储过程中每个语句的客户端。 ODBC,JDBC和OLEDB等数据库库可能会被SQL Server存储过程中执行的各种insert和update语句返回的行计数混淆。您的原始程序如下:
ALTER PROC [User].[Get_Data]
(
@UserID NVARCHAR(20)
)
AS
BEGIN
SET NOCOUNT ON
SELECT 'User Data'
EXEC [Order].[Get_Order] @UserID
END
答案 1 :(得分:0)
您的外部存储过程返回两个结果集:
Select 'User Data'
Exec [Order].[Get_Order] @UserID
您需要调用.getMoreResults()
才能检索第二个结果集,例如
CallableStatement cs = connection.prepareCall("{CALL Get_Data (?)}");
cs.setString(1, "gord");
ResultSet rs = cs.executeQuery();
System.out.println("[First result set]");
while (rs.next()) {
System.out.printf("(No column name): %s%n", rs.getString(1));
}
cs.getMoreResults();
rs = cs.getResultSet();
System.out.println();
System.out.println("[Second result set]");
while (rs.next()) {
System.out.printf("userId: %s, orderId: %s%n",
rs.getString("userId"), rs.getString("orderId"));
}
制造
[First result set]
(No column name): User Data
[Second result set]
userId: gord, orderId: order1
userId: gord, orderId: order2
(使用连接到SQL Server 2014的mssql-jdbc-6.2.1.jre8.jar进行测试。)
有关详情,请参阅
How to get *everything* back from a stored procedure using JDBC