IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

Getting problem with CURSOR implementation?


IBM Mainframe Forums -> DB2
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
babu_hi

New User


Joined: 11 Apr 2006
Posts: 93

PostPosted: Thu Apr 17, 2008 12:08 pm
Reply with quote

I have a table date like this,


CNTL_TBL_NME CNTL_DTE CNTL_FLAG
ARW_X9_T001 000000 E
ARW_X9_T002 000000 E
ARW_X9_T003 000000 E
ARW_X9_T004 000000 E
ARW_X9_T005 000000 E
ARW_X9_T006 000000 E
ARW_X9_T007 000000 E
ARW_X9_T008 200703 H
ARW_X9_T009 200704 H
ARW_X9_T010 200802 H
ARW_X9_T011 200803 A
ARW_X9_T012 000000 E


My requirement is i want to update the CNTL-FLAG and CNTL_DTE with cursor with the following conditions,

1.In the above table,I want to update the flag value from Where CNTL_FLAG = 'A' to CNTL_FLAG = 'H".At any ponit of time only one table is in active state,so only one row will return for always Where CNTL_FLAG = 'A'in cursor declaration.

2.After updation of CNTL_FLAG = 'A' to CNTL_FLAG = 'H" then i want to update,
a).IF the CNTL_FLAG = 'E' then i need to update CNTL_FLAG = 'A'and CNTL_DTE=CURRENt DATE
(or) IF CNTL_FLAG = 'H' Then find which is older(Minimum Date) date(CNTL_DTE) of the CNTL_FLAG = "H' then update CNTL_FLAG ='A' with CNTL_DTE=CURRENt DATE.

EXEC SQL DECLARE CNTL_TABLE_CSR CURSOR WITH HOLD FOR
SELECT CNTL_TBL_NME,
CNTL_DTE,
CNTL_FLAG
FROM ARW_CNTL_TABLE
WHERE CNTL_FLAG = 'A' OR CNTL_FLAG = 'E' OR
CNTL_FLAG = 'H' AND CNTL_DTE = (SELECT MIN(CNTL_DTE) FROM
ARW_CNTL_TABLE WHERE CNTL_FLAG = 'H')
FOR UPDATE OF CNTL_FLAG,CNTL_DTE
GROUP BY CNTL_DTE
END-EXEC.

EXEC SQL
UPDATE ARW_CNTL_TABLE
SET CNTL_FLAG = :WS-CNTL-FLAG,
CNTL_DTE = :WS-CNTL-DTE
WHERE CNTL_FLAG = :CNTL-FLAG
END-EXEC.

After Fetch it is updating all records of CNTL_FDLAG = E and CNTL_FDLAG = H to CNTL_FDLAG = A,i want only one update that too if CNTL_FDLAG = E then update with CNTL_FDLAG = A and CNTL_DTE with CURRENT DATE.IF there is no CNTL_FDLAG = E thenb only retrive only one record that is should be Minimum date of CNTL_DTE then update CNTL_FDLAG = H with CURRENT DATE.

Please let me know how to proceed further on my requirement,

The final OUTPUT should be like below

CNTL_TBL_NME CNTL_DTE CNTL_FLAG
ARW_X9_T001 000000 A
ARW_X9_T002 000000 E
ARW_X9_T003 000000 E
ARW_X9_T004 000000 E
ARW_X9_T005 000000 E
ARW_X9_T006 000000 E
ARW_X9_T007 000000 E
ARW_X9_T008 200703 H
ARW_X9_T009 200704 H
ARW_X9_T010 200802 H
ARW_X9_T011 200803 H
ARW_X9_T012 000000 E
Back to top
View user's profile Send private message
ashimer

Active Member


Joined: 13 Feb 2004
Posts: 551
Location: Bangalore

PostPosted: Thu Apr 17, 2008 3:40 pm
Reply with quote

your first requirement can be done by a normal select and update ...

Select CNTL_TBL_NME,CNTL_FLAG from table where CNTL_FLAG ='A'

as you said only one row will have CNTL_FLAG = A this will give

CNTL_TBL_NME = 'ARW_X9_T011'

now using this ARW_X9_T011 as CNTL_TBL_NAME update the flag to H

UPDATE table SET CNTL_FLAG ='H' where CNTL_TBL_NAME ='ARW_X9_T011' .

Do you require a cursor for this?

Now about your second requirement :

Quote:


a).IF the CNTL_FLAG = 'E' then i need to update CNTL_FLAG = 'A'and CNTL_DTE=CURRENt DATE



as per your data there are 7 rows with flag = 'E' now out of these which one do you want to change to 'A' ?



[/code]
Back to top
View user's profile Send private message
babu_hi

New User


Joined: 11 Apr 2006
Posts: 93

PostPosted: Thu Apr 17, 2008 4:17 pm
Reply with quote

AS Per requirement, we can update any one of the row from CNTL-FLAG='E".Because CNTL_DTE is always equal to 000000 for FLAG = E.we can update for any row,no conditions for to update flag = E rows.
Back to top
View user's profile Send private message
ashimer

Active Member


Joined: 13 Feb 2004
Posts: 551
Location: Bangalore

PostPosted: Thu Apr 17, 2008 4:37 pm
Reply with quote

then do it in this sequence


SELECT CNTL_TBL_NAME INTO WS-CNTL-NAME FROM TABLE WHERE CNTL_FLAG = 'A' ;

this will give you ARW_X9_T011

UPDATE TABLE SET CNTL_FLAG = 'H' WHERE CNTL_TBL_NAME = :WS-CNTL-NAME;

SELECT CNTL_TBL_NAME INTO :WS-CNTL-NAME FROM TABLE WHERE CNTL_FLAG = 'E';

here just take care of -811 .. this select will give you the first row with CNTL_FLAG='E' ... now update this row ..


UPDATE TABLE SET CNTL_FLAG = 'A' WHERE CNTL_TBL_NAME = :WS-CNTL-NAME;

so your first row will have flag as 'A'

now if the second select returned a 100 tht means there are no rows with CNTL-FLAG as 'E' in this case do another select for the min(date) for CNTL-FLAG='H' and update accordingly ...

so instead of going for a cursor with hold you can do this with 2 selects and 2 updates ...

this is one solution ...

there might be other solutions also ... experts in this forum will provide you with other solutions if this is not feasible ...

thanks
ashimer
[/code]
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> DB2

 


Similar Topics
Topic Forum Replies
No new posts Map Vols and Problem Dataset All Other Mainframe Topics 2
No new posts z/vm installation problem All Other Mainframe Topics 0
No new posts Job scheduling problem. JCL & VSAM 9
No new posts Problem with IFTHEN=(WHEN=GROUP,BEGIN... DFSORT/ICETOOL 5
No new posts Need to add field to copybook, proble... COBOL Programming 14
Search our Forums:

Back to Top