 (
        p_JobID INTEGER,
        p_SCHID INTEGER,
        p_MaxLevels INTEGER
 )
DYNAMIC RESULT SETS 1
CALLED ON NULL INPUT
LANGUAGE SQL
BEGIN


    BEGIN
       --A. Declare variable/Create temporary objects
           DECLARE v_JobID, v_SCHID, v_MaxLevels INTEGER;
           DECLARE v_StartNode INTEGER;
	       DECLARE v_Level, v_RC INTEGER DEFAULT 1;


           DECLARE GLOBAL TEMPORARY TABLE SESSION.Discovered
						(
						      src    INTEGER,
					          tgt    INTEGER,
					          ord    INTEGER,
					          ssid   INTEGER,
					          tsid   INTEGER
						)
            WITH REPLACE 
			   ON COMMIT PRESERVE ROWS
			   NOT LOGGED;




       --B. Get basic data

         SET v_JobID     = p_JobID;
         SET v_SCHID     = p_SCHID;
		 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);
         SET v_StartNode = v_JobID;



         INSERT INTO SESSION.Discovered (src, tgt, ord, tsid) VALUES (CAST(NULL AS INTEGER), v_StartNode, 0, v_SCHID);



      --C. create appropriate indexes
        CREATE INDEX ncidx12 ON SESSION.Discovered (src ASC, tgt ASC);
        CREATE INDEX ncidx13_1 ON SESSION.Discovered (tgt ASC, ord ASC, tsid ASC);


-- D. Acumulate data into final table
         WHILE  (v_RC > 0 AND v_MaxLevels > v_Level)
         DO
			     SET v_Level = v_Level + 1;

                 INSERT INTO SESSION.Discovered (src, tgt, ord, ssid,  tsid)
                 SELECT    e.TriggeredBy_JobID,
					       e.JobID,
					       MIN(d.ord) + 1,
					       CASE
					           WHEN e.inSCHID = 0
					           THEN -ABS(d.tsid)
					           ELSE e.inSCHID
					       END,
					       CASE WHEN e.outSCHID = 0 AND e.inSCHID = 0 THEN -ABS(d.tsid)
					            WHEN e.outSCHID = 0 THEN e.inSCHID
						        ELSE e.outSCHID
						   END
					FROM SESSION.Discovered d
					     INNER JOIN CA7_JobsTriggeredByJobs AS e ON d.tgt = e.TriggeredBy_JobID
					                                                    AND (ABS(d.tsid) = e.inSCHID OR e.inSCHID = 0)
					WHERE NOT EXISTS
									(
									    SELECT 1
									    FROM SESSION.Discovered AS dd
									    WHERE e.TriggeredBy_JobID = dd.src
									          AND e.JobID = dd.tgt
									)
					GROUP BY e.JobID, e.TriggeredBy_JobID,  d.tsid, e.inSCHID, e.outSCHID;

                    GET DIAGNOSTICS v_RC = ROW_COUNT;

                    COMMIT;
         END WHILE;


	
         BEGIN

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


                 OPEN crs;

          END;
	END;	

END 
