Home All Groups Group Topic Archive Search About

Using break with nested cursors

Author
9 Jun 2006 7:46 PM
vguddanti
I wrote a stored proccedure with nested cursors. If one condition
failed in the first child cursor, break that child fetch, and should go
to the parent cursor and continue looping to next row.

My problem is when a condition falis in CHILD 1, then the PARENT FETCH
also exiting. It is not going to the next row. Can anybody please help
me? I am adding my stored proc too
Ex:


PARENT CURSOR START
       CHILD 1 CURSOR START

          IF (1=0)
             BREAK

       CHILD 1 CURSOR END

       CHILD 2 CURSOR START

          IF (1=0)
             BREAK

       CHILD 2 CURSOR END
PARENT CURSOR END



SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

--region [dbo].[PQTest]

------------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[PQTest]
    --Lead Options
    @PLoan varchar(50),
    @SLoan bit,
    @UnSLoan bit = 1,
    @PersonalGuarantee bit,
    -- RAs
    @CUR money = null,
    @QWIK money = null,
    @OPM money = null,
    @ROA money = null,
    @DPO money = null,
    @DI money = null,
    @SALES2NETFA money = null,
    @SALES2WC money = null,
    @ASSETTURN money = null,
    @FA_EQUITY money = null,
    @LIAB_EQUITY money = null,
    @COGS_AP money = null,
    @EBIT_INT money = null,
    @DEPS_SALES money = null,
    @DSO money = null,
    --LIs
    @CA money = null,
    @FA money = null,
    @ASSETS money = null,
    @CL money = null,
    @LTL money = null,
    @LIABS money = null,
    @EQUITY money = null,
    @SALES money = null,
    @COGS money = null,
    @EXP money = null,
    @ORDINCM money = null,
    @NEROTHER money = null,
    @NI money = null


AS

SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

DECLARE @PartnerID INT
DECLARE @Check bit
DECLARE @TableVar TABLE (PartnerID int)

DECLARE @RAAbbrev varchar(15)
DECLARE @RAOperator varchar (15)
DECLARE @RAValue money
DECLARE @CustRAValue money

DECLARE @LIAbbrev varchar(15)
DECLARE @LIOperator varchar (15)
DECLARE @LIValue money
DECLARE @CustLIValue money

SET @Check = 1  -- true by default

/****************************************RA
Comporision*******************************************************/

