DYNAMIC RESULT SETS 1
LANGUAGE SQL
 BEGIN


       BEGIN


		          DECLARE GLOBAL TEMPORARY TABLE SESSION.j
					(
					  DataSetName VARCHAR(100),
		              JobName VARCHAR(50),
		              MemberName VARCHAR(50),
		              DSMemberName VARCHAR(50),
		              CalledPgmID INTEGER,
		              DDName VARCHAR(50)
					) WITH REPLACE 
                      ON COMMIT PRESERVE ROWS
					  NOT LOGGED;
			
			
			
			      DECLARE GLOBAL TEMPORARY TABLE SESSION.pgminpgm
					(
					  JclPgmID INTEGER,
		              ProgramID INTEGER
					) WITH REPLACE 
                      ON COMMIT PRESERVE ROWS
					  NOT LOGGED;
			
			
			
			      DECLARE GLOBAL TEMPORARY TABLE SESSION.pgm
					(
					  ProgramId INTEGER,
					  Ancestor VARCHAR(250),
					  ProgramTypeID INTEGER,
					  OccurID INTEGER
					) WITH REPLACE 
                      ON COMMIT PRESERVE ROWS
					  NOT LOGGED;
			
			
			
			
			
			      -- get core data
			      INSERT INTO SESSION.j (DataSetName, JobName, MemberName, DSMemberName, CalledPgmID, DDName)
			      SELECT  jpds.DataSetName, jj.JobName, jj.membername, jref.MemberName AS dsMemberName, js.CalledPgmID, jd.DDName
			      FROM JCLJob jj
			          INNER JOIN JCLStep js ON jj.JobID = js.JobID
			          INNER JOIN JCLDD jd ON js.StepID = jd.StepID
			          INNER JOIN JCLDDRef jref ON jd.DDID = jref.DDID
			          INNER JOIN JCLPhysicalDataSet jpds ON jref.DataSetID = jpds.DataSetID
			          INNER JOIN SESSION.ds_param_temp tt ON jpds.DataSetID = tt.dsId AND jref.MemberName = tt.dsMemberName;
			

			
			     INSERT INTO SESSION.pgminpgm (JclPgmID, ProgramID)
			     SELECT  puip.JclPgmID, puip.ProgramID
			     FROM ProgramsUsedInPgm puip
			     WHERE EXISTS (SELECT 1 FROM SESSION.j jj  WHERE jj.CalledPgmID = puip.JclPgmID);


			
			    INSERT INTO SESSION.pgm (ProgramId, Ancestor, ProgramTypeID, OccurID)
			    SELECT prx.ProgramId, prx.Ancestor, prx.ProgramTypeID, srx.OccurID
				FROM Programs prx
				    INNER JOIN StatementReference srx ON prx.ProgramID = srx.ResourceID AND srx.ResourceType = 5
				WHERE prx.OccurID = 0
				      AND  EXISTS (SELECT 1 FROM SESSION.pgminpgm pip WHERE pip.ProgramId = prx.ProgramId);				
			



               -- create appropriate indexes
               CREATE INDEX ncidx_j ON SESSION.j (CalledPgmID, DataSetName, JobName, MemberName, DSMemberName, DDName);
               CREATE INDEX ncidx_pgminpgm ON SESSION.pgminpgm (ProgramID ASC, JclPgmID ASC);


			   BEGIN
			

					    DECLARE crs CURSOR WITH RETURN FOR	
						SELECT  *
						FROM
						     (
						
						            SELECT
								            j.DataSetName,
								            j.JobName,
								            jprg.PgmName AS ProgramName,
								            '' AS ProgramAncestor,
								            '#EZ1#' AS Description,
								            0 AS Count,
								            jprg.PgmName AS k,
								            j.membername,
								            j.dsMemberName,
											CAST(NULL AS VARCHAR(256)) AS PathStr
								     FROM SESSION.j j
                                          INNER JOIN JCLPgm jprg ON j.CalledPgmID = jprg.PgmID
								     WHERE NOT EXISTS (
														  SELECT 1
														  FROM Programs p
															   INNER JOIN ProgramAliases pa ON p.ProgramID = pa.ProgramId
														  WHERE p.OccurID <> 0 AND pa.AliasName = jprg.PgmName
													   )
								
								
									UNION
								
								     SELECT
								            j.DataSetName,
								            j.JobName,
								            pa.AliasName AS ProgramName,
								            ancestor(p.ProgramTypeid, p.Ancestor) AS Program_Ancestor,
								            '#EZ2#' AS Description,
								            0 AS Count,
								            (ancestor(p.ProgramTypeid, p.Ancestor) || pa.AliasName) AS k,
								            j.membername,
								            j.dsMemberName,
											CAST(NULL AS VARCHAR(256)) AS PathStr
								     FROM SESSION.pgm p
									      INNER JOIN ProgramAliases pa ON p.ProgramID = pa.ProgramId AND pa.AliasType = 0
									      INNER JOIN SESSION.pgminpgm puip ON p.ProgramID = puip.ProgramID
									      INNER JOIN SESSION.j j ON puip.JclPgmID = j.CalledPgmID
								     WHERE p.ProgramTypeID  != -1
								           -- abnormal condition / must be revised
								           OR (p.ProgramTypeID = -1 AND NOT EXISTS ( SELECT 1
														    			             FROM SESSION.pgm px
														    			             WHERE px.ProgramID = p.ProgramID AND px.Occurid = p.OccurID
														    		                )
									          )
								
								
								     /* -- before
								
								     	     SELECT
								            jpds.DataSetName,
								            jj.JobName,
								            pa.AliasName AS ProgramName,
								            ancestor(prg.ProgramTypeid, prg.Ancestor) AS Program_Ancestor,
								            '#EZ2#' AS Description,
								            0 AS Count,
								            (ancestor(prg.ProgramTypeid, prg.Ancestor) || pa.AliasName) AS k,
								            jj.membername,
								            jref.MemberName AS dsMemberName,
											CAST(NULL AS VARCHAR(256)) AS PathStr
								     FROM Programs prg
									      INNER JOIN ProgramAliases pa ON prg.ProgramID = pa.ProgramId AND pa.AliasType = 0
								          INNER JOIN ProgramsUsedInPgm puip ON prg.ProgramID = puip.ProgramID
								          INNER JOIN JCLStep js ON puip.JclPgmID = js.CalledPgmID
								          INNER JOIN JCLJob jj ON jj.JobID = js.JobID
								          INNER JOIN JCLDD jd ON js.StepID = jd.StepID
								          INNER JOIN JCLDDRef jref ON jd.DDID = jref.DDID
								          INNER JOIN JCLPhysicalDataSet jpds ON jref.DataSetID = jpds.DataSetID
								          INNER JOIN StatementReference sr ON prg.ProgramID = sr.ResourceID
								          INNER JOIN SESSION.ds_param_temp tt ON jpds.DataSetID =tt.dsId
								                                              AND jref.MemberName = tt.dsMemberName
								     WHERE prg.OccurID = 0
								           AND sr.ResourceType = 5
								           AND (prg.ProgramTypeID NOT IN (-1)
								                 OR (prg.ProgramTypeID = -1
								         AND sr.Occurid NOT IN
								        (
								            SELECT
								                   t.StmtRefOccurID
								            FROM
								            (
								                SELECT sr.OccurID AS StmtRefOccurID,
								                       prg.ProgramID
								                FROM StatementReference sr
								                     INNER JOIN Programs prg ON prg.ProgramID = sr.ResourceID
								                WHERE sr.ResourceType = 5
								                      AND prg.Occurid = 0
								            ) AS t
								            WHERE t.ProgramID = puip.ProgramID
								        )))
								
								
								     */
								
							
									UNION
								
								     SELECT j.DataSetName,
								            j.JobName,
								            p.ProgramName,
								            p.ProgramAncestor,
								            st.Description AS Description,
								            COUNT(sr.OccurID) AS Count,
								            (p.ProgramAncestor || p.ProgramName) AS k,
								            j.membername,
								            j.dsMemberName,
											pth.PathStr
								     FROM
								          (   SELECT px.ProgramId, px.ProgramName AS ProgramNameOrig, pax.AliasName AS ProgramName,
								                     ancestor(px.ProgramTypeid, px.Ancestor) AS ProgramAncestor, px.ProgramTypeID, px.OccurID
								               FROM Programs px
									               INNER JOIN ProgramAliases pax ON px.ProgramID = pax.ProgramId AND pax.AliasType = 0
									      ) p
								          INNER JOIN SESSION.pgminpgm puip ON p.ProgramID = puip.ProgramID
										  INNER JOIN SESSION.j j ON puip.JclPgmID = j.CalledPgmID
								          INNER JOIN Files f ON p.ProgramID = f.ProgID
								                                   AND (f.Name = j.DDName
															            OR
																        f.Name LIKE '%' || '-' || j.DDName															
																        )
								          INNER JOIN StatementReference sr ON f.FileID = sr.ResourceID
								          INNER JOIN Statements st ON sr.StatementType = st.StatementType		
										  LEFT OUTER JOIN
														  (
															 SELECT 1 AS Flag,
																   prax.AliasName AS AliasName,
																   prgx.ProgramTypeID
															 FROM Programs prgx
																 INNER JOIN ProgramAliases prax ON prgx.ProgramID = prax.ProgramId AND prax.AliasType = 0
															 GROUP BY prax.AliasName,
																	prgx.ProgramTypeID
															 HAVING COUNT(*) > 1
														  ) x ON p.ProgramNameOrig = x.AliasName AND p.ProgramTypeID = x.ProgramTypeID
											LEFT OUTER JOIN Occurrences occ ON occ.OccurID = p.OccurID
											LEFT OUTER JOIN Paths pth ON pth.PathID = occ.PathID AND x.Flag = 1								
								     WHERE sr.ResourceType = 9
								     GROUP BY j.DataSetName, j.JobName, p.ProgramName, p.ProgramAncestor, st.Description, j.membername, j.dsMemberName, pth.PathStr
								

											
									UNION   --AMS statements

									 SELECT
											jpds.DataSetName,
											jj.JobName,
											jpgm.PgmName AS ProgramName,
											'' AS ProgramAncestor,
											'AMS: ' || istmtp.Description AS Description,
											COUNT(istm.IDCAMSStatementID) AS Count,
											jpgm.PgmName AS k,
											jj.membername,
											idu.MemberName AS dsMemberName,
											CAST(NULL AS VARCHAR(256)) AS PathStr
									 FROM JCLJob jj
										  INNER JOIN JCLStep js ON jj.JobID = js.JobID
										  INNER JOIN JCLIDCAMSStatements istm ON js.StepID = istm.StepID
										  INNER JOIN JCLIDCAMSDatasetUsages idu ON idu.IDCAMSStatementID = istm.IDCAMSStatementID
										  INNER JOIN JCLPhysicalDataSet jpds ON idu.DataSetID = jpds.DataSetID
										  INNER JOIN JCLPgm jpgm ON js.CalledPgmID = jpgm.PgmID
										  INNER JOIN JCLIDCAMSStatementTypes istmtp ON istm.IDCAMSStatementTypeID = istmtp.IDCAMSStatementTypeID
										  INNER JOIN SESSION.ds_param_temp tt ON jpds.DataSetID = tt.dsId
								                                              AND (tt.dsMemberName IS NULL OR idu.MemberName = tt.dsMemberName)	
									 GROUP BY jj.JobName,
											  jj.membername,
											  jpds.DataSetName,
											  idu.MemberName,
											  jpgm.PgmName,
											  istmtp.Description
	

						      ) src
						  ORDER BY src.DataSetName, src.DSMemberName, src.JobName, src.membername, src.k, src.PathStr, src.Description;
					

                         OPEN crs;

                END;

           END;
 END	
