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 > Loop execution incorrect for cursor declared in DB2 Stored procedure

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 05-15-09, 14:38
NEE NEE is offline
Registered User
 
Join Date: May 2009
Posts: 16
Loop execution incorrect for cursor declared in DB2 Stored procedure

Hi
I am getting SQL out as - 284, for the following declared cursor, I have declared a cursor and feteched the same and inserted teh results in a temp table.

further did proccessing form retriving from temp tables like manipulation on temp table data.

but I am not getting any output form cursor
CREATE PROCEDURE SP_Clean_tab
(IN CLEAN_PERIOD INTEGER,
OUT SQLSTATE_OUT CHAR(5),
OUT SQLCODE_OUT INTEGER )
DYNAMIC RESULT SETS 2
LANGUAGE SQL
P1: BEGIN
-- Declare variables
DECLARE CLEAN_PERIOD_VAR INTEGER;
DECLARE CLEAN_POID BIGINT;
DECLARE CLEAN_PACKID BIGINT;
DECLARE VAR_INVOICE_ID VARCHAR(20);
DECLARE END_TABLE INT DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INT DEFAULT 0;
-- Declare cursors
DECLARE C1 CURSOR WITH HOLD WITH RETURN FOR
SELECT PO_UNI_ID, PACK_UNI_ID
FROM INS.INS_PO
WHERE (TIMESTAMPDIFF(64,CHAR((CURRENT_TIMESTAMP) - (CHECKED_DTTM)))) > (MAX(12, CLEAN_PERIOD_VAR))
AND CHECKED_DTTM is NOT NULL
AND STATUS_CODE = 'CHECKED ‘;
-- Declare handler
DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT SQLSTATE, SQLCODE INTO SQLSTATE_OUT, SQLCODE_OUT FROM SYSIBM.SYSDUMMY1;

DECLARE Continue HANDLER FOR NOT FOUND
Begin
SET END_TABLE = 1;
End;

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_CLEAN
(DEL_POID BIGINT, DEL_PACKID INTEGER, DEL_INVOICE_ID VARCHAR(20), DEL_PERIOD INTEGER)IN TPACE1 ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;
-- INITIALIZE OUTPUT SQL PAAMAETERS
SET CLEAN_PERIOD_VAR = CLEAN_PERIOD;
OPEN C1;
L1: REPEAT
FETCH C1 INTO CLEAN_POID, CLEAN_PACKID;
IF SQLCODE = 0 THEN
-- POPULATING TEMP TABLE FOR FURTHER PROCESSING.
SELECT INVOICE_ID INTO VAR_INVOICE_ID FROM INS.INS_PO_CLASS_ELEMENTS WHERE PO_UNI_ID = CLEAN_POID;
INSERT INTO SESSION.TEMP_CLEAN VALUES (CLEAN_POID, CLEAN_PACKID, VAR_MRN, VAR_INVOICE_ID, VAR_UPLOAD_ID, VAR_UPLOAD_SN, CLEAN_PERIOD_VAR);
COMMIT;
END IF;
UNTIL END_TABLE = 1
END REPEAT L1;
CLOSE C1;

--CLEANS THE FETCHED POS FROM INS_PO TABLE.
DELETE FROM INS.INS_PO WHERE PO_UNI_ID IN (SELECT DEL_POID FROM SESSION.TEMP_CLEAN);
-- CLEAN CORRESPONDING PACK_UNI_ID FROM INS_PACK_PO TABLE
DELETE FROM INS.INS_PACK_PO A
WHERE (0 = (SELECT COUNT(*) FROM INS.INS_PO C WHERE C.PACK_UNI_ID = A.pack_UNI_ID))
AND A.PACK_UNI_ID IN (SELECT DEL_PACKID FROM SESSION.TEMP_CLEAN);


SET SQLSTATE_OUT = SQLSTATE;
SET SQLCODE_OUT = SQLCODE;
END P1
Reply With Quote
  #2 (permalink)  
Old 05-15-09, 15:26
ARWinner ARWinner is offline
Registered User
 
Join Date: Jan 2003
Posts: 3,575
Read the error message:

Code:
SQL0284N  The table was not created because the table space
      "<tablespace-name>" following the clause "<clause>" is a
      "<tablespace-type>" table space.

Explanation:

