LANGUAGE SQL
sp:BEGIN

	-- clean up temp table if exists
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.core;
		DROP INDEX SESSION.core_IX_1;
			
	END;

    -- cobol -> 56, 1
    DECLARE GLOBAL TEMPORARY TABLE SESSION.core
         (
            ProgID INTEGER ,
			PathID INTEGER ,
			StartRow INTEGER ,
			StartCol INTEGER ,
			EndRow INTEGER ,
			EndCol INTEGER ,
			ResourceID INTEGER ,
			ResourceName VARCHAR(250) ,
			ResourcesOccurID INTEGER ,
			Description VARCHAR(50) ,
			DBIPattern VARCHAR(50)
		 ) ON COMMIT PRESERVE ROWS
		   NOT LOGGED;

    CREATE INDEX core_IX_1 ON SESSION.core (ProgID ASC) CLUSTER;


    INSERT INTO SESSION.core
    SELECT
           os.ProgID,
		   os.PathID,
		   os.StartRow,
		   os.StartCol,
		   os.EndRow,
		   os.EndCol,
		   r.ResourceID,
		   r.Name AS ResourceName,
	       r.OccurID AS ResourcesOccurID,
		   st.Description,
		   dbiacc.DBIPattern
	FROM StatementReference sr
		 INNER JOIN OccurrencesStmt os ON sr.OccurID = os.OccurID
		 INNER JOIN Resources r ON sr.ResourceID = r.ResourceID
		 INNER JOIN Statements st ON sr.StatementType = st.StatementType
		 LEFT OUTER JOIN (
		                   SELECT r1.Name AS DBIPattern, sr1.OccurID
		                   FROM StatementReference sr1
					          INNER JOIN Resources r1 ON sr1.ResourceID = r1.ResourceID
					    WHERE sr1.ResourceType = 191
		                 ) dbiacc ON os.OccurID = dbiacc.OccurID
	WHERE sr.ResourceType = 190
		  AND  os.PathID IS NOT NULL;

	COMMIT;	


	BEGIN
	      COMMIT;
          TRUNCATE TABLE cacheEZViewer_Usage_DBI ;
    END;

    LOCK TABLE  cacheEZViewer_Usage_DBI IN EXCLUSIVE MODE ;-- lock table
	INSERT INTO cacheEZViewer_Usage_DBI
	SELECT  ProgramID, ProgramName, ProgramTypeID, Ancestor,
	        pth2.PathStr AS ProgramPath, ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol,
		    Description,
		    pth1.PathStr AS StmtPathStr,
		    StatementStartRow, StatementStartColumn, StatementEndRow, StatementEndColumn,
		    ResourceID, ResourceName, OccurID, DBIPattern
	FROM (
			  SELECT DISTINCT
				    prog.ProgramID,
				    prog.ProgramName,
				    prog.ProgramTypeID,
				    prog.Ancestor,
				    prog.PathID AS ProgramPathID,
				    prog.StartRow AS ProgStartRow,
				    prog.StartCol AS ProgStartCol,
				    prog.EndRow AS ProgEndRow,
				    prog.EndCol AS ProgEndCol,
				    core.Description,
				    core.PathID AS StmtPathID,
				    core.StartRow AS StatementStartRow,
				    core.StartCol AS StatementStartColumn,
				    core.EndRow AS StatementEndRow,
				    core.EndCol AS StatementEndColumn,
				    core.ResourceID,
				    core.ResourceName,
				    core.ResourcesOccurID AS OccurID,
				    core.DBIPattern
			  FROM  SESSION.core core
				    INNER JOIN ( -- programs
							    SELECT p.ProgramID, p.ProgramName, p.ProgramTypeID, p.Ancestor,
									   occ.StartRow, occ.StartCol, occ.EndRow, occ.EndCol
									   ,occ.PathID
								  FROM (
											 SELECT pg.ProgramID,
													pg.Ancestor,
													pg.ProgramTypeID,
													pg.OccurID,
													pa.AliasName AS ProgramName
											 FROM Programs pg
												   INNER JOIN ProgramAliases pa ON pg.ProgramID = pa.ProgramId AND pa.AliasType = 0
											 WHERE pg.ProgramTypeID = 1
											       AND EXISTS (SELECT 1 FROM SESSION.core c WHERE pg.ProgramID = c.ProgID)
										)  p
										INNER JOIN Occurrences occ ON p.OccurID = occ.OccurID
								  WHERE occ.PathID IS NOT NULL
							) prog ON core.ProgID = prog.ProgramID
			  )c
			   LEFT OUTER JOIN  Paths pth1 ON pth1.PathID = c.StmtPathID
			   LEFT OUTER JOIN  Paths pth2 ON pth2.PathID = c.ProgramPathID;	
			   COMMIT;	

END