sql server存储过程,can';无法在java中返回结果集

sql server存储过程,can';无法在java中返回结果集,java,sql-server,resultset,callable-statement,Java,Sql Server,Resultset,Callable Statement,我在sql server数据库中创建了一个存储过程,该过程似乎对一条记录正确执行。代码如下所示: try { String className="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String username="username"; String url="jdbc:sqlserver://someDB:8808;SelectMethod=

我在sql server数据库中创建了一个存储过程,该过程似乎对一条记录正确执行。代码如下所示:

try {
                String className="com.microsoft.sqlserver.jdbc.SQLServerDriver";
                String username="username";
                String url="jdbc:sqlserver://someDB:8808;SelectMethod=cursor";
                String password="password";
                Class.forName(className);
                conn = DriverManager.getConnection(url, username, password);




                // need to obtain store procedure in db(a sql script stored in our sql server db)
                CallableStatement cstmt = conn.prepareCall("{call dbo.sp_SomeProc(?,?,?,?,?,?,?,?,?)}");
                cstmt.setString (1,"id34234, id34246, id234234");
                cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(3, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(7, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(8, java.sql.Types.VARCHAR);
                cstmt.registerOutParameter(9, java.sql.Types.VARCHAR);




               int rowsAffected = 0;
               boolean isResults = cstmt.execute();
               while(isResults  || rowsAffected != -1) {
                     if(isResults) {
                         rs = cstmt.getResultSet();
                         break;
                     }else {
                          rowsAffected = cstmt.getUpdateCount();
                     }
                     isResults = cstmt.getMoreResults();
               }
            while(rs.next()) {
               slInfo.add(cstmt.getString(2));
               slInfo.add(cstmt.getString(3));
               slInfo.add(cstmt.getString(4));
               slInfo.add(cstmt.getString(5));
               slInfo.add(cstmt.getString(6));
               slInfo.add(cstmt.getString(7));
               slInfo.add(cstmt.getString(8));
               slInfo.add(cstmt.getString(9));
             }


                writeToFile(outFileName, slInfo);

            }catch(SQLException ex) {
                ex.printStackTrace();

            }catch(ClassNotFoundException ex) {
                ex.printStackTrace();
            }finally {
                try { cstmt.close(); } catch (Exception e) { /* ignored */ }
                try { conn.close(); } catch (Exception e) { /* ignored */ }
            }
问题是,由于我有多个记录,我需要获得一个结果集。但是,除了
executeUpdate()
之外的每次尝试都会导致异常

我的第一次尝试:

 cstmt.execute();
 ResultSet rs = (ResultSet)cstmt.getObject(1) // not actually sure what index to use here
ResultSet rs=cstmt.executeQuery()//而不是cstmt.executeUpdate()

例外情况:
com.microsoft.sqlserver.jdbc.SQLServerException:语句未返回结果集。
在com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)

第二次尝试:

 cstmt.execute();
 ResultSet rs = (ResultSet)cstmt.getObject(1) // not actually sure what index to use here
第一次尝试似乎是我看到其他人所做的,但我不知道我做错了什么。任何帮助都将不胜感激

更新
以下是存储的进程:

USE [someDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_GetAvatarInfo] 
(
@idList VARCHAR(MAX), 
@uniqueIdent VARCHAR(64) OUTPUT,
@FULLNAME VARCHAR(128) OUTPUT, 
@CCNUMSEQ VARCHAR(64) OUTPUT, 
@ALIASTYPE VARCHAR(64) OUTPUT,
@SLNUMBER VARCHAR(64) OUTPUT,
@TISSUETYPE VARCHAR(64) OUTPUT,
@SAMPLESUBTYPE VARCHAR(64) OUTPUT,
@SUBMITTEDDIAG VARCHAR(64) OUTPUT
)
AS 
BEGIN 

DECLARE @idAvatarEvent INT,
        @avatarDisease INT;

SELECT @idAvatarEvent = idEventType
        FROM CCR.dbo.EventType
WHERE codeCancerGroup = 'TCC' AND eventType = 'Avatar';

--Create table to hold all SL ids that are involved in the search
IF (OBJECT_ID('tempdb.dbo.#SLList') IS NOT NULL) DROP TABLE #SLList;
CREATE TABLE #SLList
(
        idAlias INT NOT NULL IDENTITY (1,1)
        ,SLNumber VARCHar(100)
)


INSERT INTO #SLList (SLNumber)
SELECT [str]
FROM BST.dbo.fn_parseString(@idList, ',');

SELECT @avatarDisease = ATT.idAttribute
        FROM CCR.dbo.Attribute          ATT
          JOIN CCR.dbo.AttributeContainer ATC ON ATT.idAttributeContainer = ATC.idAttributeContainer
WHERE ATT.attributeName = 'avatarDiseaseGroup'
        AND ATC.containerName = 'Avatar'

  SELECT @PERMRN = per.mrn,
         @FULLNAME = per.firstName + ' ' + per.lastName,
         @CCNUMSEQ = ali.ccNumberSeq, 
         @ALIASTYPE = sat.aliasType, 
         @SLNUMBER = sl.SLNumber, 
         @TISSUETYPE = sst.description,
         @SAMPLESUBTYPE = case when pt.preparationType LIKE '%Formalin%' THEN 'FFPE' ELSE pt.preparationType END,
         @SUBMITTEDDIAG = ac.choice
        FROM #SLList sl
                LEFT JOIN DB1.dbo.AliquotAlias sa on sl.SLNumber = sa.alias
                LEFT JOIN DB1.dbo.AliquotAliasType sat on sa.idAliasType = sat.idAliasType
                LEFT JOIN DB1.dbo.VIEW_Aliquot2 ali on sa.idAliquot = ali.idAliquot
                LEFT JOIN DB1.dbo.Sample sam on ali.idSample = sam.id
                LEFT JOIN DB1.dbo.VIEW_SampleSubType sst on sam.codeSampleSubType = sst.codeSampleSubType
                LEFT JOIN DB1.dbo.PreparationType pt on sam.idPreparationType = pt.id
                LEFT JOIN DB1.dbo.BSTCollection col on sam.idBSTCollection = col.idBSTCollection
                LEFT JOIN DB1.dbo.BSTPatient pat on col.idBSTPatient = pat.idBSTPatient
                LEFT JOIN DB2.dbo.Person per on pat.idPerson = per.idPerson
                LEFT JOIN DB3.dbo.Patient cpat on per.idPerson = cpat.idPerson
                LEFT JOIN DB3.dbo.PatientCancerGroup pcg on cpat.idPatient = pcg.idPatient AND pcg.codeCancerGroup = 'TCC'
                LEFT JOIN DB3.dbo.MedicalEvent med on pcg.idPatient = med.idPatient AND pcg.codeCancerGroup = med.codeCancerGroup AND med.idEventType = @idAvatarEvent
                LEFT JOIN DB3.dbo.AttributeValue av on med.idAttributeValueSet = av.idAttributeValueSet AND av.idAttribute = @avatarDisease
                LEFT JOIN DB3.dbo.AttributeChoice ac on av.valueIdAttributeChoice = ac.idAttributeChoice
        ORDER BY MRN
END;

您需要修改SP以返回结果集,因为
executeQuery()
方法要求SP返回结果集

假设SP的所有其他部分都是正确的(由于各种原因,我无法在我的PC上对其进行测试),下面是应该可以工作的SP:

USE [someDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_GetAvatarInfo] 
(
    @idList VARCHAR(MAX)
)
AS 
BEGIN 

DECLARE @idAvatarEvent INT,
        @avatarDisease INT;

SELECT @idAvatarEvent = idEventType
        FROM CCR.dbo.EventType
WHERE codeCancerGroup = 'TCC' AND eventType = 'Avatar';

--Create table to hold all SL ids that are involved in the search
IF (OBJECT_ID('tempdb.dbo.#SLList') IS NOT NULL) DROP TABLE #SLList;
CREATE TABLE #SLList
(
        idAlias INT NOT NULL IDENTITY (1,1)
        ,SLNumber VARCHar(100)
)


INSERT INTO #SLList (SLNumber)
SELECT [str]
FROM BST.dbo.fn_parseString(@idList, ',');

SELECT @avatarDisease = ATT.idAttribute
        FROM CCR.dbo.Attribute          ATT
          JOIN CCR.dbo.AttributeContainer ATC ON ATT.idAttributeContainer = ATC.idAttributeContainer
WHERE ATT.attributeName = 'avatarDiseaseGroup'
        AND ATC.containerName = 'Avatar'

  SELECT per.mrn 'PERMRN',
         per.firstName + ' ' + per.lastName 'FULLNAME',
         ali.ccNumberSeq 'CCNUMSEQ', 
         sat.aliasType 'ALIASTYPE`', 
         sl.SLNumber 'SLNUMBER', 
         sst.description 'TISSUETYPE',
         case when pt.preparationType LIKE '%Formalin%' THEN 'FFPE' ELSE pt.preparationType END 'SAMPLESUBTYPE',
         ac.choice 'SUBMITTEDDIAG'
        FROM #SLList sl
                LEFT JOIN DB1.dbo.AliquotAlias sa on sl.SLNumber = sa.alias
                LEFT JOIN DB1.dbo.AliquotAliasType sat on sa.idAliasType = sat.idAliasType
                LEFT JOIN DB1.dbo.VIEW_Aliquot2 ali on sa.idAliquot = ali.idAliquot
                LEFT JOIN DB1.dbo.Sample sam on ali.idSample = sam.id
                LEFT JOIN DB1.dbo.VIEW_SampleSubType sst on sam.codeSampleSubType = sst.codeSampleSubType
                LEFT JOIN DB1.dbo.PreparationType pt on sam.idPreparationType = pt.id
                LEFT JOIN DB1.dbo.BSTCollection col on sam.idBSTCollection = col.idBSTCollection
                LEFT JOIN DB1.dbo.BSTPatient pat on col.idBSTPatient = pat.idBSTPatient
                LEFT JOIN DB2.dbo.Person per on pat.idPerson = per.idPerson
                LEFT JOIN DB3.dbo.Patient cpat on per.idPerson = cpat.idPerson
                LEFT JOIN DB3.dbo.PatientCancerGroup pcg on cpat.idPatient = pcg.idPatient AND pcg.codeCancerGroup = 'TCC'
                LEFT JOIN DB3.dbo.MedicalEvent med on pcg.idPatient = med.idPatient AND pcg.codeCancerGroup = med.codeCancerGroup AND med.idEventType = @idAvatarEvent
                LEFT JOIN DB3.dbo.AttributeValue av on med.idAttributeValueSet = av.idAttributeValueSet AND av.idAttribute = @avatarDisease
                LEFT JOIN DB3.dbo.AttributeChoice ac on av.valueIdAttributeChoice = ac.idAttributeChoice
        ORDER BY per.mrn
END;

实际上,我读过这篇文章,我试着像他那样获取结果集:
rs=cstmt.getResultSet()
。当我用这种方式尝试时,会出现空指针异常。我就是不明白为什么
cstmnt.executeUpdate()
没有出错。如果我知道存储过程不起作用,这会有所帮助,但它至少会正确返回一条记录。你能发布你的存储过程吗?看起来(根据您发布的异常情况)您根本没有返回结果集,只是返回输出参数。@ahoxha我现在添加了存储过程。您的SP没有返回结果集,只是给输出参数赋值,这就是
ResultSet rs=cstmt.executeQuery()
引发异常的原因。