检索ResultSet值时获取IN参数而不是行

时间:2018-08-28 14:32:52

标签: java sql sql-server

我正在尝试从Java代码中调用过程。我首先创建一个CallableStatement,然后将我的参数与setString(x,“ value”)关联。

我的过程SELECT查询中的第一个结果。我可以毫无问题地从SQL Server执行该过程并得到结果。从我的Java代码中,除了我的ResultSet中的IN参数外,我什么也没得到。。。我不知道怎么可能。

这是过程创建脚本:

CREATE PROCEDURE [dbo].[sp_getTask] 
    -- Add the parameters for the stored procedure here
    @actionTypeParam nvarchar(50) = '', 
    @serverNameParam nvarchar(10) = ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT @actionTypeParam, @serverNameParam
    SELECT TOP 1 actionId, actionType, partner, fileProt FROM dbo.Ordonnancement WHERE actionType = @actionTypeParam AND serverName = @serverNameParam AND actionState = 'ACTIVE' ORDER BY actionRetry ASC, actionLocalDateTime ASC;
END
GO

这是我的Java代码调用此过程:

private static List<Action> getSyncTask() {
    List<Action> tasks = new ArrayList<Action>();

    Connection cnx;
    ResultSet rs = null;
    try {
        cnx = centralDb.getConnection();
        CallableStatement cstmt = cnx.prepareCall(PMASchedulerProcedures.GET_TASK);
        cstmt.setString(1, "sync");
        cstmt.setString(2, PMAUtils.getHostName());

        cstmt.execute();

        rs = cstmt.getResultSet();
    } catch (SQLException e) {
        logger.error("[" + String.format("%-25s","Sync program")+"    ] : " 
                + "Cannot get SQL connection  : " + e.getMessage());
    }

    try {
        while (rs.next()) {
            Action action = new Action();
            action.setActionId(rs.getInt(1));
            action.setActionType(ActionType.fromName(rs.getString(2)));
            action.setPartner(rs.getString(3));
            action.setFileProt(rs.getString(4));
            tasks.add(action);
        }
    } catch (SQLException e) {
        logger.error("[" + String.format("%-25s","Sync program")+"    ] : " 
                + "Cannot gather action informations  : " + e.getMessage());
    }
    return tasks;
}

我得到以下结果:

rs.getString(1) : sync
rs.getString(2) : PF11-40A

我在CallableStatement中设置的两个参数。

如果有人对这里发生的事情有所了解,我将很高兴听到它:)

1 个答案:

答案 0 :(得分:4)

我对Java一无所知,但是您的SQL存储过程返回了两组结果。我怀疑第一个SELECT(只是获取传入的参数)是针对某种类型的测试而设置的。尝试摆脱对SELECT的选择,如下所示:

CREATE PROCEDURE [dbo].[sp_getTask] 
    -- Add the parameters for the stored procedure here
    @actionTypeParam nvarchar(50) = '', 
    @serverNameParam nvarchar(10) = ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT TOP 1 actionId, actionType, partner, fileProt FROM dbo.Ordonnancement WHERE actionType = @actionTypeParam AND serverName = @serverNameParam AND actionState = 'ACTIVE' ORDER BY actionRetry ASC, actionLocalDateTime ASC;
END
GO