DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN



          BEGIN


               DECLARE GLOBAL TEMPORARY TABLE SESSION.programWithAlias
			(
                 ProgramID     INTEGER,
				 ProgramName   VARCHAR(256),
				 ProgramTypeID INTEGER,
				 OccurID       INTEGER,
				 AncestorID    INTEGER,
				 Ancestor      VARCHAR(256)
			) WITH REPLACE 
              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     x.ProgramName = pgm.ProgramName
													                            AND x.Ancestor = pgm.Ancestor
													                            AND x.PathStr = 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     x.ProgramName = pgm.ProgramName
													                            AND x.Ancestor = pgm.Ancestor
													                            AND x.PathStr = pth.PathStr
													                  )
							                   												
										   ))
						 )src
					     ORDER BY src.k,
						          src.i,
					              src.l,
					              src.m,
					              src.n;

				         OPEN crs;
				
                END;
        END;
END	
