If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > Database Server Software > DB2 > How to compare the values from a table with a cursor in DB2

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 11-28-07, 01:34
selvazeal selvazeal is offline
Registered User
 
Join Date: Nov 2007
Posts: 2
Red face How to compare the values from a table with a cursor in DB2

Hi

How to compare the values in the tables which has repeative rows with a cursor variable.

BEGIN
DECLARE acc_imp_cur CURSOR WITH RETURN FOR
SELECT ACCOUNT_ID,CONTROL_ID FROM CONTROL_ACCOUNTS_IMPACTED ;

DECLARE comp_cur CURSOR WITH RETURN FOR SELECT
DISTINCT CONTROL_ID FROM CONTROL_ACCOUNTS_IMPACTED;

OPEN acc_imp_cur;
OPEN comp_cur;
--LOOP

FETCH acc_imp_cur INTO v_str,v_control_id;
FETCH comp_cur INTO v_control_id1;


SET v_str = CONCAT(v_str,',');

WHILE(v_control_id = v_control_id1) DO

IF(LOCATE (',',v_str) > 0) THEN

this is the scenario how will i compare the values and do the manipulation.
Reply With Quote
  #2 (permalink)  
Old 11-28-07, 05:19
stolze stolze is offline
Registered User
 
Join Date: Jan 2007
Location: Jena, Germany
Posts: 2,662
What exactly do you try to do? What's your data and what do you want to compare with what? And what are those "manipulations" you mention?
__________________
Knut Stolze
IBM DB2 Analytics Accelerator
IBM Germany Research & Development
Reply With Quote
  #3 (permalink)  
Old 11-28-07, 07:23
selvazeal selvazeal is offline
Registered User
 
Join Date: Nov 2007
Posts: 2
ID SON ACC
141 1 4511039999
141 1 131XXXXXXX
141 1 4411109999
141 1 5940029999
141 1 5940049999
141 1 4431009999
166 1 4511039999
166 1 131XXXXXXX
166 1 4411109999
166 1 5940029999
166 1 5940049999
166 1 4431009999
131 1 4511039999
131 1 131XXXXXXX
131 1 4411109999
131 1 5940029999
131 1 5940049999
131 1 4431009999
124 1 4511039999
124 1 131XXXXXXX
124 1 4411109999
124 1 5940029999
124 1 5940049999

my table data is like that one above , now i am trying to write a strored procedure to combine all the ACC's in the same ID into another table like

124 4511039999,131XXXXXXX,4411109999,5940029999

So in my stored procedure i fetched the ID and ACC's in a cursor and then how will i compare with the id's in the table through a loop


CREATE PROCEDURE GET_ACCOUNTS_IMPACTED ()
DYNAMIC RESULT SETS 1
BEGIN

DECLARE v_str varchar(100);
DECLARE v_acc_imp varchar(1000);
DECLARE v_control_id integer;
DECLARE v_control_id1 integer;

BEGIN
DECLARE acc_imp_cur CURSOR WITH RETURN FOR
SELECT ACCOUNT_ID,CONTROL_ID FROM CONTROL_ACCOUNTS_IMPACTED ;

DECLARE comp_cur CURSOR WITH RETURN FOR SELECT
DISTINCT CONTROL_ID FROM CONTROL_ACCOUNTS_IMPACTED;

OPEN acc_imp_cur;
OPEN comp_cur;

FETCH acc_imp_cur INTO v_str,v_control_id;
FETCH comp_cur INTO v_control_id1;

SET v_str = CONCAT(v_str,',');

WHILE(v_control_id = v_control_id1) DO

IF(LOCATE (',',v_str) > 0) THEN
SET v_acc_imp = CONCAT(v_str,v_str);
ELSE
SET v_acc_imp = UPPER(v_str);
END IF;
SET v_acc_imp = v_acc_imp;
END WHILE;

INSERT INTO DUMMY_CAI1 (CONTROL_ID,ACCOUNTS_IMPACTED)
VALUES(v_control_id1,CASE WHEN v_acc_imp IS NULL THEN ' ' ELSE v_acc_imp END);
CLOSE acc_imp_cur;
END;
END

this procedure is going into an infinite loop please give me a suggestion to loop through the values and get the code if any one knows
ASAP................

thanks in advance....
Reply With Quote
  #4 (permalink)  
Old 11-28-07, 08:40
umayer umayer is offline
Registered User
 
Join Date: Dec 2005
Posts: 273
How about such a logic ?


Declare Cursor c1 FOR
SELECT ACCOUNT_ID,CONTROL_ID FROM CONTROL_ACCOUNTS_IMPACTED
ORDER BY ACCOUNT_ID

OPEN C1

FETCH C1

DO WHILE ( SQLCODE=0 )
SAVE_ID = ACCOUNT_ID
V_Acct = ''

DO WHILE ( SQLCODE=0 & SAVE_ID = ACCOUNT_ID )
IF V_Acct = '' THEN V_Acct = CONTROL_ID
ELSE V_Acct = V_Acct CONCAT ',' CONCAT CONTROL_ID

FETCH C1
END_DO_WHILE

INSERT INTO DUMMY1_CAI1 VALUES ( SAVE_ID , V_Acct )
END_DO_WHILE
Reply With Quote
  #5 (permalink)  
Old 11-28-07, 09:22
sathyaram_s sathyaram_s is offline
Super Moderator
 
Join Date: Aug 2001
Location: UK
Posts: 4,534
Have you considered using a common table expresssion...
See an example below :
Code:
with order_details(order_number,item)  
as 
( 
values(101,'Shoes'),(101,'Umbrella'),(101,'Coat'), 
(102,'Hat'),(103,'Umbrella'),(103,'Jumper') 
), 
order_det_seq(order_number,item,order_item_seq)  
as  
( 
select order_number,item,rownumber() over (partition by order_number) from order_details 
), 
serialized_order_details(s_order_number,s_serialized_item,s_order_item_seq) as  
( 
select order_number,varchar(item,1000),order_item_seq from order_det_seq where order_item_seq=1

union all 
select order_number,varchar(s_serialized_item,1000)||','||item,order_item_seq from
order_det_seq c,serialized_order_details t where t.s_order_number=c.order_number
and t.s_order_item_seq+1=c.order_item_seq 
) 
select s_order_number,s_serialized_item from 
( 
select s_order_number,s_serialized_item,rownumber() over (partition by s_order_number
 order by s_order_item_seq desc) as rn  from serialized_order_details 

) as t where rn=1
In the above common table expression, you will not need the order_details table
as you will have it as a permanent table.
__________________
Visit the new-look IDUG Website , register to gain access to the excellent content.
Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On