Skip to main content

Problem calling stored procedures.

       When executing a stored procedure I get a SQL error “A server cursor cannot be opened on the given statement or statements.” SQLCODE = -16937. I have a couple of stored procedures that are getting the same error.  Below is my Cobol code and the create statement of the stored procedure I am using. What am I doing wrong?

           MOVE "UN" TO HV-DBIO 

           EXEC SQL

               DECLARE spcursor CURSOR for

                   CALL sp_SysGenIO (:HV-DBIO)

           END-EXEC.

           EXEC SQL OPEN spcursor END-EXEC.

           EXEC SQL

               FETCH spcursor 

                 INTO

                 :GENERIC-SYS-UID,

                 :GENERIC-SEQUENCE-NUM

           END-EXEC.

 

 

CREATE PROCEDURE [dbo].[sp_SysGenIO]

      @DbIO Char(02)

     

AS

BEGIN

   DECLARE @SQLfunction           Char(02);

   DECLARE @PriKey               INT = 0;

  

   SET @SQLfunction = @DbIO

  

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

      SET XACT_ABORT ON;

      BEGIN TRY

   BEGIN TRANSACTION tranSysGenIO

       SELECT GENERIC_SYS_UID,

               GENERIC_SEQUENCE_NUM

       FROM SYSGEN WITH (UPDLOCK)

       WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'UN'

       UPDATE SYSGEN

         SET GENERIC_SYS_UID = GENERIC_SYS_UID 1

           WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'SN'

       UPDATE SYSGEN        

         SET GENERIC_SEQUENCE_NUM     = GENERIC_SEQUENCE_NUM 1

       WHERE PRIMARY_KEY = @PriKey;

   COMMIT TRANSACTION tranSysGenIO;      

   END TRY

   BEGIN CATCH

       DECLARE @STATE INT;

       SET @STATE = ERROR_STATE();

       IF XACT_STATE() = -1

         BEGIN

             ROLLBACK TRANSACTION tranSysGenIO;

         END  

       ELSE IF XACT_STATE() = 1

           BEGIN

             COMMIT TRANSACTION tranSysGenIO;

           END    

        

   END CATCH

ENDALL:

END

 

 

 

 

Problem calling stored procedures.

       When executing a stored procedure I get a SQL error “A server cursor cannot be opened on the given statement or statements.” SQLCODE = -16937. I have a couple of stored procedures that are getting the same error.  Below is my Cobol code and the create statement of the stored procedure I am using. What am I doing wrong?

           MOVE "UN" TO HV-DBIO 

           EXEC SQL

               DECLARE spcursor CURSOR for

                   CALL sp_SysGenIO (:HV-DBIO)

           END-EXEC.

           EXEC SQL OPEN spcursor END-EXEC.

           EXEC SQL

               FETCH spcursor 

                 INTO

                 :GENERIC-SYS-UID,

                 :GENERIC-SEQUENCE-NUM

           END-EXEC.

 

 

CREATE PROCEDURE [dbo].[sp_SysGenIO]

      @DbIO Char(02)

     

AS

BEGIN

   DECLARE @SQLfunction           Char(02);

   DECLARE @PriKey               INT = 0;

  

   SET @SQLfunction = @DbIO

  

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

      SET XACT_ABORT ON;

      BEGIN TRY

   BEGIN TRANSACTION tranSysGenIO

       SELECT GENERIC_SYS_UID,

               GENERIC_SEQUENCE_NUM

       FROM SYSGEN WITH (UPDLOCK)

       WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'UN'

       UPDATE SYSGEN

         SET GENERIC_SYS_UID = GENERIC_SYS_UID 1

           WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'SN'

       UPDATE SYSGEN        

         SET GENERIC_SEQUENCE_NUM     = GENERIC_SEQUENCE_NUM 1

       WHERE PRIMARY_KEY = @PriKey;

   COMMIT TRANSACTION tranSysGenIO;      

   END TRY

   BEGIN CATCH

       DECLARE @STATE INT;

       SET @STATE = ERROR_STATE();

       IF XACT_STATE() = -1

         BEGIN

             ROLLBACK TRANSACTION tranSysGenIO;

         END  

       ELSE IF XACT_STATE() = 1

           BEGIN

             COMMIT TRANSACTION tranSysGenIO;

           END    

        

   END CATCH

