(
IN p_ViewName VARCHAR(8000),
IN p_SchemaName VARCHAR(30),
IN p_Timeout INTEGER,
OUT p_Result INTEGER
)
DYNAMIC RESULT SETS 0
LANGUAGE SQL
 BEGIN
            
            --CALL EZSCH.EZViewer_Prepare_Cache( 'EZViewer_Usage_DSInJob' ,'EZSCH', 1000, ? );
            DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
            DECLARE SQLCODE INT DEFAULT 0;
            DECLARE v_dynSQL0, v_dynSQL1, v_dynSQL2 VARCHAR(8000) DEFAULT '';
            DECLARE v_ViewName, v_ObjName, v_LockResource, v_ProcName VARCHAR(8000) DEFAULT NULL;
            DECLARE v_Timeout, v_Result INTEGER;
            DECLARE v_Prefix VARCHAR(20) DEFAULT 'CACHE'; -- this is a prefix for tables
            DECLARE v_SchemaName VARCHAR(30);
            DECLARE v_Cachever, v_Pjver, v_CacheViewVer, v_ViewVer VARCHAR(20);
            DECLARE v_Avatar, v_CacheAvatar VARCHAR(36);
            DECLARE v_stmt0, v_stmt1, v_stmt2 STATEMENT;

            SET v_SchemaName = UPPER(p_SchemaName);
            SET v_ViewName = UPPER(p_ViewName);
            SET v_Timeout = p_Timeout;
            SET v_Result = 0;
            SET v_ObjName = (v_Prefix || v_ViewName);
            SET v_LockResource = v_ObjName;
             -- check if exists an stored procedure with the name
            SELECT ROUTINENAME INTO v_ProcName FROM SYSCAT.ROUTINES WHERE ROUTINETYPE = 'P' AND ROUTINENAME = v_ViewName AND ROUTINESCHEMA = v_SchemaName;

			SELECT  pjver, avatar, vversion INTO v_Cachever, v_CacheAvatar, v_CacheViewVer
			FROM EZViewerCacheTable
			WHERE Name = v_ObjName;

            SET v_Avatar =  (SELECT Avatar FROM VC_Version );
            SET v_Pjver  =  (SELECT Version FROM VC_Container WHERE Type = 0);
            SET v_ViewVer = (SELECT Version FROM EZReportsStoredProcedures WHERE Name = COALESCE(v_ProcName, v_ViewName));



            -- prepare dynamic queries
             IF (EXISTS(
				
				
				                SELECT 1
								FROM SYSCAT.TABLES
								WHERE TYPE = 'T'
								      AND TABNAME = v_ObjName
								      AND TABSCHEMA =  v_SchemaName

				            )) THEN
								           SET v_dynSQL0 = ' LOCK TABLE '  || v_SchemaName || '.' || v_ObjName || ' IN EXCLUSIVE MODE ' ; -- lock table
								           SET v_dynSQL1 = ' DELETE FROM ' || v_SchemaName || '.' || v_ObjName || ' ' ; -- clean up table
						       END IF;
		
		


             -- prepare dynamic queries
			 IF(v_ProcName IS NULL)
							  THEN
								       SET v_dynSQL2 = 'INSERT INTO ' || v_SchemaName || '.' || v_ObjName || '  SELECT * FROM ' || v_SchemaName || '.' || v_ViewName || ' ' ;	 -- a view is used	
					          ELSE
					                   SET v_dynSQL2 = 'CALL ' || v_SchemaName || '.' || v_ProcName ||' ( ) '; -- a sp is used (for DB2 zOS don't work this approache  )
						      END IF;




			IF (    v_Cachever IS NULL
			     OR v_Avatar IS NULL
			     OR v_CacheViewVer IS NULL
			     OR v_Avatar != v_CacheAvatar
			     OR v_Cachever != v_Pjver
			     OR v_CacheViewVer <> v_ViewVer
			    )
			THEN
			
			     BEGIN
			
			
			             DECLARE EXIT HANDLER FOR SQLEXCEPTION
                         BEGIN
                              SET v_Result = -1;
                              COMMIT;  -- unlock table if it is locked
                        END;



		                -- lock table
		                IF(v_dynSQL0 != '')
		                THEN
		                
				                PREPARE v_stmt0 FROM v_dynSQL0;
				                EXECUTE v_stmt0;
		                        --GET DIAGNOSTICS v_Result = DB2_RETURN_STATUS;
		                END IF;


                        -- delete data from table
		                IF(v_dynSQL1 != '')
		                THEN
				                PREPARE v_stmt1 FROM v_dynSQL1;
				                EXECUTE v_stmt1;
		                        --GET DIAGNOSTICS v_Result = DB2_RETURN_STATUS;
		                END IF;


                       -- insert data into cache table 
		                IF(v_dynSQL2 != '')
		                THEN
				
				               PREPARE v_stmt2 FROM v_dynSQL2;
				               EXECUTE v_stmt2;
		                       --GET DIAGNOSTICS v_Result = DB2_RETURN_STATUS;
		                END IF;
	
                        DELETE FROM EZViewerCacheTable WHERE Name = v_ObjName;
			            INSERT INTO EZViewerCacheTable (name, pjver, avatar, vversion) VALUES (v_ObjName, v_Pjver, v_Avatar, v_ViewVer);
		          			
			      END;
			
			END IF;


             -- see values -- debug purpose
             BEGIN
					             DECLARE crs CURSOR WITH RETURN FOR
						         SELECT   v_Result, v_ViewName, v_ObjName, v_ProcName,
						                  v_dynSQL0 AS dynSQL0, v_dynSQL1 AS dynSQL1, v_dynSQL2 AS dynSQL2
						         FROM SYSIBM.SYSDUMMY1;
								
								 OPEN crs;
				
              END;




		COMMIT;
		
		SET p_Result = v_Result;
		
END 
