(
	IN p_Project_UUID VARCHAR(255),  
	IN p_VarName VARCHAR(250),
	IN p_StartPosition INTEGER,
	IN p_NumberOfRows INTEGER
)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN 


      DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
      DECLARE SQLCODE INTEGER DEFAULT 0;  
      DECLARE v_Project_UUID VARCHAR(255);


      SET v_Project_UUID = COALESCE(TRIM(p_Project_UUID), '!');  
      

      --2. CHECK IF THE PROJECT IS OK
	  BEGIN
                    DECLARE v_Project_UUID_real VARCHAR(255);
                    
					DECLARE bad_project CONDITION FOR SQLSTATE '80009';
					DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
                   
                    SELECT ProjectGUID INTO v_Project_UUID_real
	                FROM  BRD_Status 
			        WHERE BRDID = (SELECT MAX(BRDID) FROM BRD_Status WHERE BRDProcessStatusTypeID = 2) -- last BRD succssfull
			        WITH UR ;	

                    SET v_Project_UUID_real = COALESCE(TRIM(v_Project_UUID_real), '?');  
                     
				    IF (v_Project_UUID != v_Project_UUID_real) 
				      THEN
			                             SIGNAL bad_project
			                             SET MESSAGE_TEXT = 'BRD - wrong project!!!';
			                             
			                             RETURN ;	
			                           
			          END IF ;	
			           
	   END;
	   


       --3. MAIN DATA STREAM
       BEGIN

						  --3.0. DECLARATION AREA
					      DECLARE v_StartPosition, v_NumberOfRows, v_RC INTEGER;
						  DECLARE v_VarName VARCHAR(250);  
						  DECLARE v_ResourceTypeID_Prog INTEGER DEFAULT NULL;
		
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varf5
										(
										    VarID INTEGER
										)  WITH REPLACE 
                                           ON COMMIT PRESERVE ROWS
										   NOT LOGGED; 
										   
					     --CREATE UNIQUE INDEX UNQIDX_varf5_VarID ON SESSION.varf5 (VarID);				   
		         
					      DECLARE GLOBAL TEMPORARY TABLE SESSION.varres5
							       (  
							            ProgramName VARCHAR(250) 
							          , ProgID INTEGER
							          , PathID INTEGER 
							          , StatementTypeID INTEGER
							          , StatementCategory CHAR(1)
							          , StartRow INTEGER 
							          , EndRow INTEGER 
							          , StartCol INTEGER  
							          , EndCol INTEGER 
							          , OccurID INTEGER
							          , StatementMark VARCHAR(50)
							          , VarID INTEGER 
							          , OrigVarID INTEGER  
									  , RN INTEGER
									 ) WITH REPLACE 
                                       ON COMMIT PRESERVE ROWS
									   NOT LOGGED;  
			 
 		
			     

						    --3.1. SET FINAL VALUES FOR WORK VARIABLES
							SET v_StartPosition =  COALESCE(NULLIF(p_StartPosition, -1), 1);
							SET v_NumberOfRows  =  COALESCE(NULLIF(p_NumberOfRows,  -1), 2147480000); 
						
							SET v_VarName    = COALESCE(TRIM(p_VarName), '');
					
			                SET v_ResourceTypeID_Prog = (SELECT ResourceID FROM ResourceTypes WHERE Name = 'PROGRAM' FETCH FIRST 1 ROWS ONLY) ;
			


	                         --3.2. DETERMINE Variable based on filters
							    INSERT INTO SESSION.varf5(VarID)
							    SELECT v.VarID
							    FROM BRD_Variables v
							    WHERE v.VarName  = v_VarName
							          AND EXISTS (SELECT 1 FROM SESSION.BRDVariableHashInput hi WHERE v.VariableHash = hi.VarHash);
	                            COMMIT;

							   


                                 --3.3. DETERMINE STATEMENTS for VARIABLES
						         INSERT INTO SESSION.varres5
						                (ProgramName, ProgID, PathID, StatementTypeID, StatementCategory, StartRow, EndRow, StartCol, EndCol, OccurID, StatementMark, VarID, OrigVarID, RN)
						         SELECT   rd.ResourceName AS ProgramName, src1.ProgID, src1.PathID, src1.StatementTypeID, src1.StatementCategory, src1.StartRow, src1.EndRow, src1.StartCol, src1.EndCol, src1.OccurID
								         ,COALESCE(bc.CategoryShortAlias, '') AS StatementMark, src1.VarID, src1.OrigVarID
								         ,ROW_NUMBER() OVER(ORDER BY rd.ResourceName, src1.ProgID, src1.PathID, src1.StatementTypeID, src1.StatementCategory, src1.StartRow, src1.EndRow, src1.StartCol, src1.EndCol, src1.StatementMark, src1.OccurID, src1.VarID, src1.OrigVarID ) AS RN 
											FROM (
															SELECT DISTINCT  
															      'D' AS StatementCategory
																   ,ds.VarID
																   ,ds.VarID AS OrigVarID
																   ,ds.StatementTypeID
																   ,ds.ProgID
																   ,ds.PathID
																   ,ds.StartRow
																   ,ds.EndRow
																   ,ds.StartCol
																   ,ds.EndCol
																   ,ds.OccurID
																   ,CASE
																	    WHEN ds.IsCalculation = 1 THEN 1
																		WHEN ds.IsCondition = 1 THEN 2	
																		WHEN ds.IsDBIO  = 1 THEN 3	
																		WHEN ds.IsFileIO = 1 THEN 4
																		WHEN ds.IsMQ = 1 THEN 5	
																		WHEN ds.IsScreen = 1 THEN 6
																		WHEN ds.IsAssignment = 1 THEN 7
																		ELSE CAST(NULL AS INTEGER)
																	END AS StatementMark
															 FROM BRD_DirectStatements ds
																 WHERE EXISTS (SELECT 1 FROM SESSION.varf5 v WHERE ds.VarID = v.VarID)
											 
															 UNION
						
															 SELECT DISTINCT
															       'I' AS StatementCategory
																   ,vh.ChildVarID AS VarID
																   ,ds.VarID AS OrigVarID
																   ,ds.StatementTypeID
																   ,ds.ProgID
																   ,ds.PathID
																   ,ds.StartRow
																   ,ds.EndRow
																   ,ds.StartCol
																   ,ds.EndCol
																   ,ds.OccurID
																   ,CASE
																		WHEN ds.IsFileIO = 1 THEN 4
																		WHEN ds.IsMQ = 1 THEN 5	
																		WHEN ds.IsScreen = 1 THEN 6
																		WHEN ds.Is88VarLvlCondition = 1 THEN 2
																		ELSE NULL
																	  END AS StatementMark
															  FROM BRD_DirectStatements ds
															       INNER JOIN BRD_VariableHierarchy vh ON ds.VarID = vh.VarID
									                                WHERE EXISTS (SELECT 1 FROM SESSION.varf5 v WHERE vh.ChildVarID = v.VarID)
															        AND  ds.IsFileIO + ds.IsMQ + ds.IsScreen + ds.Is88VarLvlCondition > 0 
															  )src1
															      INNER JOIN BRD_ResourceDetails rd ON rd.ResourceID = src1.ProgID  AND rd.ResourceTypeID = v_ResourceTypeID_Prog
															      LEFT OUTER JOIN BRD_Category bc ON bc.CategoryID = src1.StatementMark AND bc.IsActive = 1 ;
															  
						                              GET DIAGNOSTICS v_RC = ROW_COUNT; 
						                              COMMIT; 	


				             --5.OUTPUT 
				             BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
						         SELECT    /* v_Project_UUID AS Project_UUID,*/
						                   src.ProgramName
						                   ,src.ProgID AS ProgramID
									       ,pth.PathStr
									       ,src.OccurID
										   ,st.Description
										   ,src.StatementCategory
										   ,src.StartRow   
										   ,src.EndRow
										   ,src.StartCol  
										   ,src.EndCol
										   ,v.VarName AS VarName
										   ,v.VariableHash AS Variable_UUID
										   --,CASE WHEN v.RootVarID > 0 THEN 'TRUE' ELSE 'FALSE' END AS IsRecord
										   --,src.VarID
										   --,src.OrigVarID
										   ,src.StatementMark
										   ,src.RN
										   ,v_RC AS NR 
								  FROM (
											 SELECT ProgramName, ProgID, PathID, StatementTypeID,  StatementCategory,  StartRow, EndRow, StartCol, EndCol, StatementMark, OccurID, /*VarID,*/ OrigVarID, RN
											 FROM SESSION.varres5
											 WHERE RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1) 
										 )src
										      INNER JOIN BRD_Variables v ON v.VarID = src.OrigVarID -- src.VarID
											  INNER JOIN Statements st ON st.StatementType = src.StatementTypeID
											  INNER JOIN BRD_Paths pth ON pth.PathID = src.PathID
		 						   ORDER BY src.RN
		 						   OPTIMIZE FOR 500 ROWS;
								 

								 OPEN crs;
				
                             END;


             END;


	  
END 
