Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 Can anyone tell me what is wrong with this stored

Author  Topic 

saiabhiram
Starting Member

17 Posts

Posted - 2010-04-18 : 01:07:28
[code]

USE [EDMSTAGE]
GO
/****** Object: StoredProcedure [TTXDOM01\devayb].[sp_MakeSelheadUpdates] Script Date: 04/17/2010 19:57:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:SAB
-- Create date: 4/15/2010
-- Description: Reads the Exception Extract and makes updates to SELHEAD (IMS database)
-- =============================================
ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates]
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @str VARCHAR(50)
SET @str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
declare @ownr_cd char(4)
, @acct_date datetime
, @bill_rd char(4)
, @bill_rd_sffx decimal(2,0)
, @ltr_stat char(1)
, @tot_cba_amt decimal(9,2)
, @excp_close_dt datetime
, @selhead_excp_status char(1)
, @rec_found char(1)

declare db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR
select RA_EXCP_ACCT_DATE
,RA_EXCP_OWNR_MRK_CD
,RA_EXCP_BILL_RD
,RAEXCP_BILL_RD_SFFX
,RAEXCP_LTR_STAT
,RAEXCP_TOTL_CBA_AMT
,RAEXCP_EXCP_CLOSE_DT
from STG_R6100MU_RA_EXCP

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt

WHILE @@FETCH_STATUS = 0
BEGIN
IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX')

IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd )
SET @rec_found = 'Y'


IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd)
SET @rec_found = 'Y'

END

IF @rec_found ='Y'
BEGIN
IF (@ltr_stat = 'W'or @Ltr_stat = 'M' or @ltr_stat = 'X')
SET @selhead_excp_status = 'C'
END

IF @ltr_stat = 'L'
SET @selhead_excp_status = 'P'
END

UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status
,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt
,SELHEAD_DATE_CLOSED = @excp_close_dt
,SELHEAD_LAST_LOG_UPDT_BY = 342
,SELHEAD_LAST_LOG_UPDT_ON
WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd

END ---END OF IF @REC_FOUND ='Y'

FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt

END

CLOSE db_cursor
DEALLOCATE db_cursor

END



[/code]


here is the error I got:

Msg 156, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 69
Incorrect syntax near the keyword 'WHERE'.
Msg 156, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 77
Incorrect syntax near the keyword 'CLOSE'.
Msg 102, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 80
Incorrect syntax near 'END'.


Any help would be greatly appreciated as I am a novice to database programming

khtan
In (Som, Ni, Yak)

17689 Posts

Posted - 2010-04-18 : 01:31:14
[code]
UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status
,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt
,SELHEAD_DATE_CLOSED = @excp_close_dt
,SELHEAD_LAST_LOG_UPDT_BY = 342
,SELHEAD_LAST_LOG_UPDT_ON = ?
WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd
[/code]


KH
[spoiler]Time is always against us[/spoiler]

Go to Top of Page

khtan
In (Som, Ni, Yak)

17689 Posts

Posted - 2010-04-18 : 01:34:57
quote:
Msg 102, Level 15, State 1, Procedure sp_MakeSelheadUpdates, Line 80
Incorrect syntax near 'END'.

Check your BEGIN . . END. You have mismatched BEGIN and END. It should be in pairs


KH
[spoiler]Time is always against us[/spoiler]

Go to Top of Page

saiabhiram
Starting Member

17 Posts

Posted - 2010-04-18 : 01:46:16
Thanks for your reply. I have commented that clause in update statement. However, should a stored procedure always end with an END statement.

USE [EDMSTAGE]
GO
/****** Object: StoredProcedure [TTXDOM01\devayb].[sp_MakeSelheadUpdates] Script Date: 04/17/2010 19:57:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:SAB
-- Create date: 4/15/2010
-- Description: Reads the Exception Extract and makes updates to SELHEAD (IMS database)
-- =============================================
ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates]
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @str VARCHAR(50)
SET @str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
declare @ownr_cd char(4)
, @acct_date datetime
, @bill_rd char(4)
, @bill_rd_sffx decimal(2,0)
, @ltr_stat char(1)
, @tot_cba_amt decimal(9,2)
, @excp_close_dt datetime
, @selhead_excp_status char(1)
, @rec_found char(1)

declare db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR
select RA_EXCP_ACCT_DATE
,RA_EXCP_OWNR_MRK_CD
,RA_EXCP_BILL_RD
,RAEXCP_BILL_RD_SFFX
,RAEXCP_LTR_STAT
,RAEXCP_TOTL_CBA_AMT
,RAEXCP_EXCP_CLOSE_DT
from STG_R6100MU_RA_EXCP

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt

WHILE @@FETCH_STATUS = 0
BEGIN
IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX')

IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd )
SET @rec_found = 'Y'


IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd)
SET @rec_found = 'Y'

END

IF @rec_found ='Y'
BEGIN
IF (@ltr_stat = 'W'or @Ltr_stat = 'M' or @ltr_stat = 'X')
SET @selhead_excp_status = 'C'

IF @ltr_stat = 'L'
SET @selhead_excp_status = 'P'

UPDATE SELHEAD SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status
,SELHEAD_TOT_CBA_TO_DATE = @tot_cba_amt
,SELHEAD_DATE_CLOSED = @excp_close_dt
,SELHEAD_LAST_LOG_UPDT_BY = 342
--,SELHEAD_LAST_LOG_UPDT_ON
WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd

END ---END OF IF @REC_FOUND ='Y'

FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt
END

CLOSE db_cursor
DEALLOCATE db_cursor


--END

--GO


because if I comment out that end statement in end and go, the stored proc successfully compiles. Even though there is no END for the very first BEGIN.
Go to Top of Page

khtan
In (Som, Ni, Yak)

17689 Posts

Posted - 2010-04-18 : 01:56:12
quote:
However, should a stored procedure always end with an END statement.

No. But for every BEGIN there should be an END. Check your BEGIN .. END

From your last post, you might have matching BEGIN . . END, but i think the BEGIN . . END might not be in the right place.

example, these are the most inner BEGIN .. END from your code. It loops while @@FETCH_STATUS = 0. You will get infinite loop as within the block of BEGIN . . END, the @@FETCH_STATUS will always be 0.

WHILE @@FETCH_STATUS = 0
BEGIN
IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX')

IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date and SELHEAD_COMPANY = @ownr_cd and SELHEAD_BILLING_ROAD = @bill_rd )
SET @rec_found = 'Y'


IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd)
SET @rec_found = 'Y'

END



KH
[spoiler]Time is always against us[/spoiler]

Go to Top of Page

khtan
In (Som, Ni, Yak)

17689 Posts

Posted - 2010-04-18 : 02:05:28
your stored procedure, probably should looks like this. . .

ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates]
-- ADD the parameters FOR the stored PROCEDURE here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets FROM
-- interfering WITH SELECT statements.
SET NOCOUNT ON;
DECLARE @STR varchar(50)
SET @STR = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @ownr_cd CHAR(4)
, @acct_date datetime
, @bill_rd CHAR(4)
, @bill_rd_sffx decimal(2,0)
, @ltr_stat CHAR(1)
, @tot_cba_amt decimal(9,2)
, @excp_close_dt datetime
, @selhead_excp_status CHAR(1)
, @rec_found CHAR(1)

DECLARE db_cursor cursor READ_ONLY FORWARD_ONLY LOCAL FOR
SELECT RA_EXCP_ACCT_DATE
,RA_EXCP_OWNR_MRK_CD
,RA_EXCP_BILL_RD
,RAEXCP_BILL_RD_SFFX
,RAEXCP_LTR_STAT
,RAEXCP_TOTL_CBA_AMT
,RAEXCP_EXCP_CLOSE_DT
FROM STG_R6100MU_RA_EXCP

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt

WHILE @@FETCH_STATUS = 0
BEGIN
IF (@ownr_cd = 'TTX' OR @ownr_cd = 'GONX')
IF EXISTS( SELECT * FROM SELHEAD WHERE SELHEAD_ACCT_DATE = @acct_date AND SELHEAD_COMPANY = @ownr_cd AND SELHEAD_BILLING_ROAD = @bill_rd )
SET @rec_found = 'Y'


IF EXISTS (SELECT * FROM OCR_CLIENT_CODE WHERE OCR_CLIENT_INIT =@ownr_cd)
SET @rec_found = 'Y'

IF @rec_found ='Y'
BEGIN
IF (@ltr_stat = 'W'OR @Ltr_stat = 'M' OR @ltr_stat = 'X')
BEGIN -- <==
SET @selhead_excp_status = 'C'
END

IF @ltr_stat = 'L'
BEGIN -- <==
SET @selhead_excp_status = 'P'
END

UPDATE SELHEAD
SET SELHEAD_EXCEPTION_STATUS = @selhead_excp_status
,SELHEAD_TOT_CBA_TODATE = @tot_cba_amt
,SELHEAD_DATE_CLOSED = @excp_close_dt
,SELHEAD_LAST_LOG_UPDT_BY = 342
-- ,SELHEAD_LAST_LOG_UPDT_ON
WHERE SELHEAD_ACCT_DATE = @acct_date AND SELHEAD_COMPANY = @ownr_cd AND SELHEAD_BILLING_ROAD = @bill_rd

END ---END OF IF @REC_FOUND ='Y'

FETCH NEXT FROM db_cursor INTO @acct_date,@ownr_cd,@bill_rd,@bill_rd_sffx,@ltr_stat,@tot_cba_amt,@excp_close_dt

END

CLOSE db_cursor
DEALLOCATE db_cursor

END






KH
[spoiler]Time is always against us[/spoiler]

Go to Top of Page

saiabhiram
Starting Member

17 Posts

Posted - 2010-04-18 : 02:15:28
Thanks so much. It works.
Go to Top of Page

khtan
In (Som, Ni, Yak)

17689 Posts

Posted - 2010-04-18 : 02:22:52
quote:
Originally posted by saiabhiram

Thanks so much. It works.



Good.

Now throw away the cursor method and use the set based method.


ALTER PROCEDURE [TTXDOM01\devayb].[sp_MakeSelheadUpdates]
AS
BEGIN

UPDATE a
SET SELHEAD_EXCEPTION_STATUS = CASE WHEN b.RAEXCP_LTR_STAT IN ('W', 'M', 'X')
THEN 'C'
WHEN b.RAEXCP_LTR_STAT IN ('L')
THEN 'P'
END
,SELHEAD_TOT_CBA_TODATE = b.RAEXCP_TOTL_CBA_AMT
,SELHEAD_DATE_CLOSED = b.RAEXCP_EXCP_CLOSE_DT
,SELHEAD_LAST_LOG_UPDT_BY = 342
FROM SELHEAD a
INNER JOIN STG_R6100MU_RA_EXCP b ON s.SELHEAD_ACCT_DATE = b.RA_EXCP_ACCT_DATE
AND s.SELHEAD_COMPANY = b.RA_EXCP_OWNR_MRK_CD
AND s.SELHEAD_BILLING_ROAD = b.RA_EXCP_BILL_RD
WHERE b.RA_EXCP_OWNR_MRK_CD IN ( 'TTX', 'GONX' )
OR EXISTS -- not sure should the condition be OR.
(
SELECT *
FROM OCR_CLIENT_CODE x
WHERE x.OCR_CLIENT_INIT = b.RA_EXCP_OWNR_MRK_CD
)

END



KH
[spoiler]Time is always against us[/spoiler]

Go to Top of Page
   

- Advertisement -