LANGUAGE SQL
sp:BEGIN   

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

		DECLARE GLOBAL TEMPORARY TABLE SESSION.prog
		( 
	         ProgramNameU   VARCHAR(256),
	         AliasName      VARCHAR(256),
	         ProgramID      INTEGER,
			 ProgramTypeID  INTEGER,
			 ProgramPath   VARCHAR(256),
			 ProgStartRow  INTEGER,
	         ProgStartCol INTEGER,
	         ProgEndRow   INTEGER,
	         ProgEndCol   INTEGER,
	         Ancestor      VARCHAR(256),
	         AncestorID      INTEGER,
			 AncestorTypeID  INTEGER 
		) ON COMMIT PRESERVE ROWS
		  NOT LOGGED
		;
	
		 DECLARE GLOBAL TEMPORARY TABLE SESSION.jcl
			( 
			DataSetName varchar(100) ,
			GenerationNumber int ,
			DataSetID int ,
			IsTemp int ,
			DataSetMemberName varchar(50) ,
			Class varchar(50) ,
			JobID int ,
			JobName varchar(50) ,
			MemberName varchar(50) ,
			CA7JobName varchar(255) ,
			CA7JobId int ,
			JobPath varchar(250) ,
			StepName varchar(50) ,
			StepPath varchar(250) ,
			stepStartRow int ,
			DDName varchar(50) ,
			DDPath varchar(250) ,
			DDStartRow int ,
			Status varchar(50) ,
			NormalDisposition varchar(50),
			IsDummy int ,
			OverridingDDID int ,
			ProgramNameU   VARCHAR(256),
			JCLPgm_PgmName VARCHAR(256)
		) ON COMMIT PRESERVE ROWS
		  NOT LOGGED
		;
							
										  
		 INSERT INTO SESSION.prog
		 SELECT  DISTINCT
		         UPPER(pa.AliasName) AS ProgramNameU
				 --,CASE WHEN pa.AliasType = 0 THEN pa.AliasName ELSE NULL END AS AliasName
				 ,pax.AliasName
				 ,prg.ProgramID
				 ,prg.ProgramTypeID
				 ,pth.PathStr AS ProgramPath
				 ,occ.StartRow AS ProgStartRow
				 ,occ.StartCol AS ProgStartCol
				 ,occ.EndRow AS ProgEndRow
				 ,occ.EndCol AS ProgEndCol
				 ,prg.Ancestor
				 ,Programs_Ancestor.ProgramID AS AncestorID
				 ,Programs_Ancestor.ProgramTypeID AS AncestorTypeID
				FROM
					  (SELECT DISTINCT ProgramID
								 ,ProgramTypeID
								 ,Ancestor
								 ,UPPER(Ancestor) AS AncestorU
								 ,OccurID
					   FROM Programs
					   WHERE ProgramTypeID NOT IN (8 ,13)
					   ) prg
					  INNER JOIN ProgramAliases pa ON prg.ProgramID = pa.ProgramId
					  LEFT OUTER JOIN 
									  (SELECT DISTINCT UPPER(AliasName) AS AliasNameU ,ProgramId
									   FROM ProgramAliases
									   ) AS Aliases_Ancestor ON Aliases_Ancestor.AliasNameU = prg.AncestorU
					  LEFT OUTER JOIN Programs Programs_Ancestor ON Programs_Ancestor.ProgramID = Aliases_Ancestor.ProgramID AND  Programs_Ancestor.ProgramTypeID IN (8 ,13)
					  LEFT OUTER JOIN Occurrences occ ON occ.OccurID = prg.OccurID
					  LEFT OUTER JOIN Paths pth ON pth.PathID = occ.PathID
		              LEFT OUTER JOIN ProgramAliases pax ON prg.ProgramID = pax.ProgramId AND pax.AliasType = 0;	  
	             COMMIT;
	
	
	      INSERT INTO SESSION.jcl
	      SELECT 
	              jpds.DataSetName,
				CASE
				    WHEN jpds.IsGeneration = 1 THEN jpds.GenerationNumber
				    ELSE NULL
				END AS GenerationNumber,
				jpds.DataSetID,
				jpds.IsTemp,
				jref.MemberName AS DataSetMemberName,
				jsds.Class,
				jj.JobID,
				jj.JobName,
				jj.MemberName,
				ca.JOB_NAME AS CA7JobName,
				ca.JobId AS CA7JobId,
				JobPosition.ResourceFilePath AS JobPath,
				js.StepName,
				jpos.ResourceFilePath AS StepPath,
				jpos.StartRow AS stepStartRow,
				jd.DDName,
				CASE
				    WHEN jd.OverridingDDID > 0 THEN NULLIF(DDPositionOver.ResourceFilePath, '0') 
				    ELSE NULLIF(DDPosition.ResourceFilePath, '0')  
				END AS DDPath,
				CASE
				    WHEN jd.OverridingDDID > 0 THEN DDPositionOver.StartRow
				    ELSE DDPosition.StartRow
				END AS DDStartRow,
				jst.Description AS Status,
				jdis.Description AS NormalDisposition,
				CASE
				    WHEN jd.DDID IS NULL THEN NULL
				    ELSE jd.IsDummy
				END AS IsDummy,
				CASE
				    WHEN jd.DDID IS NULL THEN NULL
				    ELSE jd.OverridingDDID
				END AS OverridingDDID,
				UPPER(jp.PgmName) AS PgmNameU,
				jp.PgmName AS JCLPgm_PgmName
		   FROM JCLJob jj
			   INNER JOIN JCLStep js ON js.CalledProcID = 0 AND js.JobID = jj.JobID
			   INNER JOIN JCLPgm jp ON jp.PgmID = js.CalledPgmID   
			   INNER JOIN JCLPosition jpos ON jpos.PositionID = js.PositionID
			   INNER JOIN JCLPosition AS JobPosition ON jj.PositionID = JobPosition.PositionID
			   LEFT OUTER JOIN ca7_jobs ca ON UPPER(ca.JCL_MEMBER) = UPPER(jj.MemberName)
			   LEFT OUTER JOIN JCLDD jd ON jd.StepID = js.StepID
			   LEFT OUTER JOIN JCLDD AS Overr ON jd.OverridingDDID = Overr.DDID
			   LEFT OUTER JOIN JCLPosition AS DDPositionOver ON DDPositionOver.PositionID = Overr.PositionID
			   LEFT OUTER JOIN JCLPosition AS DDPosition ON DDPosition.PositionID = jd.PositionID
			   LEFT OUTER JOIN JCLDDRef jref ON jref.DDID = jd.DDID
			   LEFT OUTER JOIN JCLPhysicalDataSet jpds ON jpds.DataSetID = jref.DataSetID
			   LEFT OUTER JOIN JCLSpoolDataSet jsds ON jsds.SpoolID = jref.SpoolDataSetID
			   LEFT OUTER JOIN JCLStatusType jst ON jref.Status = jst.JCLStatusType
			   LEFT OUTER JOIN JCLDisposition jdis ON jref.NormalDisposition = jdis.JCLDispositionType
			 WHERE  (jpds.IsInstream <> 1 OR jpds.IsInstream IS NULL) ;
	         COMMIT;
	
	
	        BEGIN
		      COMMIT; 
	          TRUNCATE TABLE cacheEZViewer_Usage_PgmInJob ;
	        END;
	
	
          LOCK TABLE  cacheEZViewer_Usage_PgmInJob IN EXCLUSIVE MODE ;-- lock table  
	      INSERT INTO cacheEZViewer_Usage_PgmInJob 
		  SELECT DISTINCT
		         j.DataSetName, j.GenerationNumber, j.DataSetID, j.IsTemp, j.DataSetMemberName, j.Class,
	             j.JobID, j.JobName, j.MemberName, j.CA7JobName, j.CA7JobId, j.JobPath,
	             j.StepName, j.StepPath,j.stepStartRow, 
	              case when p.AliasName is null then j.JCLPgm_PgmName  else p.AliasName end AS ProgramName,
	             j.DDName, j.DDPath, j.DDStartRow, j.Status, j.NormalDisposition,
	             j.IsDummy, j.OverridingDDID,
	             p.ProgramID, p.ProgramTypeID, p.ProgramPath, p.ProgStartRow, p.ProgStartCol, p.ProgEndRow, p.ProgEndCol, 
	             p.Ancestor, p.AncestorID, p.AncestorTypeID
           FROM  SESSION.jcl j
                 LEFT OUTER JOIN SESSION.prog p ON p.ProgramNameU = j.ProgramNameU ;
	       COMMIT;
												
		END;		

END 