LANGUAGE SQL
ss:BEGIN   

             -- clean up temp table if exists 
                        BEGIN
						    DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
					        BEGIN END;
					        
					        COMMIT;
					        DROP TABLE SESSION.JCL;
                            DROP TABLE SESSION.CORE;
					    END;



			-- declare temp tables
	                   DECLARE GLOBAL TEMPORARY TABLE session.jcl
		               (
					    JobName VARCHAR(50) ,
						DDName VARCHAR(50) ,
						DDNameU VARCHAR(50) ,
						DDPath VARCHAR(250) ,
						DDStartRow INTEGER ,
						CalledPgmID INTEGER ,
						DataSetID INTEGER ,
						MemberName VARCHAR(50) 
		                ) ON COMMIT PRESERVE ROWS NOT LOGGED ;
					        
					        
						DECLARE GLOBAL TEMPORARY TABLE session.core
						(
						StatementStartRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndRow INTEGER ,
						StatementEndColumn INTEGER ,
						StmtPathStr VARCHAR(250) ,
						Description VARCHAR(50) ,
						DescriptionU VARCHAR(50) ,
						ProgramID INTEGER ,
						ProgramName VARCHAR(256) ,
						ProgramTypeID INTEGER ,
						ProgramPath VARCHAR(250) ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						Ancestor VARCHAR(256) ,
						AncestorID INTEGER ,
						AncestorTypeID INTEGER ,
						FileName VARCHAR(255) ,
						FileNameU VARCHAR(255) ,
						FileLogicalName VARCHAR(255) ,
						FileTypeCode INTEGER 
						) ON COMMIT PRESERVE ROWS NOT LOGGED ;
 

					--get needed data in one step (join only one time the big tables)
					-- step 1
						INSERT INTO session.jcl					
						SELECT 
							       jj.JobName,
							       jd.DDName,
							       UPPER(jd.DDName) AS DDNameU,
								   NULLIF(DDPosition.ResourceFilePath, '0')  AS DDPath,
						           DDPosition.StartRow AS DDStartRow,
							       js.CalledPgmID,
								   jr.DataSetID,
							       jr.MemberName
							FROM  JCLJob jj
						           INNER JOIN JCLStep js ON jj.JobID = js.JobID
								   INNER JOIN JCLDD jd ON js.StepID = jd.StepID
								   INNER JOIN JCLPosition AS DDPosition ON DDPosition.PositionID = jd.PositionID
								   INNER JOIN JCLDDRef jr ON jd.DDID = jr.DDID
							WHERE jd.StepID IS NOT NULL
							      AND jr.DDID IS NOT NULL	   
								  AND js.JobID IS NOT NULL
								  AND jd.PositionID IS NOT NULL ;
		   
					

		  
                            -- step 2
							INSERT INTO session.core
							SELECT 
							        os.StartRow AS StatementStartRow,
							        os.StartCol AS StatementStartColumn,
							        os.EndRow AS StatementEndRow,
							        os.EndCol AS StatementEndColumn,
								    pth1.PathStr AS StmtPathStr,
								    st.Description,
								    UPPER(st.Description) AS DescriptionU,
								    pg1.ProgramID,
							        pga1.AliasName AS ProgramName,
							        pg1.ProgramTypeID,
								    pth2.PathStr AS ProgramPath,
								    occ.StartRow AS ProgStartRow,
							        occ.StartCol AS ProgStartCol,
								    occ.EndRow AS ProgEndRow,
								    occ.EndCol AS ProgEndCol,
								    pg1.Ancestor,
								    pg2.ProgramID AS AncestorID,
							        pg2.ProgramTypeID AS AncestorTypeID,
								    f.Name AS FileName,
								    UPPER(f.Name) AS FileNameU,
							        f.LogicalName AS FileLogicalName,
								    f.TypeCode AS FileTypeCode
							FROM StatementReference sr
							     INNER JOIN Files f ON f.FileID = sr.ResourceID
							     INNER JOIN OccurrencesStmt os ON os.OccurID = sr.OccurID
								 INNER JOIN Statements st ON sr.StatementType = st.StatementType
								 INNER JOIN ProgramAliases pga1 ON pga1.ProgramID = os.ProgID AND pga1.AliasType = 0
								 INNER JOIN Programs pg1 ON pg1.ProgramID = os.ProgID
								 LEFT OUTER JOIN (
								                   SELECT DISTINCT pga2.ProgramID, pga2.AliasName, UPPER(pga2.AliasName) AS AliasNameU,  tpg2.ProgramTypeID 
								                   FROM ProgramAliases pga2 
												          INNER JOIN Programs tpg2 ON pga2.ProgramID = tpg2.ProgramID AND  tpg2.ProgramTypeID = 8 
												    ) pg2 ON  pg2.AliasNameU = UPPER(pg1.Ancestor)
							     INNER JOIN Occurrences occ ON occ.OccurID = pg1.OccurID
							     INNER JOIN Paths pth1 ON os.PathID = pth1.PathID
							     INNER JOIN Paths pth2 ON occ.PathID = pth2.PathID
							WHERE sr.ResourceType = 9;


                            BEGIN
						      COMMIT; 
				              TRUNCATE TABLE cacheEZViewer_Usage_DSInPrg ;
				            END;



							INSERT INTO cacheEZViewer_Usage_DSInPrg
							SELECT DataSetName, GenerationNumber, DataSetID, IsTemp, JobName, DDName, LogicalName, DDPath, DDStartRow,
								   ProgramID, ProgramName, ProgramTypeID, ProgramPath, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol,
							       Ancestor, AncestorID, AncestorTypeID, Description, 
								   StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn, StmtPathStr,
							       DataSetMemberName
							FROM
							 (		  SELECT COALESCE(jpds.DataSetName, 'UNKNOWN') AS DataSetName,
										     CASE
											   WHEN jpds.IsGeneration = 1 THEN jpds.GenerationNumber
											   ELSE NULL
										      END AS GenerationNumber,
										    jpds.DataSetID,
										    jpds.IsTemp,
										    jcl.JobName,
										    COALESCE(jcl.DDName, cr.FileName) AS DDName,
										    cr.FileLogicalName AS LogicalName,
										    jcl.DDPath,
										    jcl.DDStartRow,
										    cr.ProgramID,
										    cr.ProgramName,
										    cr.ProgramTypeID,
										    cr.ProgramPath,
										    cr.ProgStartRow,
										    cr.ProgStartCol,
										    cr.ProgEndRow,
										    cr.ProgEndCol,
										    cr.Ancestor,
										    cr.AncestorID,
										    cr.AncestorTypeID,
										    cr.Description,
										    cr.StatementStartRow,
										    cr.StatementStartColumn,
										    cr.StatementEndRow,
										    cr.StatementEndColumn,
										    cr.StmtPathStr,
										    jcl.MemberName AS DataSetMemberName
									  FROM session.core cr
										  LEFT OUTER JOIN ProgramsUsedInPgm pu ON cr.ProgramID = pu.ProgramID
										  LEFT OUTER JOIN session.jcl jcl ON pu.JclPgmID = jcl.CalledPgmID
										  LEFT OUTER JOIN JCLPhysicalDataSet jpds ON jcl.DataSetID = jpds.DataSetID 
									  WHERE   ( 
									             jcl.DDNameU IS NULL 
									  	         OR ( cr.FileNameU = jcl.DDNameU 
									  	              OR 
									  	                -- cr.FileNameU LIKE '%-'||  jcl.DDNameU
									  	                (LOCATE_IN_STRING(cr.FileNameU, '-'|| jcl.DDNameU, -1) > 0  -- check existence
                                                         AND 
                                                         LOCATE_IN_STRING(cr.FileNameU, '-'|| jcl.DDNameU, -1) = LENGTH(cr.FileNameU) + 1 -1 - LENGTH(jcl.DDNameU) -- last position in string
                                                        )								  	              
									  	            )
									  	       )
											AND (jpds.IsInstream  != 1 OR jpds.IsInstream IS NULL)
											AND cr.DescriptionU NOT LIKE 'CICS%'
							
							
									  UNION
									  SELECT 
										    jpds.DataSetName,
										    CASE
											   WHEN jpds.IsGeneration = 1 THEN jpds.GenerationNumber
											   ELSE NULL
										    END AS GenerationNumber,
										    jpds.DataSetID,
										    jpds.IsTemp,
										    jcl.JobName,
										    jcl.DDName,
										    'N/A' AS LogicalName,
										    jcl.DDPath,
										    jcl.DDStartRow,
										    CAST(NULL AS INTEGER) AS ProgramID,
										    jp.PgmName AS ProgramName,
										    jp.PgmType AS ProgramTypeID,
										    CAST(NULL AS VARCHAR(250)) AS ProgramPath,
										    CAST(NULL AS INTEGER) AS ProgStartRow,
										    CAST(NULL AS INTEGER) AS ProgStartCol,
										    CAST(NULL AS INTEGER) AS ProgEndRow,
										    CAST(NULL AS INTEGER) AS ProgEndCol,
										    '' AS Ancestor,
										    CAST(NULL AS INTEGER) AS AncestorID,
										    CAST(NULL AS INTEGER) AS AncestorTypeID,
										    'N/A' AS Description, 
										    CAST(NULL AS INTEGER) AS StatementStartRow,
										    CAST(NULL AS INTEGER) AS StatementStartColumn,
										    CAST(NULL AS INTEGER) AS StatementEndRow,
										    CAST(NULL AS INTEGER) AS StatementEndColumn,
										    CAST(NULL AS VARCHAR(250)) AS StmtPathStr,
										    jcl.MemberName AS DataSetMemberName
									  FROM session.jcl jcl
										  INNER JOIN JCLPhysicalDataSet jpds ON jpds.IsInstream != 1 AND jcl.DataSetID = jpds.DataSetID
										  INNER JOIN JCLPgm jp ON jcl.CalledPgmID = jp.PgmID 
										  LEFT OUTER JOIN 																		
										                 (   
																			 SELECT DISTINCT
																			        p.ProgramID,
																			        --p.Ancestor,
																		            --p.ProgramTypeID,
																		            p.OccurID,
																			        pa.AliasName AS ProgramName,
																			        UPPER(pa.AliasName) AS ProgramNameU
																			 FROM Programs p
																				   INNER JOIN ProgramAliases pa ON p.ProgramID = pa.ProgramId 
														 ) pg ON pg.OccurID != 0 AND UPPER(jp.PgmName) =  pg.ProgramNameU
									  WHERE pg.ProgramID IS NULL
							 
							 
									  UNION
									  SELECT 
									  		CASE WHEN  mf.DSName IS NULL THEN 'UNKNOWN' 
					 							 WHEN  mf.DSName='' THEN 'UNKNOWN' 
					 							 ELSE mf.DSName END  AS DataSetName,
										    CAST(NULL AS INTEGER) AS GenerationNumber,
										    CAST(NULL AS INTEGER) AS DataSetID,
										    CAST(NULL AS INTEGER) AS IsTemp,
										    CAST(NULL AS VARCHAR(50)) AS JobName,
										    'N/A' AS DDName,
										    cr.FileLogicalName AS LogicalName,
										    CAST(NULL AS VARCHAR(250)) AS DDPath,
										    CAST(NULL AS INTEGER) AS DDStartRow,
										    cr.ProgramID,
										    cr.ProgramName,
										    cr.ProgramTypeID,
										    cr.ProgramPath,
										    cr.ProgStartRow,
										    cr.ProgStartCol,
										    cr.ProgEndRow,
										    cr.ProgEndCol,
										    cr.Ancestor,
										    cr.AncestorID,
										    cr.AncestorTypeID,
										    cr.Description,
										    cr.StatementStartRow,
										    cr.StatementStartColumn,
										    cr.StatementEndRow,
										    cr.StatementEndColumn,
										    cr.StmtPathStr,
										    CAST(NULL AS VARCHAR(50)) AS DataSetMemberName
									  FROM session.core cr
										  LEFT OUTER JOIN MFCICSFile mf ON cr.FileNameU = UPPER(mf.DDName)
									  WHERE  cr.FileTypeCode IS NULL  
										    AND cr.DescriptionU LIKE 'CICS%'
							    )s;	   

								
END ss 

 


