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


     -- clean up temp table if exists 
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.Discovered ;	
        DROP INDEX SESSION.ncidx12 ;
        DROP INDEX SESSION.ncidx13 ;	
	END;

    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
						)
            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 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 