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.programWithAlias;
			
		END;


          BEGIN


               DECLARE GLOBAL TEMPORARY TABLE SESSION.programWithAlias
			( 
                 ProgramID     INTEGER,
				 ProgramName   VARCHAR(256),
				 ProgramTypeID INTEGER,
				 OccurID       INTEGER,
				 AncestorID    INTEGER,
				 Ancestor      VARCHAR(256)
			) ON COMMIT PRESERVE ROWS NOT LOGGED ;

             INSERT INTO SESSION.programWithAlias (ProgramID, ProgramName, ProgramTypeID, OccurID, AncestorID, Ancestor)
             SELECT t.ProgramID, t.ProgramName, t.ProgramTypeID, t.OccurID, t.AncestorID, t.AncestorName
	        FROM TABLE( 
			            fGetProgram_Ancestor_Aliases( CAST(NULL AS INTEGER) ) 
			         )t
			;


               BEGIN
					     DECLARE crs CURSOR WITH RETURN FOR
						 SELECT *
						 FROM (
								 SELECT  pgm.ProgramName AS k,
							             Programs_1.ProgramName AS l,
							             sr.StartRow AS m,
							             Programs_1.ProgramTypeID AS n,
										 pgm.ProgramID AS i
							     FROM SESSION.programWithAlias pgm 
							          INNER JOIN OccurrencesStmt os ON pgm.ProgramID = os.ProgID
							          INNER JOIN StatementReference sr ON os.OccurID = sr.OccurID
							          INNER JOIN SESSION.programWithAlias AS Programs_1 ON sr.ResourceID = Programs_1.ProgramID
							          INNER JOIN Occurrences occ ON occ.OccurID = pgm.OccurID
							          INNER JOIN Paths pth ON occ.PathID = pth.PathID
							     WHERE sr.ResourceType = 5
							          AND Programs_1.OccurID = 0
							          AND pgm.OccurID <> 0
							          AND pgm.ProgramID IN (SELECT * FROM SESSION.numeric_param_temp)
							          AND (pgm.Ancestor IS NULL OR pgm.Ancestor = '')
							          AND (Programs_1.ProgramTypeID <> -1
							               OR (Programs_1.ProgramTypeid = -1
							                   AND sr.StartRow NOT IN
													                  (
													                      SELECT DISTINCT x.StartRow
													                      FROM SESSION.CALLING_TEMP x
													                      WHERE     UPPER(x.ProgramName) = UPPER(pgm.ProgramName)
													                            AND UPPER(x.Ancestor) = UPPER(pgm.Ancestor)
													                            AND UPPER(x.PathStr) = UPPER(pth.PathStr)
													                  )
										   ))
							    
							     UNION
							
							     SELECT pgm.Ancestor AS k,
							            Programs_1.ProgramName AS l,
							            sr.StartRow AS m,
							            Programs_1.ProgramTypeID AS n,
										pgm.AncestorID AS i
							     FROM SESSION.programWithAlias pgm
							          INNER JOIN OccurrencesStmt os ON pgm.ProgramID = os.ProgID
							          INNER JOIN StatementReference sr ON os.OccurID = sr.OccurID
							          INNER JOIN SESSION.programWithAlias AS Programs_1 ON sr.ResourceID = Programs_1.ProgramID
							          INNER JOIN Occurrences occ ON occ.OccurID = pgm.OccurID
							          INNER JOIN Paths pth ON occ.PathID = pth.PathID
							     WHERE sr.ResourceType = 5
							          AND Programs_1.OccurID = 0
							          AND pgm.OccurID <> 0	
                                      AND pgm.Ancestor IS NOT NULL
							          AND pgm.Ancestor <> ''
							          AND pgm.ProgramTypeID IN (15, 16)									  
                                      AND pgm.ProgramID IN
													              (
													                  SELECT p1.Programid
													                  FROM Programs  p1
													                       INNER JOIN Programs  p2 ON  p1.ancestor = p2.programname
													                                                       AND p2.programid IN (SELECT * FROM SESSION.numeric_param_temp)
													                  
													              )							          
							          AND (Programs_1.ProgramTypeID <> -1
							               OR (Programs_1.ProgramTypeid = -1
							                   AND sr.StartRow NOT IN
							                                         (
													                      SELECT DISTINCT x.StartRow
													                      FROM SESSION.CALLING_TEMP x
													                      WHERE     UPPER(x.ProgramName) = UPPER(pgm.ProgramName)
													                            AND UPPER(x.Ancestor) = UPPER(pgm.Ancestor)
													                            AND UPPER(x.PathStr) = UPPER(pth.PathStr)
													                  )
							                   												                 
										   ))
						 )src
					     ORDER BY src.k,
						          src.i,
					              src.l,
					              src.m,
					              src.n;

				         OPEN crs;
				
                END;
        END;
END ss	




