(
	IN p_Project_UUID VARCHAR(255),  
	IN p_VarName VARCHAR(250),
	IN p_DefinitionObject_UUID VARCHAR(32), 
	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(LTRIM(RTRIM(p_Project_UUID)), '!');  
      

       --1. CLEAN UP TEMP/SESSION TABLE IF EXISTS
	  BEGIN 
					DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
					BEGIN END;
					
					COMMIT;
					DROP TABLE SESSION.prg62;    
	  END;
	  

      --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(LTRIM(RTRIM(v_Project_UUID_real)), '?');  
                     
				    IF (UPPER(v_Project_UUID) != UPPER(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_RC INTEGER DEFAULT 0;
						  DECLARE v_DefinitionObject_UUID VARCHAR(32);  
		                  DECLARE v_VarName VARCHAR(250); 
		                  DECLARE v_ResourceID, v_ResourceTypeID INTEGER DEFAULT 0;
						  DECLARE v_ResourceTypeID_Prog INTEGER DEFAULT NULL;
		                  
			 
 		                  DECLARE GLOBAL TEMPORARY TABLE SESSION.prg62
					       (
					         -- CopyID INTEGER 
                             --,CopyTypeID INTEGER
                             --,CopyName VARCHAR(250), 
					          CopyHash   VARCHAR(32)
							 ,ResourceID     INTEGER
							 ,ResourceTypeID INTEGER
							 ,ResourcePathID INTEGER 
							 ,StartRow    INTEGER 
							 ,EndRow      INTEGER
							 ,StartCol    INTEGER 
							 ,EndCol      INTEGER 
							 ,RN          INTEGER
							 ) 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       = UPPER(COALESCE(LTRIM(RTRIM(p_VarName)), ''));
							  SET v_DefinitionObject_UUID  = UPPER(COALESCE(LTRIM(RTRIM(p_DefinitionObject_UUID)), ''));
					
                              SET v_ResourceTypeID_Prog = (SELECT ResourceID FROM ResourceTypes WHERE UPPER(Name) = 'PROGRAM' FETCH FIRST 1 ROWS ONLY) ;

                            -- DETERMINE definition resource
			                   SELECT ResourceID, ResourceTypeID INTO v_ResourceID, v_ResourceTypeID FROM BRD_ResourceDetails WHERE ResourceHash LIKE v_DefinitionObject_UUID ;
			                   SET    v_ResourceID     = COALESCE(v_ResourceID, 0) ;
							   SET    v_ResourceTypeID = COALESCE(v_ResourceTypeID, 0) ;

                            -- CHECK IF THE Definition Resource is okay
								BEGIN
							                    
										DECLARE bad_resource CONDITION FOR SQLSTATE '80011';
										DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
					                   
									    IF (v_ResourceID = 0) -- this could be deactivated 
									      THEN
								                             SIGNAL bad_resource
								                             SET MESSAGE_TEXT = 'BRD - Bad Definition Object.!!!';
								                             
								                             RETURN ;	              
								          END IF ;	
										           
								 END;
								 
								 
                              
                                IF NOT EXISTS(
				                                SELECT 1
												FROM BRD_Variables v 
												WHERE v.VarName  = v_VarName
														AND  (CASE WHEN v_ResourceTypeID = 0                      THEN v_ResourceID
																   WHEN v_ResourceTypeID = v_ResourceTypeID_Prog  THEN v.ProgID
																   ELSE v.CopyID
															   END ) = v_ResourceID 
								                        AND  (CASE WHEN v_ResourceTypeID = 0                      THEN v_ResourceTypeID
																   WHEN v_ResourceTypeID = v_ResourceTypeID_Prog  THEN v_ResourceTypeID
																   ELSE v.CopyTypeID
															   END ) = v_ResourceTypeID
											   ) THEN
														BEGIN
												                    
															DECLARE bad_variable CONDITION FOR SQLSTATE '80012';
															DECLARE EXIT HANDLER FOR SQLEXCEPTION RESIGNAL;  
										                   
														   
							                                SIGNAL bad_variable
							                                SET MESSAGE_TEXT = 'BRD - Variable does not belong to the definition object.!!!';
							                             
							                                 RETURN ;	              
													          
													      END;
								 END IF ;		   







							   
						    --3.2 Get necessary data
							  INSERT INTO SESSION.prg62 ( --CopyID ,CopyTypeID ,CopyName , 
								                            CopyHash ,ResourceID ,ResourceTypeID ,ResourcePathID ,StartRow  ,EndRow
							                                ,StartCol  ,EndCol  
							                                ,RN)
							   SELECT 
								       -- r1.ResourceID AS CopyID, r1.ResourceTypeID AS CopyTypeID, r1.ResourceName AS CopyName, 
									    r1.ResourceHash AS CopyHash 
								       ,c.ResourceID 
									   ,c.ResourceTypeID  
									   ,c.ResourcePathID 
									   ,c.StartRow	
									   ,c.EndRow	
									   ,c.StartCol 
									   ,c.EndCol
									   ,DENSE_RANK() OVER(ORDER BY CASE WHEN c.ResourceTypeID = 5 THEN 0 ELSE 1 END DESC, c.ResourceID, c.ResourcePathID, c.StartRow) AS RN
								FROM BRD_ResourceDetails r1
								     INNER JOIN BRD_CopyToResources c  ON r1.ResourceID = c.CopyID and r1.ResourceTypeID = c.CopyTypeID
								WHERE r1.ResourceHash LIKE v_DefinitionObject_UUID ;
  									  
								GET DIAGNOSTICS v_RC = ROW_COUNT; 
								COMMIT;   


		--4. Main OUTPUT 
				             BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
					             SELECT    --src.CopyHash AS DefinitionObjectHash
									       --,r.ResourceID ,r.ResourceTypeID 
									       --,
									       r.ResourceHash
										   ,r.ResourceName
										   ,CASE WHEN r.ResourceTypeID = 5 THEN 0 ELSE 1 END AS ResourceType
									       --,src.ResourcePathID 
										   ,pth.PathStr AS ResourcePathStr
										   ,src.StartRow ,src.EndRow 
										   ,src.StartCol ,src.EndCol
										   ,src.RN
										   ,v_RC AS NR
								 FROM
									    (
											 SELECT DISTINCT 
											        CopyHash
											       ,ResourceID ,ResourceTypeID  
											       ,ResourcePathID  
												   ,StartRow, EndRow
												   ,StartCol, EndCol
												   ,RN
											 FROM SESSION.prg62
											 WHERE RN BETWEEN  v_StartPosition AND (v_StartPosition + v_NumberOfRows - 1)  
										 ) src
										  INNER JOIN BRD_ResourceDetails r ON  src.ResourceID = r.ResourceID and src.ResourceTypeID = r.ResourceTypeID
										  INNER JOIN BRD_Paths pth ON src.ResourcePathID = pth.PathID 
								 ORDER BY src.RN
								 OPTIMIZE FOR 500 ROWS;

								 OPEN crs;
				
                             END;


             END;


	  
END
