LANGUAGE SQL
sp:BEGIN   
                      
    -- clean-up temporary tables / SESSION tables
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.imsdbfld;

	END;


   -- declare temp table
   DECLARE GLOBAL TEMPORARY TABLE SESSION.imsdbfld
   (
		FieldId INTEGER ,
		FieldName VARCHAR(256) ,
		Seq CHAR(1),
		DBId INTEGER ,
		SegmentId INTEGER ,
		FieldStartRow INTEGER ,
		FieldStartCol INTEGER ,
		FieldEndRow INTEGER ,
		FieldEndCol INTEGER ,
		FieldPathID INTEGER 
    ) ON COMMIT PRESERVE ROWS
      NOT LOGGED
      ;

   -- fill in temp table
     INSERT INTO SESSION.imsdbfld
     SELECT 
		     i.FieldId,
		     i.FieldName,
			 i.Seq,
			 i.DBId,
			 i.SegmentId,
		     Occurrences_Field.StartRow AS FieldStartRow,
		     Occurrences_Field.StartCol AS FieldStartCol,
		     Occurrences_Field.EndRow AS FieldEndRow,
		     Occurrences_Field.EndCol AS FieldEndCol,
			 Occurrences_Field.PathID AS FieldPathID		     
		FROM  IMSDBFields i
		      LEFT OUTER JOIN Occurrences AS Occurrences_Field ON i.OccurID = Occurrences_Field.OccurID;
        COMMIT;

       BEGIN
	      COMMIT; 
          TRUNCATE TABLE cacheEZViewer_Usage_IMSDB_Structure ;
        END;
	            
        LOCK TABLE  cacheEZViewer_Usage_IMSDB_Structure IN EXCLUSIVE MODE ;-- lock table 
		INSERT INTO cacheEZViewer_Usage_IMSDB_Structure
		SELECT DBId, DBName, AccessTypeId,  IMSDBStartRow, IMSDBStartCol, IMSDBEndRow, IMSDBEndCol, pth1.PathStr AS IMSDBPath,
			   SegmentId, SegmentName, ParentId, SourceDBId, SourceSegId, SegmentStartRow, SegmentStartCol, SegmentEndRow, SegmentEndCol, pth2.PathStr AS SegPath,
		       FieldId, FieldName,  f_DBID,  f_SegmentId, FieldStartRow,  FieldStartCol,  FieldEndRow,  FieldEndCol,  pth3.PathStr AS FieldPath, FieldSeq
		FROM (
					 SELECT 
						    i.DBId,
						    i.DBName,
						    i.AccessTypeId,
						    Occurrences_IMSDB.StartRow AS IMSDBStartRow,
						    Occurrences_IMSDB.StartCol AS IMSDBStartCol,
						    Occurrences_IMSDB.EndRow AS IMSDBEndRow,
						    Occurrences_IMSDB.EndCol AS IMSDBEndCol,
						    Occurrences_IMSDB.PathID AS IMSDBPathID,
						    seg.SegmentId,
						    seg.SegmentName,
						    seg.ParentId,
						    seg.SourceDBId,
						    seg.SourceSegId,
						    Occurrences_Seg.StartRow AS SegmentStartRow,
						    Occurrences_Seg.StartCol AS SegmentStartCol,
						    Occurrences_Seg.EndRow AS SegmentEndRow,
						    Occurrences_Seg.EndCol AS SegmentEndCol,
						    Occurrences_Seg.PathID AS SegPathID,
						    COALESCE(fld1.FieldId, fld2.FieldId) AS FieldId,
						    COALESCE(fld1.FieldName, fld2.FieldName) AS FieldName,
						    COALESCE(fld1.DBId, fld2.DBId) AS f_DBID,
						    COALESCE(fld1.SegmentId, fld2.SegmentId) AS f_SegmentId,
						    COALESCE(fld1.FieldStartRow, fld2.FieldStartRow) AS FieldStartRow,
						    COALESCE(fld1.FieldStartCol, fld2.FieldStartCol) AS FieldStartCol,
						    COALESCE(fld1.FieldEndRow, fld2.FieldEndRow) AS FieldEndRow,
						    COALESCE(fld1.FieldEndCol, fld2.FieldEndCol) AS FieldEndCol,
						    COALESCE(fld1.FieldPathID, fld2.FieldPathID) AS FieldPathID,
							COALESCE(fld1.Seq, fld2.Seq) AS FieldSeq
					 FROM IMSDBInfo i
						LEFT JOIN Occurrences AS Occurrences_IMSDB ON Occurrences_IMSDB.OccurID = i.OccurID
					
						LEFT OUTER JOIN IMSDBSegments seg ON i.DBId = seg.DBId
						LEFT OUTER JOIN Occurrences AS Occurrences_Seg ON seg.OccurID = Occurrences_Seg.OccurID
		
						LEFT OUTER JOIN SESSION.imsdbfld	fld1 ON i.AccessTypeId != 13 AND i.DBId = fld1.DBId and seg.SegmentId = fld1.SegmentId
						LEFT OUTER JOIN SESSION.imsdbfld	fld2 ON i.AccessTypeId = 13 AND seg.SourceSegId = fld2.SegmentId  		     
					 WHERE  i.OccurID != 0
			   )s
			       LEFT OUTER JOIN Paths pth1 ON s.IMSDBPathID = pth1.PathID 
			       LEFT OUTER JOIN Paths pth2 ON s.SegPathID = pth2.PathID
			       LEFT OUTER JOIN Paths pth3 ON s.FieldPathID = pth3.PathID ;
	
        COMMIT;	
                            
END 