(
IN p_ViewName VARCHAR(8000),
IN p_SchemaName VARCHAR(30),
IN p_Timeout INTEGER,
OUT p_Result INTEGER
)
DYNAMIC RESULT SETS 0
LANGUAGE SQL
ss: BEGIN 
          
            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 = UPPER(v_Prefix || v_ViewName);
            SET v_LockResource = v_ObjName;
             -- check if exists an stored procedure with the name 
            SELECT UPPER(NAME) INTO v_ProcName FROM SYSIBM.SYSROUTINES WHERE ROUTINETYPE = 'P' AND SPECIFICNAME = v_ViewName AND SCHEMA = v_SchemaName;

			SELECT  pjver, avatar, vversion INTO v_Cachever, v_CacheAvatar, v_CacheViewVer
			FROM EZViewerCacheTable 
			WHERE UPPER(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 UPPER(Name) = COALESCE(v_ProcName, v_ViewName));



            -- prepare dynamic queries  
             IF (EXISTS( 
				              
				              
				                SELECT 1
								FROM SYSIBM.SYSTABLES 
								WHERE TYPE = 'T' 
								      AND UPPER(NAME) = v_ObjName
								      AND UPPER(CREATOR) =  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 UPPER(v_Avatar) != UPPER(v_CacheAvatar) 
			     OR UPPER(v_Cachever) != UPPER(v_Pjver) 
			     OR UPPER(v_CacheViewVer) <> UPPER(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 -> only for views
		                IF(v_dynSQL2 != '' AND v_ProcName IS NULL)
		                THEN  
				               
				               PREPARE v_stmt2 FROM v_dynSQL2;
				               EXECUTE v_stmt2;
		                       --GET DIAGNOSTICS v_Result = DB2_RETURN_STATUS;
		                END IF;
	
		
		                -- insert data into cache table -> only for procedures since it is not possible on zOS to execute a dynamic call for procedures
		                IF(v_dynSQL2 != '' AND v_ProcName IS NOT NULL)
		                THEN  
				               
				              CASE v_ProcName
							       -- be aware that all cache sp have to be added here in UPERCASE
									 WHEN 'EZVIEWER_USAGE_ADABAS' THEN CALL EZVIEWER_USAGE_ADABAS ();
									 WHEN 'EZVIEWER_USAGE_DAL' THEN CALL EZVIEWER_USAGE_DAL ();
									 WHEN 'EZVIEWER_USAGE_DATACOM' THEN CALL EZVIEWER_USAGE_DATACOM ();
									 WHEN 'EZVIEWER_USAGE_DBI' THEN CALL EZVIEWER_USAGE_DBI ();
									 WHEN 'EZVIEWER_USAGE_DDCL' THEN CALL EZVIEWER_USAGE_DDCL ();
									 WHEN 'EZVIEWER_USAGE_DDCL_DICTIONARY' THEN CALL EZVIEWER_USAGE_DDCL_DICTIONARY ();
									 WHEN 'EZVIEWER_USAGE_DSINJOB' THEN CALL EZVIEWER_USAGE_DSINJOB ();
									 WHEN 'EZVIEWER_USAGE_DSINPRG' THEN CALL EZVIEWER_USAGE_DSINPRG ();
									 WHEN 'EZVIEWER_USAGE_FILEINPRG' THEN CALL EZVIEWER_USAGE_FILEINPRG ();
									 WHEN 'EZVIEWER_USAGE_FILESINDDCL' THEN CALL EZVIEWER_USAGE_FILESINDDCL ();
									 WHEN 'EZVIEWER_USAGE_IDMS' THEN CALL EZVIEWER_USAGE_IDMS ();
									 WHEN 'EZVIEWER_USAGE_IDMSX' THEN CALL EZVIEWER_USAGE_IDMSX ();
									 WHEN 'EZVIEWER_USAGE_IMSDB_LOGICAL' THEN CALL EZVIEWER_USAGE_IMSDB_LOGICAL ();
									 WHEN 'EZVIEWER_USAGE_IMSDB_PHYSICAL' THEN CALL EZVIEWER_USAGE_IMSDB_PHYSICAL ();
									 WHEN 'EZVIEWER_USAGE_IMSDB_STRUCTURE' THEN CALL EZVIEWER_USAGE_IMSDB_STRUCTURE ();
									 WHEN 'EZVIEWER_USAGE_INCLUDES' THEN CALL EZVIEWER_USAGE_INCLUDES ();
									 WHEN 'EZVIEWER_USAGE_JOBDS' THEN CALL EZVIEWER_USAGE_JOBDS ();
									 WHEN 'EZVIEWER_USAGE_MQ' THEN CALL EZVIEWER_USAGE_MQ ();
									 WHEN 'EZVIEWER_USAGE_OPENTP' THEN CALL EZVIEWER_USAGE_OPENTP ();
									 WHEN 'EZVIEWER_USAGE_PGMINJOB' THEN CALL EZVIEWER_USAGE_PGMINJOB ();
									 WHEN 'EZVIEWER_USAGE_PROCINJOB' THEN CALL EZVIEWER_USAGE_PROCINJOB ();
									 WHEN 'EZVIEWER_USAGE_SQLTABLEFIELDS' THEN CALL EZVIEWER_USAGE_SQLTABLEFIELDS ();
									 WHEN 'EZVIEWER_USAGE_SQLTABLES' THEN CALL EZVIEWER_USAGE_SQLTABLES ();
									 WHEN 'EZVIEWER_USAGE_TPMSX' THEN CALL EZVIEWER_USAGE_TPMSX ();
		                      END CASE;		              
 
		                END IF;
	

                        DELETE FROM EZViewerCacheTable WHERE UPPER(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 ss 