The CREATE TABLE or DECLARE GLOBAL TEMPORARY TABLE statement specified a
table space named "<tablespace-name>" following the clause "<clause>"
that is not a valid type of table space for this clause.

This can occur in the following situations:
*  For regular tables, "<tablespace-name>" was specified on the IN
   clause and the table space is not a REGULAR or LARGE table space.
*  For declared temporary tables, "<tablespace-name>" was specified on
   the IN clause and the table space is not a USER TEMPORARY table
   space.
*  "<tablespace-name>" was specified on the LONG IN clause and the table
   space is not a LARGE, managed by database table space.
*  "<tablespace-name>" was specified on the INDEX IN clause and the
   table space is not a REGULAR or LARGE, managed by database, table
   space.

User response:

Correct the CREATE TABLE statement to specify a table space with the
correct type for the "<clause>" clause.

 sqlcode: -284
You are specifying the wrong type of tablespace for the temp table.

Andy
Reply With Quote
  #3 (permalink)  
Old 05-15-09, 16:25
stolze stolze is offline
Registered User
 
Join Date: Jan 2007
Location: Jena, Germany
Posts: 2,662
I'm wondering: why don't you do a simple INSERT INTO ... SELECT ... ?
__________________
Knut Stolze
IBM DB2 Analytics Accelerator
IBM Germany Research & Development
Reply With Quote
  #4 (permalink)  
Old 05-15-09, 20:48
NEE NEE is offline
Registered User
 
Join Date: May 2009
Posts: 16
Thanks for your effots and time.

I checked and re ran the procedure with table space as Tempspace2 which is created, but still I am getting same sql code -284 and sql state as 42838.

And I am not using Insert Select combined because , I have to select few columns from one table and few from another table for inserting into teh table.

Is there a some way I can debug my procedure or we canuse Signal.

Thanks in advance.
Regards
Nee
Reply With Quote
  #5 (permalink)  
Old 05-16-09, 00:05
Stealth_DBA Stealth_DBA is offline
Registered User
 
Join Date: May 2009
Posts: 472
Nee, Unless I am missing something, you are defining TEMP_CLEAN with 4 columns. But your Insert into TEMP_CLEAN has 7 values.

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_CLEAN
(DEL_POID BIGINT
,DEL_PACKID INTEGER
,DEL_INVOICE_ID VARCHAR(20)
,DEL_PERIOD INTEGER)
IN TPACE1 ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;

INSERT INTO SESSION.TEMP_CLEAN
VALUES
(CLEAN_POID
,CLEAN_PACKID
,VAR_MRN
,VAR_INVOICE_ID
,VAR_UPLOAD_ID
,VAR_UPLOAD_SN
,CLEAN_PERIOD_VAR);


I agree with stolze, you should be able to use INSERT INTO table-name Select...

Something like this should work:

INSERT INTO SESSION.TEMP_CLEAN
SELECT A.PO_UNI_ID, A.PACK_UNI_ID, B.INVOICE_ID, CLEAN_PERIOD
FROM INS.INS_PO AS A
, INS.INS_PO_CLASS_ELEMENTS AS B
WHERE A.PO_UNI_ID = B.PO_UNI_ID
AND TIMESTAMPDIFF(64,CHAR(CURRENT_TIMESTAMP - A.CHECKED_DTTM)) > MAX(12, CLEAN_PERIOD)
AND A.CHECKED_DTTM is NOT NULL
AND A.STATUS_CODE = 'CHECKED'

