(
    IN p_Project_UUID VARCHAR(255),
	IN p_VarName VARCHAR(250), 
	IN p_RecordName VARCHAR(250),  
	IN p_ProgName VARCHAR(250), 
	IN p_CopyName 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);
      DECLARE v_dynSQL1, v_dynSQL2, v_dynSQL3, v_dynSQL4, v_dynSQL5, v_dynSQL6, v_dynSQL7 VARCHAR(8000) DEFAULT '';
      DECLARE v_stmt1, v_stmt4, v_stmt5, v_stmt6, v_stmt7 STATEMENT;
      
      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 INTEGER;
			      DECLARE v_TotalVarNumber, v_OnlyCopyFlag, v_RC, v_RC1, v_RC2 INTEGER DEFAULT 0;
				  DECLARE v_VarName, v_RecordName, v_ProgName, v_CopyName VARCHAR(250);  
			      DECLARE v_Cat1, v_Cat2, v_Cat3, v_Cat4, v_Cat5, v_Cat6, v_Cat7, v_Cat8 FLOAT DEFAULT 0.0;
                  DECLARE v_CurrentSchema, v_CurrentObject  VARCHAR(200) DEFAULT ''; 
			 
			 
			 
			      DECLARE weight_value_issue CONDITION FOR SQLSTATE '80010';
				  DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
			 			 
			     
			      DECLARE GLOBAL TEMPORARY TABLE SESSION.categ4
								(
								    Flag INTEGER,
									A1 FLOAT,
									A2 FLOAT,
									A3 FLOAT,
									A4 FLOAT,
									A5 FLOAT,
									A6 FLOAT,
									A7 FLOAT,
									A8 FLOAT
								)  WITH REPLACE 
                                   ON COMMIT PRESERVE ROWS
								   NOT LOGGED;  

			      DECLARE GLOBAL TEMPORARY TABLE SESSION.varres4
					       (
					          VarName VARCHAR(250) 
							 ,NrCalc INTEGER
							 ,NrCond INTEGER
							 ,NrDB INTEGER
							 ,NrFile INTEGER
							 ,NrMQ INTEGER
							 ,NrScreen INTEGER
							 --,NrProg INTEGER
							 --,NrVar INTEGER
							 --,Total INTEGER
							 --,Total_W INTEGER
							 ,RN INTEGER
							 ) WITH REPLACE 
                               ON COMMIT PRESERVE ROWS
							   NOT LOGGED;
							   
							   
					 DECLARE GLOBAL TEMPORARY TABLE SESSION.varprog4
					       (
					          VarName VARCHAR(250) 
							 ,NrVar INTEGER
							 ,NrProg 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), 3000); 
					
					SET v_VarName    = COALESCE(NULLIF(TRIM(p_VarName), '')   , '%');
					SET v_RecordName = COALESCE(NULLIF(TRIM(p_RecordName), ''), '%');
					SET v_ProgName   = COALESCE(NULLIF(TRIM(p_ProgName), '')  , '%');
					SET v_CopyName   = COALESCE(NULLIF(TRIM(p_CopyName), '')  , '%');
					-- Be aware about !!!!!  if p_CopyName = '*' then we have to return all variables DefinedInCopy    (API will transform '*' -> %)
	                SET v_OnlyCopyFlag   =  CASE WHEN TRIM(p_CopyName) LIKE '\%' ESCAPE'\' THEN 1
	                                             ELSE 0
                                            END;

			        SELECT CURRENT_SCHEMA INTO v_CurrentSchema FROM SYSIBM.SYSDUMMY1;		
			
			
                     -- 3.2 Final weights for BRD Categories
                     INSERT INTO SESSION.categ4
		                    (Flag, A1, A2, A3, A4, A5, A6, A7, A8)
					 SELECT  Flag 
					       ,COALESCE(MAX(A1), 1) AS A1, COALESCE(MAX(A2), 1) AS A2, COALESCE(MAX(A3), 1) AS A3, COALESCE(MAX(A4), 1) AS A4
					       ,COALESCE(MAX(A5), 1) AS A5, COALESCE(MAX(A6), 1) AS A6, COALESCE(MAX(A7), 1) AS A7, COALESCE(MAX(A8), 1) AS A8
					 FROM (     
								SELECT 1 AS Flag, 
								       bwc.CategoryID,
								       bwc.CategoryAlias,
								       CASE bwc.CategoryID WHEN 1 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A1,
								       CASE bwc.CategoryID WHEN 2 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A2,
								       CASE bwc.CategoryID WHEN 3 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A3,
								       CASE bwc.CategoryID WHEN 4 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A4,
								       CASE bwc.CategoryID WHEN 5 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A5,
								       CASE bwc.CategoryID WHEN 6 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A6,     
								       CASE bwc.CategoryID WHEN 7 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A7,
								       CASE bwc.CategoryID WHEN 8 THEN COALESCE(bcinput.CategoryWeight, bwc.CategoryInitValue) ELSE 0 END AS A8
								 FROM 
								     ( SELECT  CategoryID, TRIM(CategoryLongAlias) AS CategoryAlias, CategoryInitValue
								       FROM  BRD_Category 
								       WHERE IsActive = 1
								       )bwc
								      LEFT OUTER JOIN 
								                     ( SELECT TRIM(CategoryAlias) AS CategoryAlias, CategoryWeight
								                       FROM SESSION.BRDCategoryInput  
								                      )bcinput ON bwc.CategoryAlias = bcinput.CategoryAlias   
							)src
					  GROUP BY Flag;
                      GET DIAGNOSTICS v_RC = ROW_COUNT; 							
	                  COMMIT;  
	                        

                       IF(v_RC != 1)
                       THEN
                         
                                         SIGNAL weight_value_issue
			                             SET MESSAGE_TEXT = 'Lack of weight values - issue!!!';
			                             
			                             RETURN ;	
			                           
                        END IF; 

                         SELECT  A1, A2, A3, A4, A5, A6, A7, A8 
                         INTO v_Cat1, v_Cat2, v_Cat3, v_Cat4, v_Cat5, v_Cat6, v_Cat7, v_Cat8
                         FROM SESSION.categ4;  
                         
                         
                         

			            --4. Create script slices 
				        -- 4.1  create script for - get info-1 related to variables according to filters

                        SET v_dynSQL2 = '';
						SET v_dynSQL2 = ' ' 
						                 || v_CurrentSchema || '.BRD_Variables WHERE 1 = 1 '
						      		     || CASE  WHEN v_VarName NOT LIKE '\%' ESCAPE'\'    THEN ' AND VarName LIKE ''' ||  v_VarName || ''''  
									              ELSE ' '
										    END	
										 || CASE  v_OnlyCopyFlag 
									              WHEN 1 THEN ' AND CopyName IS NOT NULL '
						                          ELSE ' ' 
						                    END    
									     || CASE  WHEN v_CopyName NOT LIKE '\%' ESCAPE'\'   THEN ' AND CopyName LIKE '''  ||  v_CopyName || ''''  
									              ELSE ' '
										    END 
									     || CASE  WHEN v_ProgName NOT LIKE '\%' ESCAPE'\'    THEN ' AND ProgName LIKE '''  ||  v_ProgName || ''''  
									              ELSE ' '
										    END 
										 || CASE  WHEN v_RecordName NOT LIKE '\%' ESCAPE'\' THEN ' AND RecordName LIKE ''' ||  v_RecordName || ''''  
									              ELSE ' '
										    END   
										    ;
					
									
						--4.3. create script for VARIABLE USAGE STATISTICS
					     SET v_dynSQL3 = '';
					     SET v_dynSQL3 = 'SELECT v.VarName, vus.IsFromCopy, vus.DNrStmtCalc AS NrStmtCalc, vus.DNrStmtDB AS NrStmtDB  
					                             ,(vus.DNrStmtCond   + vus.INrStmtCond)   AS NrStmtCond
											     ,(vus.DNrStmtFile   + vus.INrStmtFile)   AS NrStmtFile 
											     ,(vus.DNrStmtMQ     + vus.INrStmtMQ)     AS NrStmtMQ
											     ,(vus.DNrStmtScreen + vus.INrStmtScreen) AS NrStmtScreen
			                               FROM ' || v_CurrentSchema || '.BRD_Variables v
						                   INNER JOIN ' || v_CurrentSchema || '.BRD_VariableUsageStatistics vus ON v.VarID = vus.VarID '
									     || CASE  WHEN v_VarName NOT LIKE '\%' ESCAPE'\' THEN ' AND v.VarName LIKE ''' ||  v_VarName || ''''  
									              ELSE ' '
										    END	
										  || CASE  v_OnlyCopyFlag 
									              WHEN 1 THEN ' AND v.CopyName IS NOT NULL '
						                          ELSE ' ' 
						                    END    
									     || CASE  WHEN v_CopyName NOT LIKE '\%' ESCAPE'\' THEN ' AND v.CopyName LIKE '''  ||  v_CopyName || ''''  
									              ELSE ' '
										    END 
									     || CASE  WHEN v_ProgName NOT LIKE '\%' ESCAPE'\' THEN ' AND v.ProgName LIKE '''  ||  v_ProgName || ''''  
									              ELSE ' '
										    END 
										 || CASE  WHEN v_RecordName NOT LIKE '\%' ESCAPE'\' THEN ' AND v.RecordName LIKE ''' ||  v_RecordName || ''''  
									              ELSE ' '
										    END    
										    ;
					     
					  		
									
						--4.4. create script to cumulate VARIABLE USAGE STATISTICS
					     SET v_dynSQL4 = '';
					     SET v_dynSQL4 = ' INSERT INTO SESSION.varres4 
										   SELECT VarName, ROUND(NrCalc, 0) AS NrCalc, ROUND(NrCond, 0) AS NrCond, ROUND(NrDB, 0) AS NrDB, ROUND(NrFile, 0) AS NrFile, ROUND(NrMQ, 0) AS NrMQ, ROUND(NrScreen, 0) AS NrScreen, 
										          /*ROUND((NrCalc + NrCond + NrDB + NrFile + NrMQ + NrScreen), 0) AS Total,
						                           ROUND((NrCalc_W + NrCond_W + NrDB_W + NrFile_W + NrMQ_W + NrScreen_W), 0) AS Total_W,*/
						                           ROW_NUMBER() OVER(ORDER BY NrCalc_W + NrCond_W + NrDB_W + NrFile_W + NrMQ_W + NrScreen_W DESC, VarName) AS RN
                                            FROM ( SELECT  s.VarName AS VarName
													   ,COALESCE(SUM( s.NrStmtCalc   ), 0 ) AS  NrCalc
													   ,COALESCE(SUM( s.NrStmtCond   ), 0 ) AS  NrCond
													   ,COALESCE(SUM( s.NrStmtDB     ), 0 ) AS  NrDB
													   ,COALESCE(SUM( s.NrStmtFile   ), 0 ) AS  NrFile
													   ,COALESCE(SUM( s.NrStmtMQ     ), 0 ) AS  NrMQ
													   ,COALESCE(SUM( s.NrStmtScreen ), 0 ) AS  NrScreen
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat1 AS VARCHAR(24)) || ' * s.NrStmtCalc ), 0 ) AS  NrCalc_W
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat2 AS VARCHAR(24)) || ' * s.NrStmtCond ), 0 ) AS  NrCond_W
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat3 AS VARCHAR(24)) || ' * s.NrStmtDB   ), 0 ) AS  NrDB_W
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat4 AS VARCHAR(24)) || ' * s.NrStmtFile ), 0 ) AS  NrFile_W
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat5 AS VARCHAR(24)) || ' * s.NrStmtMQ   ), 0 ) AS  NrMQ_W
													   ,COALESCE(SUM( ( CASE s.IsFromCopy WHEN 1 THEN ' || CAST(v_Cat8 AS VARCHAR(24)) || '  ELSE 1 END )  *  ' || CAST(v_Cat6 AS VARCHAR(24)) || ' * s.NrStmtScreen), 0 ) AS  NrScreen_W
												  FROM    ( ' || v_dynSQL3 || ' ) s	   							
												  GROUP BY s.VarName
							                  )src1 ';			
												
							
						
                          --4.5. create script for VARIABLE COUNT + Prog
					       SET v_dynSQL5 = '';
					       SET v_dynSQL5 = ' INSERT INTO SESSION.varprog4 (VarName, NrVar, NrProg)
										     SELECT v.VarName, COUNT(DISTINCT v.VarID) AS NrVar, SUM(v.DirectIndirectDistProgNr) AS NrProg              
										     FROM ( SELECT VarID, VarName, DirectIndirectDistProgNr FROM ' || v_dynSQL2 ||  ' )  v 
										          INNER JOIN SESSION.varres4 vr ON v.VarName = vr.VarName
																AND vr.RN BETWEEN ' || CAST(COALESCE(v_StartPosition, 0) AS VARCHAR(24)) || ' AND ' || CAST(COALESCE((v_StartPosition + v_NumberOfRows - 1) , 0) AS VARCHAR(24)) || ' 
											 GROUP BY v.VarName	' ; 
                          
										      
					
							

                          --4.6. create script for VARIABLE HASH OUTPUT
					       SET v_dynSQL6 = '';
					       SET v_dynSQL6 = ' INSERT INTO SESSION.BRDVariableHashOutput(VarName, VarHash) 
										      SELECT v.VarName, v.VariableHash
										      FROM ( SELECT VarName, VariableHash FROM ' || v_dynSQL2 || ' )   v
										   		     INNER JOIN SESSION.varres4 vr ON v.VarName = vr.VarName
												                  AND vr.RN BETWEEN ' || CAST(COALESCE(v_StartPosition, 0) AS VARCHAR(24)) || ' AND ' || CAST(COALESCE((v_StartPosition + v_NumberOfRows - 1) , 0) AS VARCHAR(24)) || ' ';



                         
                           --5. GET USAGE STATISTICS FOR VARIABLES  
			                IF(v_dynSQL4 != '')
			                THEN  
					                PREPARE v_stmt4 FROM v_dynSQL4;
					                EXECUTE v_stmt4;
					                GET DIAGNOSTICS v_RC1 = ROW_COUNT; 
					                SET v_RC1 = COALESCE(v_RC1, 0); 
			                END IF;
			                
			                
			            --6. GET ADDITIONAL VARNAME IF NECESSARY 
							 IF ( (v_StartPosition + v_NumberOfRows - 1) > 0
							       AND
							       v_RC1 < (v_StartPosition + v_NumberOfRows - 1))
				              THEN
							       	 SET v_dynSQL7 = '';
							         SET v_dynSQL7 = ' INSERT INTO SESSION.varres4 
													   SELECT VarName,  0 AS NrCalc, 0 AS NrCond, 0 AS NrDB, 0 AS NrFile, 0 AS NrMQ, 0 AS NrScreen, /*0 AS Total, 0 AS Total_W,*/ ' 
													          || CAST(v_RC1 AS VARCHAR(24)) || ' + ROW_NUMBER() OVER(ORDER BY VarName) AS RN
													   FROM (
															 SELECT DISTINCT VarName 
															 FROM ' || v_dynSQL2 || '
															 AND VarName NOT IN ( SELECT VarName FROM SESSION.varres4 ) 
															 ORDER BY VarName 
															 FETCH FIRST ' || CAST(ABS(COALESCE(NULLIF(((v_StartPosition + v_NumberOfRows - 1) - v_RC1), 0), 1)) AS VARCHAR(24)) || ' ROWS ONLY 															 '  
														|| ' ) src1 ' ;
									     
									       	   
                                       IF(v_dynSQL7 != '')
						               THEN  
								                PREPARE v_stmt7 FROM v_dynSQL7;
								                EXECUTE v_stmt7;
								                GET DIAGNOSTICS v_RC2 = ROW_COUNT; 
								                SET v_RC2 = COALESCE(v_RC2, 0); 				
						                END IF;
			                
				
							 END IF; 
			                
			                
			                
			                --8. Get NrVar and NrProg
			                IF(v_dynSQL5 != '')
				               THEN  
						                PREPARE v_stmt5 FROM v_dynSQL5;
						                EXECUTE v_stmt5;				
				                END IF;
			                
			                
			                --9. GET VarName and VarHash for variables directed on output
			                IF(v_dynSQL6 != '')
			                THEN  
			                
			                        DELETE FROM SESSION.BRDVariableHashOutput WHERE 1 = 1;
			                        COMMIT;
					                PREPARE v_stmt6 FROM v_dynSQL6;
					                EXECUTE v_stmt6;
	
			                END IF;
			                
			               
						   --10. Get Total Number of distinct variables
							SET v_dynSQL1 = '';
							SET v_dynSQL1 = 'SELECT COUNT(DISTINCT VarName) FROM '  || v_dynSQL2 || ' ' ;  
							
							 IF(v_dynSQL1 != '')
			                 THEN  
			                      BEGIN
				                        DECLARE crx CURSOR FOR v_stmt1; 
				                        PREPARE v_stmt1 FROM v_dynSQL1;
							            OPEN crx;
							            FETCH crx INTO v_TotalVarNumber;
							            CLOSE crx;
				                       
				                        SET v_TotalVarNumber = COALESCE(v_TotalVarNumber, 0);
                                  END;  
			                END IF;
							

				             --11.OUTPUT  
				             BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
					             --SELECT v_dynSQL3, v_dynSQL4 FROM SYSIBM.SYSDUMMY1;
					             
						         SELECT /* v_Project_UUID AS Project_UUID, */
						                s1.VarName, s1.NrCalc, s1.NrCond, s1.NrDB, s1.NrFile, s1.NrMQ, s1.NrScreen, s2.NrProg, s2.NrVar 
						                --,s1.Total, s1.Total_W
				                        ,s1.RN 
				                        ,v_TotalVarNumber /*v_RC1 + v_RC2*/ AS NR 
						         FROM
						             (
								        SELECT VarName, NrCalc, NrCond, NrDB, NrFile, NrMQ, NrScreen /*,Total ,Total_W,*/ ,RN 
								        FROM SESSION.varres4
								        WHERE RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1) 
								        )s1
								          INNER JOIN SESSION.varprog4 s2 ON s1.VarName = s2.VarName	
								 ORDER BY s1.RN
                                 OPTIMIZE FOR 500 ROWS;

								 
					
								 
								 OPEN crs;
				
                             END;
				

             END;

END 