DECLARE Partners_Cursor CURSOR FOR
    SELECT PartnerID
    FROM
    [dbo].[Partners]
    WHERE (
           (
           ('''' + REPLACE(PLoan, ',', ''',''') + '''') LIKE '%' + @PLoan+
'%') OR
                   PLoan IS NULL OR
                   LTRIM(RTRIM(PLoan)) = ''
           ) AND
           SLoanRequired = @SLoan AND
           PersonalGuaranteeRequired = @PersonalGuarantee  for read only

OPEN Partners_Cursor
FETCH NEXT FROM Partners_Cursor INTO @PartnerID

WHILE @@FETCH_STATUS = 0
BEGIN

    /*********************Child 1
Cursor***********************************/

    DECLARE RA_Cursor CURSOR FOR
       SELECT RAAbbrev, Operator, Value FROM ToleranceRAValues RA INNER
JOIN RADesc DES ON
          RA.RAID = DES.RADescID where partnerID = @PartnerID for read only

       OPEN RA_Cursor
       FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue

       WHILE @@fetch_status = 0
         BEGIN

        SELECT @CustRAValue = ( SELECT
                      CASE
                    WHEN @RAAbbrev = 'CUR' THEN cast(@CUR as money)
                    WHEN @RAAbbrev = 'QWIK' THEN cast(@QWIK as money)
                    WHEN @RAAbbrev = 'OPM' THEN cast(@OPM as money)
                    WHEN @RAAbbrev = 'ROA' THEN cast(@ROA as money)
                    WHEN @RAAbbrev = 'DPO' THEN cast(@DPO as money)
                    WHEN @RAAbbrev = 'DI' THEN cast(@DI as money)
                    WHEN @RAAbbrev = 'SALES2NETFA' THEN cast(@SALES2NETFA as money)
                    WHEN @RAAbbrev = 'SALES2WC' THEN cast(@SALES2WC as money)
                    WHEN @RAAbbrev = 'ASSETTURN' THEN cast(@ASSETTURN as money)
                    WHEN @RAAbbrev = 'FA_EQUITY' THEN cast(@FA_EQUITY as money)
                    WHEN @RAAbbrev = 'LIAB_EQUITY' THEN cast(@LIAB_EQUITY as money)
                    WHEN @RAAbbrev = 'COGS_AP' THEN cast(@COGS_AP as money)
                    WHEN @RAAbbrev = 'EBIT_INT' THEN cast(@EBIT_INT as money)
                    WHEN @RAAbbrev = 'DEPS_SALES' THEN cast(@DEPS_SALES as money)
                    WHEN @RAAbbrev = 'DSO' THEN cast(@DSO as money)
                      END
                   )

        print 'PartnerID: ' + cast(@partnerid as varchar)
        print 'RAOperator: ' + cast(@RAOperator as varchar)
        print 'CustRAValue: ' + cast(@CustRAValue as varchar)
        print 'RAOperator: ' + cast(@RAOperator as varchar)
        print 'RAValue: ' + cast(@RAValue as varchar)



        IF (@RAOperator = '>')
          BEGIN
              --if (@CustRAValue >= @RAValue)
               if (@CustRAValue < @RAValue)
            BEGIN
               SET @Check = 0
               print 'Check: ' + cast(@Check as varchar)
               BREAK;
            END
          END
        IF (@RAOperator = '<')
          BEGIN
              if (@CustRAValue > @RAValue)
            BEGIN
               SET @Check = 0
               print 'Check: ' + cast(@Check as varchar)
               BREAK;
            END
          END


           FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue
       END

    CLOSE RA_Cursor
    DEALLOCATE RA_Cursor
    /*********************Child 1 end******************************/

    -- Compare against line items only of no RAs comparision failed or no
RAs
    IF (@Check = 1)
      BEGIN

    /*********************Child 2
Cursor***********************************/
    DECLARE LI_Cursor CURSOR FOR
       SELECT LIAbbrev, Operator, Value FROM ToleranceLIValues LI INNER
JOIN LIDesc DES ON
          LI.LIID = DES.LIDescID where partnerID = @PartnerID for read only

       OPEN LI_Cursor
       FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue

       WHILE @@fetch_status = 0
         BEGIN

        SELECT @CustLIValue = ( SELECT
                      CASE
                    WHEN @LIAbbrev = 'CA' THEN cast(@CA as money)
                    WHEN @LIAbbrev = 'FA' THEN cast(@FA as money)
                    WHEN @LIAbbrev = 'ASSETS' THEN cast(@ASSETS as money)
                    WHEN @LIAbbrev = 'CL' THEN cast(@CL as money)
                    WHEN @LIAbbrev = 'LTL' THEN cast(@LTL as money)
                    WHEN @LIAbbrev = 'LIABS' THEN cast(@LIABS as money)
                    WHEN @LIAbbrev = 'EQUITY' THEN cast(@EQUITY as money)
                    WHEN @LIAbbrev = 'SALES' THEN cast(@SALES as money)
                    WHEN @LIAbbrev = 'COGS' THEN cast(@COGS as money)
                    WHEN @LIAbbrev = 'EXP' THEN cast(@EXP as money)
                    WHEN @LIAbbrev = 'ORDINCM' THEN cast(@ORDINCM as money)
                    WHEN @LIAbbrev = 'NEROTHER' THEN cast(@NEROTHER as money)
                    WHEN @LIAbbrev = 'NI' THEN cast(@NI as money)
                      END
               )

        print 'PartnerID: ' + cast(@partnerid as varchar)
        print 'LIOperator: ' + cast(@LIOperator as varchar)
        print 'CustLIValue: ' + cast(@CustLIValue as varchar)
        print 'LIOperator: ' + cast(@LIOperator as varchar)
        print 'LIValue: ' + cast(@LIValue as varchar)

        IF (@LIOperator = '>')
          BEGIN
              if (@CustLIValue < @LIValue)
            BEGIN
               SET @Check = 0
               print 'Check: ' + cast(@Check as varchar)
               --BREAK;
            END
          END
        IF (@LIOperator = '<')
          BEGIN
              if (@CustLIValue > @LIValue)
            BEGIN
               SET @Check = 0
               print 'Check: ' + cast(@Check as varchar)
               --BREAK;
            END
          END


           FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue
       END

    CLOSE LI_Cursor
    DEALLOCATE LI_Cursor
    /*********************Child 2 Cursor
end******************************/

    END

    -- save partnerid in temp table when all the checks passed or if no
tolerances exists
    IF (@Check = 1)
        INSERT INTO @TableVar (Partnerid) VALUES (@PartnerID)


     FETCH NEXT FROM Partners_Cursor INTO @PartnerID
   END

CLOSE Partners_Cursor
DEALLOCATE Partners_Cursor

select * from @TableVar

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Author
9 Jun 2006 8:33 PM
vguddanti
I found where the problem was. This is the problem with @Check flag
that I am using. This needs to be reset. This is not a problem with
BREAK.

Thanks


vgudda***@gmail.com wrote:
Show quote
> I wrote a stored proccedure with nested cursors. If one condition
> failed in the first child cursor, break that child fetch, and should go
> to the parent cursor and continue looping to next row.
>
> My problem is when a condition falis in CHILD 1, then the PARENT FETCH
> also exiting. It is not going to the next row. Can anybody please help
> me? I am adding my stored proc too
> Ex:
>
>
> PARENT CURSOR START
>        CHILD 1 CURSOR START
>
>           IF (1=0)
>              BREAK
>
>        CHILD 1 CURSOR END
>
>        CHILD 2 CURSOR START
>
>           IF (1=0)
>              BREAK
>
>        CHILD 2 CURSOR END
> PARENT CURSOR END
>
>
>
> SET QUOTED_IDENTIFIER ON
> GO
> SET ANSI_NULLS ON
> GO
>
> --region [dbo].[PQTest]
>
> ------------------------------------------------------------------------------------------------------------------------
> CREATE PROCEDURE [dbo].[PQTest]
>     --Lead Options
>     @PLoan varchar(50),
>     @SLoan bit,
>     @UnSLoan bit = 1,
>     @PersonalGuarantee bit,
>     -- RAs
>     @CUR money = null,
>     @QWIK money = null,
>     @OPM money = null,
>     @ROA money = null,
>     @DPO money = null,
>     @DI money = null,
>     @SALES2NETFA money = null,
>     @SALES2WC money = null,
>     @ASSETTURN money = null,
>     @FA_EQUITY money = null,
>     @LIAB_EQUITY money = null,
>     @COGS_AP money = null,
>     @EBIT_INT money = null,
>     @DEPS_SALES money = null,
>     @DSO money = null,
>     --LIs
>     @CA money = null,
>     @FA money = null,
>     @ASSETS money = null,
>     @CL money = null,
>     @LTL money = null,
>     @LIABS money = null,
>     @EQUITY money = null,
>     @SALES money = null,
>     @COGS money = null,
>     @EXP money = null,
>     @ORDINCM money = null,
>     @NEROTHER money = null,
>     @NI money = null
>
>
> AS
>
> SET NOCOUNT ON
> SET TRANSACTION ISOLATION LEVEL READ COMMITTED
>
> DECLARE @PartnerID INT
> DECLARE @Check bit
> DECLARE @TableVar TABLE (PartnerID int)
>
> DECLARE @RAAbbrev varchar(15)
> DECLARE @RAOperator varchar (15)
> DECLARE @RAValue money
> DECLARE @CustRAValue money
>
> DECLARE @LIAbbrev varchar(15)
> DECLARE @LIOperator varchar (15)
> DECLARE @LIValue money
> DECLARE @CustLIValue money
>
> SET @Check = 1  -- true by default
>
> /****************************************RA
> Comporision*******************************************************/
>
> DECLARE Partners_Cursor CURSOR FOR
>     SELECT PartnerID
>     FROM
>     [dbo].[Partners]
>     WHERE (
>            (
>            ('''' + REPLACE(PLoan, ',', ''',''') + '''') LIKE '%' + @PLoan+
> '%') OR
>                    PLoan IS NULL OR
>                    LTRIM(RTRIM(PLoan)) = ''
>            ) AND
>            SLoanRequired = @SLoan AND
>            PersonalGuaranteeRequired = @PersonalGuarantee  for read only
>
> OPEN Partners_Cursor
> FETCH NEXT FROM Partners_Cursor INTO @PartnerID
>
> WHILE @@FETCH_STATUS = 0
> BEGIN
>
>     /*********************Child 1
> Cursor***********************************/
>
>     DECLARE RA_Cursor CURSOR FOR
>        SELECT RAAbbrev, Operator, Value FROM ToleranceRAValues RA INNER
> JOIN RADesc DES ON
>           RA.RAID = DES.RADescID where partnerID = @PartnerID for read only
>
>        OPEN RA_Cursor
>        FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue
>
>        WHILE @@fetch_status = 0
>          BEGIN
>
>         SELECT @CustRAValue = ( SELECT
>                       CASE
>                     WHEN @RAAbbrev = 'CUR' THEN cast(@CUR as money)
>                     WHEN @RAAbbrev = 'QWIK' THEN cast(@QWIK as money)
>                     WHEN @RAAbbrev = 'OPM' THEN cast(@OPM as money)
>                     WHEN @RAAbbrev = 'ROA' THEN cast(@ROA as money)
>                     WHEN @RAAbbrev = 'DPO' THEN cast(@DPO as money)
>                     WHEN @RAAbbrev = 'DI' THEN cast(@DI as money)
>                     WHEN @RAAbbrev = 'SALES2NETFA' THEN cast(@SALES2NETFA as money)
>                     WHEN @RAAbbrev = 'SALES2WC' THEN cast(@SALES2WC as money)
>                     WHEN @RAAbbrev = 'ASSETTURN' THEN cast(@ASSETTURN as money)
>                     WHEN @RAAbbrev = 'FA_EQUITY' THEN cast(@FA_EQUITY as money)
>                     WHEN @RAAbbrev = 'LIAB_EQUITY' THEN cast(@LIAB_EQUITY as money)
>                     WHEN @RAAbbrev = 'COGS_AP' THEN cast(@COGS_AP as money)
>                     WHEN @RAAbbrev = 'EBIT_INT' THEN cast(@EBIT_INT as money)
>                     WHEN @RAAbbrev = 'DEPS_SALES' THEN cast(@DEPS_SALES as money)
>                     WHEN @RAAbbrev = 'DSO' THEN cast(@DSO as money)
>                       END
>                    )
>
>         print 'PartnerID: ' + cast(@partnerid as varchar)
>         print 'RAOperator: ' + cast(@RAOperator as varchar)
>         print 'CustRAValue: ' + cast(@CustRAValue as varchar)
>         print 'RAOperator: ' + cast(@RAOperator as varchar)
>         print 'RAValue: ' + cast(@RAValue as varchar)
>
>
>
>         IF (@RAOperator = '>')
>           BEGIN
>               --if (@CustRAValue >= @RAValue)
>                if (@CustRAValue < @RAValue)
>             BEGIN
>                SET @Check = 0
>                print 'Check: ' + cast(@Check as varchar)
>                BREAK;
>             END
>           END
>         IF (@RAOperator = '<')
>           BEGIN
>               if (@CustRAValue > @RAValue)
>             BEGIN
>                SET @Check = 0
>                print 'Check: ' + cast(@Check as varchar)
>                BREAK;
>             END
>           END
>
>
>            FETCH NEXT FROM RA_Cursor INTO @RAAbbrev, @RAOperator, @RAValue
>        END
>
>     CLOSE RA_Cursor
>     DEALLOCATE RA_Cursor
>     /*********************Child 1 end******************************/
>
>     -- Compare against line items only of no RAs comparision failed or no
> RAs
>     IF (@Check = 1)
>       BEGIN
>
>     /*********************Child 2
> Cursor***********************************/
>     DECLARE LI_Cursor CURSOR FOR
>        SELECT LIAbbrev, Operator, Value FROM ToleranceLIValues LI INNER
> JOIN LIDesc DES ON
>           LI.LIID = DES.LIDescID where partnerID = @PartnerID for read only
>
>        OPEN LI_Cursor
>        FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue
>
>        WHILE @@fetch_status = 0
>          BEGIN
>
>         SELECT @CustLIValue = ( SELECT
>                       CASE
>                     WHEN @LIAbbrev = 'CA' THEN cast(@CA as money)
>                     WHEN @LIAbbrev = 'FA' THEN cast(@FA as money)
>                     WHEN @LIAbbrev = 'ASSETS' THEN cast(@ASSETS as money)
>                     WHEN @LIAbbrev = 'CL' THEN cast(@CL as money)
>                     WHEN @LIAbbrev = 'LTL' THEN cast(@LTL as money)
>                     WHEN @LIAbbrev = 'LIABS' THEN cast(@LIABS as money)
>                     WHEN @LIAbbrev = 'EQUITY' THEN cast(@EQUITY as money)
>                     WHEN @LIAbbrev = 'SALES' THEN cast(@SALES as money)
>                     WHEN @LIAbbrev = 'COGS' THEN cast(@COGS as money)
>                     WHEN @LIAbbrev = 'EXP' THEN cast(@EXP as money)
>                     WHEN @LIAbbrev = 'ORDINCM' THEN cast(@ORDINCM as money)
>                     WHEN @LIAbbrev = 'NEROTHER' THEN cast(@NEROTHER as money)
>                     WHEN @LIAbbrev = 'NI' THEN cast(@NI as money)
>                       END
>                )
>
>         print 'PartnerID: ' + cast(@partnerid as varchar)
>         print 'LIOperator: ' + cast(@LIOperator as varchar)
>         print 'CustLIValue: ' + cast(@CustLIValue as varchar)
>         print 'LIOperator: ' + cast(@LIOperator as varchar)
>         print 'LIValue: ' + cast(@LIValue as varchar)
>
>         IF (@LIOperator = '>')
>           BEGIN
>               if (@CustLIValue < @LIValue)
>             BEGIN
>                SET @Check = 0
>                print 'Check: ' + cast(@Check as varchar)
>                --BREAK;
>             END
>           END
>         IF (@LIOperator = '<')
>           BEGIN
>               if (@CustLIValue > @LIValue)
>             BEGIN
>                SET @Check = 0
>                print 'Check: ' + cast(@Check as varchar)
>                --BREAK;
>             END
>           END
>
>
>            FETCH NEXT FROM LI_Cursor INTO @LIAbbrev, @LIOperator, @LIValue
>        END
>
>     CLOSE LI_Cursor
>     DEALLOCATE LI_Cursor
>     /*********************Child 2 Cursor
> end******************************/
>
>     END
>
>     -- save partnerid in temp table when all the checks passed or if no
> tolerances exists
>     IF (@Check = 1)
>         INSERT INTO @TableVar (Partnerid) VALUES (@PartnerID)
>
>
>      FETCH NEXT FROM Partners_Cursor INTO @PartnerID
>    END
>
> CLOSE Partners_Cursor
> DEALLOCATE Partners_Cursor
>
> select * from @TableVar
>
> GO
> SET QUOTED_IDENTIFIER OFF
> GO
> SET ANSI_NULLS ON
> GO

AddThis Social Bookmark Button