LANGUAGE SQL
sp:BEGIN   


			-- clean-up temporary tables / session tables
     			BEGIN
					DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
					BEGIN END;
					
					COMMIT;
					DROP TABLE SESSION.sr;
					DROP TABLE SESSION.core;
					DROP TABLE SESSION.jpos;
					
					DROP INDEX SESSION.uidx ;
					DROP INDEX SESSION.ncidx_sr ;
				END;


			-- declare temp tables
	                  DECLARE GLOBAL TEMPORARY TABLE session.sr
		               (
					    lnk INTEGER ,
					    isProc INTEGER ,
					    PgmOrProcName VARCHAR(256) ,
					    ProgramId INTEGER ,
					    ProgramTypeID INTEGER ,
					    PgmOrProcPath VARCHAR(250) ,
					    PgmOrProcStartRow INTEGER ,
					    PgmOrProcStartCol INTEGER ,
					    PgmOrProcEndRow INTEGER ,
					    PgmOrProcEndCol INTEGER 
		                ) 
		                ON COMMIT PRESERVE ROWS NOT LOGGED ;
		                

                       DECLARE GLOBAL TEMPORARY TABLE session.core
		               (
							DataSetName VARCHAR(100) ,
							GenerationNumber INTEGER ,
							DataSetID INTEGER ,
							IsTemp INTEGER ,
							DataSetMemberName VARCHAR(50) ,
							JobID INTEGER ,
							JobName VARCHAR(50) ,
							MemberName VARCHAR(50) ,
							CA7JobName VARCHAR(255) ,
							CA7JobId INTEGER ,
							StepName VARCHAR(50) ,
							DDName VARCHAR(50) ,
							Status VARCHAR(50) ,
							NormalDisposition VARCHAR(50) ,
							IsDummy INTEGER ,
							OverridingDDID INTEGER ,
							CalledPgmID INTEGER ,
							CalledProcID INTEGER ,
							StepPathID INTEGER ,
							JobPathID INTEGER ,
							DDPathID INTEGER,
							AMSFlag SMALLINT,
						    AMSPath VARCHAR(250),
						    AMSStartRow INTEGER,
						    AMSEndRow INTEGER,
						    AMSStartCol INTEGER,
						    AMSEndCol INTEGER,
						    AMSUsageType VARCHAR(50),
						    AMSStatementType VARCHAR(50)
                         ) ON COMMIT PRESERVE ROWS NOT LOGGED ;


                        DECLARE GLOBAL TEMPORARY TABLE session.jpos
		               (
					    PositionID INTEGER ,
					    ResourceFilePath VARCHAR(250) ,
					    StartRow INTEGER,
					    StartCol INTEGER,
						EndRow INTEGER,
						EndCol INTEGER
		                ) ON COMMIT PRESERVE ROWS NOT LOGGED ;


    
                    -- fill in temp tables
                      INSERT INTO SESSION.jpos
                      SELECT PositionID,
                             ResourceFilePath,
                             StartRow ,
                             StartCol ,
						     EndRow ,
						     EndCol
                      FROM JCLPosition;
                      COMMIT;
                      
  
                      CREATE UNIQUE INDEX uidx ON SESSION.jpos (PositionID) INCLUDE (ResourceFilePath, StartRow, StartCol, EndRow, EndCol) ;           
                      COMMIT;
                     
  
                             

				      INSERT INTO session.sr 
					  SELECT *
					  FROM
							(
							      
							        SELECT
												j.PgmID AS lnk, 
												0 AS isProc,
												COALESCE(prg.ProgramName, j.PgmName) AS PgmOrProcName,
												prg.ProgramID AS ProgramId,
												prg.ProgramTypeID,
												pth.PathStr AS PgmOrProcPath,
												occ.StartRow AS PgmOrProcStartRow,
												occ.StartCol AS PgmOrProcStartCol,
												occ.EndRow AS PgmOrProcEndRow,
												occ.EndCol AS PgmOrProcEndCol  
										   FROM     (
		                                                   SELECT DISTINCT
		          												 PgmID, 
		          												 PgmName ,
		          												 UPPER(PgmName) AS PgmNameU 
							          						 FROM JCLPgm 
							                                 WHERE PgmID != 0
							                         )j  
										         LEFT OUTER JOIN 
																		(   
																			 SELECT DISTINCT
																			        pa.ProgramID,
																			        UPPER(pa.AliasName) AS AliasNameU 
																			 FROM  ProgramAliases pa 
																		  )  pal ON pal.AliasNameU =  j.PgmNameU
										   
                                                LEFT OUTER JOIN 
																		(   
																			 SELECT pg.ProgramID,
																			        --pg.Ancestor,
																		            pg.ProgramTypeID,
																		            pg.OccurID,
																			        pa.AliasName AS ProgramName
																			 FROM Programs pg
																				   INNER JOIN ProgramAliases pa ON pg.ProgramID = pa.ProgramId AND pa.AliasType = 0
																		  )  prg ON prg.ProgramID = pal.ProgramID
													LEFT OUTER JOIN Occurrences occ ON occ.OccurID = prg.OccurID
													LEFT OUTER JOIN Paths pth ON pth.PathID = occ.PathID
				                           WHERE j.PgmID != 0
										    
										   UNION
									
										   SELECT jp.ProcID AS lnk,
												1 AS isProc,
												jp.ProcName AS PgmOrProcName,	  
												CAST(NULL AS INT) AS ProgramId,
												CAST(NULL AS INT) AS ProgramTypeID,	   
													   CASE
														  WHEN ProcPosition.ResourceFilePath = '0'
														  THEN NULL
														  ELSE ProcPosition.ResourceFilePath
													   END AS PgmOrProcPath,
													   ProcPosition.StartRow AS PgmOrProcStartRow,
													   ProcPosition.StartCol AS PgmOrProcStartCol,
													   ProcPosition.EndRow AS PgmOrProcEndRow,
													   ProcPosition.EndCol AS PgmOrProcEndCol
											FROM JCLProc jp 
												INNER JOIN SESSION.jpos AS ProcPosition ON ProcPosition.PositionID = jp.PositionID
										     WHERE jp.ProcID != 0
										)procORprog;
								COMMIT;		
										


	                      CREATE INDEX ncidx_sr	ON session.sr (isProc, lnk, PgmOrProcName, ProgramId, ProgramTypeID, PgmOrProcPath, PgmOrProcStartRow, PgmOrProcStartCol,PgmOrProcEndRow, PgmOrProcEndCol);  
	                      COMMIT;
                      




				         INSERT INTO session.core
						 SELECT 
							    jpds.DataSetName,
							    CASE
								   WHEN jpds.IsGeneration = 1 THEN jpds.GenerationNumber
								   ELSE CAST(NULL AS INTEGER)
							    END AS GenerationNumber,
							    jpds.DataSetID,
							    jpds.IsTemp,
							    x.DataSetMemberName,
							    y.JobID,
							    y.JobName,
							    y.MemberName,
							    ca.JOB_NAME AS CA7JobName,
							    ca.JobId AS CA7JobId,
							    y.StepName,
							    x.DDName,
							    x.Status,
							    x.NormalDisposition,
							    x.IsDummy,
							    x.OverridingDDID,
							    y.CalledPgmID,
							    y.CalledProcID,
							    y.StepPathID,
							    y.JobPathID,
							    x.DDPathID,
								 -- new columns
							    x.AMSFlag,
								x.AMSPath,
								x.AMSStartRow,
								x.AMSEndRow,
								x.AMSStartCol,
								x.AMSEndCol,
								x.AMSUsageType,
								x.AMSStatementType
						  FROM 
				                 (
										       SELECT    jj.JobID,
											             jj.JobName,
											             jj.MemberName,
								                         UPPER(jj.MemberName) AS MemberNameU, 
								                         jj.PositionID AS JobPathID,
								                         js.StepName,
								                         js.StepID,
								                         js.CalledPgmID,
											             js.CalledProcID,
											             js.PositionID AS StepPathID
										       FROM  JCLJob jj
											           INNER JOIN JCLStep js ON jj.JobID = js.JobID
				                               WHERE js.CalledPgmID <> 0 OR js.CalledProcID <> 0 
				                  ) y
                                   LEFT OUTER JOIN ca7_jobs ca ON UPPER(ca.JCL_MEMBER) = y.MemberNameU
							       INNER JOIN (
													SELECT  0 AS AMSFlag,
													       jdd.JobID,
														   jdd.StepID,
														   jdr.DataSetID,
														   jdd.DDName,
														   jdd.PositionID AS DDPathID,
														   CASE
															  WHEN jdd.DDID IS NULL THEN CAST(NULL AS INTEGER)
															  ELSE jdd.IsDummy
														   END AS IsDummy,
														   CASE
															  WHEN jdd.DDID IS NULL THEN CAST(NULL AS INTEGER)
															  ELSE jdd.OverridingDDID
														   END AS OverridingDDID,
														   jdr.MemberName AS DataSetMemberName,
														   jst.Description AS Status,
														   jd.Description AS NormalDisposition,
															-- new columns
														    CAST(NULL AS VARCHAR(250)) AS AMSPath,
														    CAST(NULL AS INTEGER) AS AMSStartRow,
														    CAST(NULL AS INTEGER) AS AMSEndRow,
														    CAST(NULL AS INTEGER) AS AMSStartCol,
														    CAST(NULL AS INTEGER) AS AMSEndCol,
														    CAST(NULL AS VARCHAR(50)) AS AMSUsageType,
														    CAST(NULL AS VARCHAR(50)) AS AMSStatementType
														    --  new columns
												    FROM  JCLDD jdd
														 INNER JOIN  JCLDDRef jdr ON jdr.DDID = jdd.DDID
														 INNER JOIN  JCLStatusType jst ON jdr.Status = jst.JCLStatusType
														 INNER JOIN  JCLDisposition jd ON jdr.NormalDisposition = jd.JCLDispositionType
						
													UNION
						
						
													SELECT  1 AS AMSFlag,
													        istm.JobID,
														    istm.StepID,
														    idu.DataSetID,
														    idu.DDName AS DDName,
														    CAST(NULL AS INTEGER) AS DDPathID,
														    CAST(NULL AS INTEGER) AS IsDummy,
														    CAST(NULL AS INTEGER) AS OverridingDDID,
														    idu.MemberName AS DataSetMemberName,
														    CAST(NULL AS VARCHAR(50)) AS Status,
														    CAST(NULL AS VARCHAR(50)) AS NormalDisposition,
														    -- new columns
														    jp.ResourceFilePath AS AMSPath,
														    jp.StartRow AS AMSStartRow,
														    jp.EndRow AS AMSEndRow,
														    jp.StartCol AS AMSStartCol,
														    jp.EndCol AS AMSEndCol,
														    idutp.Description AS AMSUsageType,
														    istmtp.Description AS AMSStatementType
														    -- new columns
													 FROM   JCLIDCAMSStatements istm
														    INNER JOIN  JCLIDCAMSDatasetUsages idu ON idu.IDCAMSStatementID = istm.IDCAMSStatementID
														    INNER JOIN  SESSION.jpos jp ON istm.PositionID = jp.PositionID
														    LEFT OUTER JOIN  JCLIDCAMSDatasetUsageTypes idutp ON idu.IDCAMSDatasetUsageTypeID = idutp.IDCAMSDatasetUsageTypeID
														    LEFT OUTER JOIN  JCLIDCAMSStatementTypes istmtp ON istm.IDCAMSStatementTypeID = istmtp.IDCAMSStatementTypeID 
													   ) x ON x.JobID = y.JobID AND x.StepID = y.StepID
							  INNER JOIN JCLPhysicalDataSet jpds ON jpds.DataSetID = x.DataSetID AND jpds.IsInstream <> 1 ;
                              COMMIT;



                         BEGIN
						      COMMIT; 
				              TRUNCATE TABLE cacheEZViewer_Usage_DSInJob ;
				          END;



						  
						  
						        LOCK TABLE cacheEZViewer_Usage_DSInJob IN EXCLUSIVE MODE ;-- lock table 
						        INSERT INTO cacheEZViewer_Usage_DSInJob
					            SELECT * 
					            FROM
					                (
						             SELECT   
						                 c.DataSetName,
										 c.GenerationNumber,
										 c.DataSetID,
										 c.IsTemp,
										 c.DataSetMemberName,
										 c.JobID,
										 c.JobName,
										 c.MemberName,
										 c.CA7JobName,
										 c.CA7JobId,
										 pth1.ResourceFilePath AS JobPath,
										 c.StepName,
										 pth2.ResourceFilePath AS StepPath,
										 pth2.StartRow AS stepStartRow,
										 s.isProc,
										 s.PgmOrProcName,
										 c.DDName,
										 CASE
											WHEN pth3.ResourceFilePath = '0'
											THEN NULL
											ELSE pth3.ResourceFilePath
										 END AS DDPath,
										 pth3.StartRow AS DDStartRow,
										 c.Status,
										 c.NormalDisposition,
										 c.IsDummy,
										 c.OverridingDDID,
										 s.ProgramId,
										 s.ProgramTypeID,
										 s.PgmOrProcPath,
										 s.PgmOrProcStartRow,
										 s.PgmOrProcStartCol,
										 s.PgmOrProcEndRow,
										 s.PgmOrProcEndCol,
										 c.AMSFlag,
										 c.AMSUsageType,
										 c.AMSStatementType,
										 c.AMSPath,
										 c.AMSStartRow,
										 c.AMSStartCol,
										 c.AMSEndRow,
										 c.AMSEndCol  
									FROM session.core c 
											  INNER JOIN session.sr s ON s.isProc = 1 AND c.CalledProcID = s.lnk
											  INNER JOIN SESSION.jpos pth1 ON pth1.PositionID = c.JobPathID
											  INNER JOIN SESSION.jpos pth2 ON pth2.PositionID = c.StepPathID
											  LEFT OUTER JOIN SESSION.jpos pth3 ON pth3.PositionID = c.DDPathID
											  
		                               UNION
		                              
								     SELECT 
								             c.DataSetName,
											 c.GenerationNumber,
											 c.DataSetID,
											 c.IsTemp,
											 c.DataSetMemberName,
											 c.JobID,
											 c.JobName,
											 c.MemberName,
											 c.CA7JobName,
											 c.CA7JobId,
											 pth1.ResourceFilePath AS JobPath,
											 c.StepName,
											 pth2.ResourceFilePath AS StepPath,
											 pth2.StartRow AS stepStartRow,
											 s.isProc,
											 s.PgmOrProcName,
											 c.DDName,
											 CASE
												WHEN pth3.ResourceFilePath = '0' THEN NULL
												ELSE pth3.ResourceFilePath
											 END AS DDPath,
											 pth3.StartRow AS DDStartRow,
											 c.Status,
											 c.NormalDisposition,
											 c.IsDummy,
											 c.OverridingDDID,
											 s.ProgramId,
											 s.ProgramTypeID,
											 s.PgmOrProcPath,
											 s.PgmOrProcStartRow,
											 s.PgmOrProcStartCol,
											 s.PgmOrProcEndRow,
											 s.PgmOrProcEndCol,
											 c.AMSFlag,
											 c.AMSUsageType,
											 c.AMSStatementType,
											 c.AMSPath,
											 c.AMSStartRow,
											 c.AMSStartCol,
											 c.AMSEndRow,
											 c.AMSEndCol
										FROM session.core c
												  INNER JOIN session.sr s ON s.isProc = 0 AND c.CalledPgmID = s.lnk
												  INNER JOIN SESSION.jpos pth1 ON pth1.PositionID = c.JobPathID
												  INNER JOIN SESSION.jpos pth2 ON pth2.PositionID = c.StepPathID
												  LEFT OUTER JOIN  SESSION.jpos pth3 ON pth3.PositionID = c.DDPathID 
	  
                                    )src;
                                    COMMIT;  
                                    

END