DYNAMIC RESULT SETS 1
LANGUAGE SQL
ss: BEGIN


	   -- clean up temp table if exists 
		BEGIN
			DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
			BEGIN END;
			
			COMMIT;
			DROP TABLE SESSION.j;
			DROP TABLE SESSION.pgminpgm;
			DROP TABLE SESSION.pgm;
			
			DROP INDEX SESSION.ncidx_j; 
            DROP INDEX SESSION.ncidx_pgminpgm;
		END;

       BEGIN
         

		          DECLARE GLOBAL TEMPORARY TABLE SESSION.j
					( 
					  DataSetName VARCHAR(100),
		              JobName VARCHAR(50),
		              MemberName VARCHAR(50),
		              DSMemberName VARCHAR(50), 
		              CalledPgmID INTEGER, 
		              DDNameU VARCHAR(50)
					) ON COMMIT PRESERVE ROWS NOT LOGGED ;
			  
			    
			
			      DECLARE GLOBAL TEMPORARY TABLE SESSION.pgminpgm
					( 
					  JclPgmID INTEGER,
		              ProgramID INTEGER
					) ON COMMIT PRESERVE ROWS NOT LOGGED ;
			
			
			
			      DECLARE GLOBAL TEMPORARY TABLE SESSION.pgm
					( 
					  ProgramId INTEGER, 
					  Ancestor VARCHAR(250),
					  ProgramTypeID INTEGER,
					  OccurID INTEGER
					) ON COMMIT PRESERVE ROWS NOT LOGGED ;
			
			
			
			
			
			      -- get core data
			      INSERT INTO SESSION.j (DataSetName, JobName, MemberName, DSMemberName, CalledPgmID, DDNameU)
			      SELECT  jpds.DataSetName, jj.JobName, jj.membername, jref.MemberName AS dsMemberName, js.CalledPgmID, UPPER(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 UPPER(jref.MemberName) = UPPER(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, DDNameU); 
               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 UPPER(pa.AliasName) = UPPER(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 UPPER(jref.MemberName) = UPPER(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, UPPER(px.ProgramName) AS ProgramNameOrigU, 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 (UPPER(f.Name) = j.DDNameU
															       OR 
																   --UPPER(f.Name) LIKE '%' || '-' || j.DDNameU															   
																     (LOCATE_IN_STRING(UPPER(f.Name), '-'|| j.DDNameU, -1) > 0  -- check existence
                                                                      AND 
                                                                      LOCATE_IN_STRING(UPPER(f.Name), '-'|| j.DDNameU, -1) = LENGTH(f.Name) + 1 -1 - LENGTH(j.DDNameU) -- last position in string
                                                                     )
																   )    
								                                       
								          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,
																   UPPER(prax.AliasName) AS AliasNameU,
																   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.ProgramNameOrigU = x.AliasNameU 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 UPPER(idu.MemberName) = UPPER(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 ss	
 




