(
IN p_MaxLevels INTEGER
)
DYNAMIC RESULT SETS 1
CALLED ON NULL INPUT
LANGUAGE SQL
 BEGIN


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

            DECLARE GLOBAL TEMPORARY TABLE SESSION.AAutoDiscovered
			(
			  src INTEGER,
              tgt INTEGER,
              ord INTEGER
			) WITH REPLACE 
			     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 ProgramID AS src, CAST(NULL AS INTEGER) 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.src = e.NetworkID
							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	
