DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN

	            BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
								 WITH sgm (phSgId, phSgName, phSgDbId, SgId, SgName, SgDbId, Lvl)
								       AS (
								              SELECT s.SegmentID AS phSgId,
								                     s.SegmentName AS phSgName,
								                     s.DBId AS phSgDbId,
								                     s.SegmentID AS SgId,
								                     s.SegmentName AS SgName,
								                     s.DBId AS SgDbId,
								                     0 AS Lvl
								              FROM IMSDBSegments s
								              WHERE  s.SegmentId IN (SELECT * FROM SESSION.numeric_param_temp)
										
								              UNION ALL
											
								              SELECT p.phSgId,
								                     p.phSgName,
								                     p.phSgDbId,
								                     l.SegmentID AS SgId,
								                     l.SegmentName AS SgName,
								                     l.DBId AS SgDbId,
								                     p.Lvl + 1 AS Lvl
								              FROM IMSDBSegments l
								                   INNER JOIN sgm p ON p.phSgId = l.SourceSegId
								              WHERE p.Lvl < 1 -- we can change the level of imbrication
								              )
									  --SELECT * FROM sgm
								
								
								              SELECT s.phDBId,
								                     s.phDBName,
								                     s.phSgID,
								                     s.phSgName,
								                     s.lDbId,
								                     s.lDBName,
								                     s.lSgId,
								                     s.lSgName,
								                     s.StatementTypeDescription,
								                     s.ProgramName,
								                     COUNT(s.OccurID) AS Occ,
													 ProgramID,
													 PathStr
								              FROM
								              (
								                  SELECT inp.phSgDbId AS phDBId,
								                         db1.DBName AS phDBName,
								                         inp.phSgID,
								                         inp.phSgName,
								                         CASE
								                             WHEN(inp.SgDbId = inp.phSgDbId)
								                             THEN NULL
								                             ELSE inp.SgDbId
								                         END AS lDbId,
								                         CASE
								                             WHEN(inp.SgDbId = inp.phSgDbId)
								                             THEN NULL
								                             ELSE db2.DBName
								                         END AS lDBName,
								                         CASE
								                             WHEN(inp.SgId = inp.phSgId)
								                             THEN NULL
								                             ELSE inp.SgId
								                         END AS lSgId,
								                         CASE
								                             WHEN(inp.SgId = inp.phSgId)
								                             THEN NULL
								                             ELSE inp.SgName
								                         END AS lSgName,
								                         st.Description AS StatementTypeDescription,
								                         pa.AliasName AS ProgramName,
								                         os.OccurID,
														 pa.ProgramID,
                                                         pth.PathStr														
								                  FROM
								                  ( -- remove duplicates if exists
								
								                      SELECT s.phSgId,
								                             s.phSgName,
								                             s.phSgDbId,
								                             s.SgId,
								                             s.SgName,
								                             s.SgDbId
								                      FROM sgm s
								                      GROUP BY s.phSgId,
								                               s.phSgName,
								                               s.phSgDbId,
								                               s.SgId,
								                               s.SgName,
								                               s.SgDbId
								                  ) inp
								                  INNER JOIN IMSDBInfo db1 ON db1.DBId = inp.phSgDbId
								                  INNER JOIN IMSDBInfo db2 ON db2.DBId = inp.SgDbId
								                  INNER JOIN StatementReference AS sr ON sr.ResourceType = 209
								                                                             AND sr.ResourceID = inp.SgId
								                  INNER JOIN Statements st ON sr.StatementType = st.StatementType
								                  INNER JOIN OccurrencesStmt AS os ON os.OccurID = sr.OccurID
												  INNER JOIN ProgramAliases pa ON pa.ProgramID = os.ProgID and pa.AliasType = 0
												  INNER JOIN Programs prg ON prg.ProgramID = pa.ProgramId
												  LEFT OUTER JOIN
													 (
														SELECT  1 AS Flag, pgx.ProgramName AS ProgramName, pgx.ProgramTypeID
														 FROM Programs pgx
														 GROUP BY pgx.ProgramName, pgx.ProgramTypeID
														 HAVING COUNT(*) > 1
													 ) x ON prg.ProgramName = x.ProgramName AND prg.ProgramTypeID = x.ProgramTypeID
												  LEFT OUTER JOIN Occurrences occ ON prg.OccurID = occ.OccurID
							                      LEFT OUTER JOIN Paths pth ON pth.PathID = occ.PathID AND x.Flag = 1
												
								              ) s
								              GROUP BY s.phDBId,
								                       s.phDBName,
								                       s.phSgID,
								                       s.phSgName,
								                       s.lDbId,
								                       s.lDBName,
								                       s.lSgId,
								                       s.lSgName,
								                       s.StatementTypeDescription,
								                       s.ProgramName,
								                       s.ProgramID,
													   s.PathStr
								              ORDER BY s.phDBName,
											           s.phDBId,
								                       s.phSgName,
													   s.phSgID,
													   s.ProgramName,
													   s.ProgramID,
													   s.PathStr,
								                       s.StatementTypeDescription,
								                       s.lDBName,
													   s.lDbId,
								                       s.lSgName,
													   s.lSgId
													   ;

								 OPEN crs;
				
                END;
END 