ENDALL:

END

 

 

 

 

I tested this here using Visual COBOL 2.2 for Visual Studio 2012 in both a native application using ODBC and a managed application using ADO.NET and it worked fine for me.

What product version and DBMAN directive are you using, ODBC, ADO, JDBC?

What version of the SQL Server driver are you using?

Thanks.


Problem calling stored procedures.

       When executing a stored procedure I get a SQL error “A server cursor cannot be opened on the given statement or statements.” SQLCODE = -16937. I have a couple of stored procedures that are getting the same error.  Below is my Cobol code and the create statement of the stored procedure I am using. What am I doing wrong?

           MOVE "UN" TO HV-DBIO 

           EXEC SQL

               DECLARE spcursor CURSOR for

                   CALL sp_SysGenIO (:HV-DBIO)

           END-EXEC.

           EXEC SQL OPEN spcursor END-EXEC.

           EXEC SQL

               FETCH spcursor 

                 INTO

                 :GENERIC-SYS-UID,

                 :GENERIC-SEQUENCE-NUM

           END-EXEC.

 

 

CREATE PROCEDURE [dbo].[sp_SysGenIO]

      @DbIO Char(02)

     

AS

BEGIN

   DECLARE @SQLfunction           Char(02);

   DECLARE @PriKey               INT = 0;

  

   SET @SQLfunction = @DbIO

  

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

      SET XACT_ABORT ON;

      BEGIN TRY

   BEGIN TRANSACTION tranSysGenIO

       SELECT GENERIC_SYS_UID,

               GENERIC_SEQUENCE_NUM

       FROM SYSGEN WITH (UPDLOCK)

       WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'UN'

       UPDATE SYSGEN

         SET GENERIC_SYS_UID = GENERIC_SYS_UID 1

           WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'SN'

       UPDATE SYSGEN        

         SET GENERIC_SEQUENCE_NUM     = GENERIC_SEQUENCE_NUM 1

       WHERE PRIMARY_KEY = @PriKey;

   COMMIT TRANSACTION tranSysGenIO;      

   END TRY

   BEGIN CATCH

       DECLARE @STATE INT;

       SET @STATE = ERROR_STATE();

       IF XACT_STATE() = -1

         BEGIN

             ROLLBACK TRANSACTION tranSysGenIO;

         END  

       ELSE IF XACT_STATE() = 1

           BEGIN

             COMMIT TRANSACTION tranSysGenIO;

           END    

        

   END CATCH

ENDALL:

END

 

 

 

 

Hi Chris

This is my directives, do I have something not correct?

DBMAN = ADO

BEHAVIOR=ANSI

TARGETDB = MSSQLSERVER

System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Thanks


Problem calling stored procedures.

       When executing a stored procedure I get a SQL error “A server cursor cannot be opened on the given statement or statements.” SQLCODE = -16937. I have a couple of stored procedures that are getting the same error.  Below is my Cobol code and the create statement of the stored procedure I am using. What am I doing wrong?

           MOVE "UN" TO HV-DBIO 

           EXEC SQL

               DECLARE spcursor CURSOR for

                   CALL sp_SysGenIO (:HV-DBIO)

           END-EXEC.

           EXEC SQL OPEN spcursor END-EXEC.

           EXEC SQL

               FETCH spcursor 

                 INTO

                 :GENERIC-SYS-UID,

                 :GENERIC-SEQUENCE-NUM

           END-EXEC.

 

 

CREATE PROCEDURE [dbo].[sp_SysGenIO]

      @DbIO Char(02)

     

