(
IN p_MaxLevels INTEGER
)
CALLED ON NULL INPUT
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.AAutoDiscovered;
			
			DROP INDEX SESSION.ncidx1 ; 
            DROP INDEX SESSION.ncidx2 ;
		END;



        BEGIN
            DECLARE v_MaxLevels INTEGER;
            DECLARE v_Level, rcount INTEGER DEFAULT 1;

            DECLARE GLOBAL TEMPORARY TABLE SESSION.AAutoDiscovered
			( 
			  src INTEGER,
              tgt INTEGER,
              ord INTEGER
			) ON COMMIT PRESERVE ROWS NOT LOGGED ;


           SET v_MaxLevels = (SELECT (CASE WHEN p_MaxLevels > 1000 THEN 1000 ELSE p_MaxLevels END) FROM SYSIBM.SYSDUMMY1);
           SET v_MaxLevels = COALESCE(v_MaxLevels, 100);


           INSERT INTO SESSION.AAutoDiscovered (src, tgt, ord)
           SELECT CAST(NULL AS INTEGER) AS src, ProgramID AS tgt, 0 AS ord
	       FROM SESSION.numeric_param_temp;


           CREATE INDEX ncidx1 ON SESSION.AAutoDiscovered (src ASC, tgt ASC);
           CREATE INDEX ncidx2 ON SESSION.AAutoDiscovered (src ASC, ord ASC);



           WHILE  (rcount > 0 AND v_MaxLevels >= v_Level) DO
		       BEGIN 

			               SET v_Level = v_Level + 1;
			
			               INSERT INTO SESSION.AAutoDiscovered (src, tgt, ord)
			               SELECT  e.PreceedingNetworkID,
								   e.NetworkID,
								   MIN(d.ord) + 1
							FROM SESSION.AAutoDiscovered d
								INNER JOIN AAUTONetworkDependencies e ON d.tgt = e.PreceedingNetworkID
							WHERE NOT EXISTS
												(
												    SELECT 1
												    FROM SESSION.AAutoDiscovered  dd
												    WHERE e.PreceedingNetworkID = dd.src
														AND e.NetworkID = dd.tgt
												  )
							GROUP BY e.PreceedingNetworkID,
								      e.NetworkID;
			
			                GET DIAGNOSTICS rcount = ROW_COUNT;

                            COMMIT;
                END;
               
           END WHILE;     




	            BEGIN
					    DECLARE crs CURSOR WITH RETURN FOR
					    SELECT * 
					    FROM SESSION.AAutoDiscovered 
					    ORDER BY ord, src, tgt;

				        OPEN crs;
				
                END;
                
        END;        

END ss	