PS Personally, instead of TIMESTAMPDIFF, I would use MONTH(CURRENT_TIMESTAMP - A.CHECKED_DTTM) > MAX(12, CLEAN_PERIOD). To me it is easier to see what is going on (but it is a personal preference.
Reply With Quote
  #6 (permalink)  
Old 05-18-09, 18:02
NEE NEE is offline
Registered User
 
Join Date: May 2009
Posts: 16
Thanks folks,

Defintely this way of insert is good and I can avoid using cursor, it will work.
but basically again i am getting sql code as -284 and sql state out put as 42838.

Basically I am having stored proc as

create procedure sp_clean_pos
(IN clean_PERIOD INTEGER,
OUT SQLSTATE_OUT CHAR(5),
OUT SQLCODE_OUT INTEGER )
DYNAMIC RESULT SETS 2
LANGUAGE SQL



DECLARE clean_PERIOD_VAR INTEGER;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INT DEFAULT 0;


DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_CLEAN
(DEL_POID BIGINT
,DEL_PACKID INTEGER
,DEL_INVOICE_ID VARCHAR(20)
)
IN Tempspace2 ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED

-- INITIALIZE OUTPUT SQL PAAMAETERS
SET CLEAN_PERIOD_VAR = CLEAN_PERIOD;

INSERT INTO SESSION.TEMP_CLEAN
SELECT A.PO_UNI_ID, A.PACK_UNI_ID, B.INVOICE_ID,
FROM INS.INS_PO AS A
, INS.INS_PO_CLASS_ELEMENTS AS B
WHERE A.PO_UNI_ID = B.PO_UNI_ID
AND TIMESTAMPDIFF(64,CHAR(CURRENT_TIMESTAMP - A.CHECKED_DTTM)) MAX(12, CLEAN_PERIOD)
AND A.CHECKED_DTTM is NOT NULL
AND A.STATUS_CODE = 'CHECKED'
COMMIT;
SET SQLSTATE_OUT = SQLSTATE;
SET SQLCODE_OUT = SQLCODE;

Can you please suggest that I have created a separate tempspace2 for using to declare GTTs, but still it gives sql out as -284.
Reply With Quote
  #7 (permalink)  
Old 05-18-09, 18:26
Stealth_DBA Stealth_DBA is offline
Registered User
 
Join Date: May 2009
Posts: 472
Nee, a -284 indicates a problem with the Table space you specified (as ARWinner pointed out).

From the SQL Reference manual under Declare Global Temporary Table:

IN tablespace-name

Identifies the table space in which the global temporary table will be instantiated.The table space must exist and be a USER TEMPORARY table space (SQLSTATE 42838), over which the authorization ID of the statement has USE privilege (SQLSTATE 42501).

Check the type of Table space Tempspace2 to ensure it is a User Temporary table space and/or who has the Use privilege.

PS This could just be a typo but you have an extra comma in the Select list:

SELECT A.PO_UNI_ID, A.PACK_UNI_ID, B.INVOICE_ID, <==
FROM INS.INS_PO AS A
Reply With Quote
  #8 (permalink)  
Old 05-19-09, 14:24
NEE NEE is offline
Registered User
 
Join Date: May 2009
Posts: 16
Red face

Yes thats true the sql code -284 is problem with tablespace used in GTT declaration.
I have used the GTT decalaration as follows
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_CLEAN
(DEL_POID BIGINT
,DEL_PACKID INTEGER
,DEL_INVOICE_ID VARCHAR(20)
)
IN Tempspace2 ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED
and
the tempsace2 i have created as

CREATE SYSTEM TEMPORARY TABLESPACE TEMPSPACE2
IN DATABASE PARTITION GROUP IBMTEMPGROUP
PAGESIZE 4 K
MANAGED BY DATABASE
USING ( FILE '/db2/db2inst4/db2inst4/.../...TMP' 5000)
EXTENTSIZE 32
BUFFERPOOL IBMDEFAULTBP
TRANSFERRATE 0.06;
still same error and we cannot grant privileges to system temporary tablespace.
then i tried creating normal tablespace as
CREATE TABLESPACE tempsPACE2 IN DATABASE PARTITION GROUP IBMDEFAULTGROUP
PAGESIZE 4 K MANAGED BY DATABASE USING ( FILE '/db2/db2inst4/db2inst4/../../....TMP' 5000) EXTENTSIZE 32 BUFFERPOOL IBMDEFAULT
BP TRANSFERRATE 0.06.
and granted privilleges to Publlic for this tablespace, still same error as sql code -284.

Thanks for all your efforts and support.
Regards
Reply With Quote
  #9 (permalink)  
Old 05-19-09, 14:33
ARWinner ARWinner is offline
Registered User
 
Join Date: Jan 2003
Posts: 3,575
If you read the manual you will see that for DECLARE GLOBAL TEMPORARY TABLE, the tablespace must be a USER TEMPORARY tablespace, not a SYSTEM TEMPORARY one.

Andy
Reply With Quote
  #10 (permalink)  
Old 05-20-09, 14:37
NEE NEE is offline
Registered User
 
Join Date: May 2009
Posts: 16
Thanks Folks for all my learnings.

My proc is working with Insert.. Select statment and w/o cursor.
Also I have reacreated teh tempspace2 as user temporary tablespace.

Regards

Neet
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