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 Programs_1.ProgramName AS l,
								        pgm.ProgramName AS k,
							             sr.StartRow AS m,
							             Programs_1.ProgramTypeID AS n
							     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 NULL OR pgm.Ancestor = '' OR pgm.ProgramTypeID = 19)
							          AND pgm.ProgramID IN (SELECT * FROM SESSION.numeric_param_temp)
						              AND ((Programs_1.ProgramTypeID = 19
							          AND UPPER(Programs_1.ProgramName) NOT IN (SELECT UPPER(Param) FROM SESSION.missing_string_param_temp)
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICLSTDSW.%'
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICL9%'
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICLCTM.%')
							     OR (Programs_1.ProgramTypeID NOT IN (-1, 13, 19))
							     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)
										                  )
							        ))
							     AND UPPER(Programs_1.ProgramName) NOT IN
														         (
														             SELECT UPPER(ProgramName)
														             FROM EZViewer_DDCL_Callable_View
														         )

							    
							     UNION
							 
							     SELECT Programs_1.ProgramName AS l,
							            pgm.Ancestor AS k,
							            sr.StartRow AS m,
							            Programs_1.ProgramTypeID AS n
							     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  UPPER(p1.ancestor) = UPPER(p2.programname)
													                                                       AND p2.programid IN (SELECT * FROM SESSION.numeric_param_temp)
													                  
													              )

							          AND ((Programs_1.ProgramTypeID = 19
							          AND UPPER(Programs_1.ProgramName) NOT IN (SELECT UPPER(Param) FROM SESSION.missing_string_param_temp)
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICLSTDSW.%'
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICL9%'
							          AND UPPER(Programs_1.ProgramName) NOT LIKE 'ICLCTM.%')
							     OR (Programs_1.ProgramTypeID NOT IN (-1, 13, 19))
							     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)
										                  )
							        ))
							     AND UPPER(Programs_1.ProgramName) NOT IN
														         (
														             SELECT UPPER(ProgramName)
														             FROM EZViewer_DDCL_Callable_View
														         )

						 )src
					     ORDER BY src.n,
					              src.l,
					              src.k,
					              src.m;

				         OPEN crs;
				
                END;

        END;
                
END ss	