AS

BEGIN

   DECLARE @SQLfunction           Char(02);

   DECLARE @PriKey               INT = 0;

  

   SET @SQLfunction = @DbIO

  

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

      SET XACT_ABORT ON;

      BEGIN TRY

   BEGIN TRANSACTION tranSysGenIO

       SELECT GENERIC_SYS_UID,

               GENERIC_SEQUENCE_NUM

       FROM SYSGEN WITH (UPDLOCK)

       WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'UN'

       UPDATE SYSGEN

         SET GENERIC_SYS_UID = GENERIC_SYS_UID 1

           WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'SN'

       UPDATE SYSGEN        

         SET GENERIC_SEQUENCE_NUM     = GENERIC_SEQUENCE_NUM 1

       WHERE PRIMARY_KEY = @PriKey;

   COMMIT TRANSACTION tranSysGenIO;      

   END TRY

   BEGIN CATCH

       DECLARE @STATE INT;

       SET @STATE = ERROR_STATE();

       IF XACT_STATE() = -1

         BEGIN

             ROLLBACK TRANSACTION tranSysGenIO;

         END  

       ELSE IF XACT_STATE() = 1

           BEGIN

             COMMIT TRANSACTION tranSysGenIO;

           END    

        

   END CATCH

ENDALL:

END

 

 

 

 

It is the BEHAVIOR=ANSI that is causing this.

I just changed on my system and I can now reproduce the error.

Try setting BEHAVIOR=MAINFRAME and that should work.


Problem calling stored procedures.

       When executing a stored procedure I get a SQL error “A server cursor cannot be opened on the given statement or statements.” SQLCODE = -16937. I have a couple of stored procedures that are getting the same error.  Below is my Cobol code and the create statement of the stored procedure I am using. What am I doing wrong?

           MOVE "UN" TO HV-DBIO 

           EXEC SQL

               DECLARE spcursor CURSOR for

                   CALL sp_SysGenIO (:HV-DBIO)

           END-EXEC.

           EXEC SQL OPEN spcursor END-EXEC.

           EXEC SQL

               FETCH spcursor 

                 INTO

                 :GENERIC-SYS-UID,

                 :GENERIC-SEQUENCE-NUM

           END-EXEC.

 

 

CREATE PROCEDURE [dbo].[sp_SysGenIO]

      @DbIO Char(02)

     

AS

BEGIN

   DECLARE @SQLfunction           Char(02);

   DECLARE @PriKey               INT = 0;

  

   SET @SQLfunction = @DbIO

  

      -- SET NOCOUNT ON added to prevent extra result sets from

      -- interfering with SELECT statements.

      SET NOCOUNT ON;

      SET XACT_ABORT ON;

      BEGIN TRY

   BEGIN TRANSACTION tranSysGenIO

       SELECT GENERIC_SYS_UID,

               GENERIC_SEQUENCE_NUM

       FROM SYSGEN WITH (UPDLOCK)

       WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'UN'

       UPDATE SYSGEN

         SET GENERIC_SYS_UID = GENERIC_SYS_UID 1

           WHERE PRIMARY_KEY = @PriKey;

   IF @SQLfunction = 'SN'

       UPDATE SYSGEN        

         SET GENERIC_SEQUENCE_NUM     = GENERIC_SEQUENCE_NUM 1

       WHERE PRIMARY_KEY = @PriKey;

   COMMIT TRANSACTION tranSysGenIO;      

   END TRY

   BEGIN CATCH

       DECLARE @STATE INT;

       SET @STATE = ERROR_STATE();

       IF XACT_STATE() = -1

         BEGIN

             ROLLBACK TRANSACTION tranSysGenIO;

         END  

       ELSE IF XACT_STATE() = 1

           BEGIN

             COMMIT TRANSACTION tranSysGenIO;

           END    

        

   END CATCH

ENDALL:

END

 

 

 

 

Thanks Chris

That did it