LANGUAGE SQL
sp:BEGIN   

-- clean-up temporary tables / session tables
	BEGIN
		DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
		BEGIN END;
		
		COMMIT;
		DROP TABLE SESSION.sr;
		DROP TABLE SESSION.s;
		DROP TABLE SESSION.t;
		
		DROP INDEX SESSION.sr_unq_idx;
		DROP INDEX SESSION.s_cidx1;
		DROP INDEX SESSION.t_cidx1; 
	END;

    
       -- declare temp tables
       DECLARE GLOBAL TEMPORARY TABLE SESSION.sr
       (
       OccurID INTEGER ,
       ResourceID INTEGER
        )  ON COMMIT PRESERVE ROWS 
		   NOT LOGGED;
		   
       CREATE UNIQUE INDEX sr_unq_idx ON SESSION.sr (OccurID ASC, ResourceID ASC);


       DECLARE GLOBAL TEMPORARY TABLE SESSION.s
       (
        OccurID INTEGER,
		StatementStartRow INTEGER ,
		StatementStartColumn INTEGER ,
		StatementEndRow INTEGER ,
		StatementEndColumn INTEGER ,
		--StmtPathStr VARCHAR(250) ,
		StmtPathID INTEGER ,
		Description VARCHAR(50) ,
		ProgramID INTEGER ,
		ProgramName VARCHAR(256) ,
		ProgramTypeID INTEGER ,
		--ProgramPath VARCHAR(250) ,
		ProgramPathID INTEGER ,
		ProgStartRow INTEGER ,
		ProgStartCol INTEGER ,
		ProgEndRow INTEGER ,
		ProgEndCol INTEGER ,
		Ancestor VARCHAR(256) ,
		AncestorID INTEGER ,
		AncestorTypeID INTEGER 
        )  ON COMMIT PRESERVE ROWS 
		   NOT LOGGED;

        CREATE INDEX s_cidx1 ON SESSION.s (OccurID ASC) CLUSTER;
        

       DECLARE GLOBAL TEMPORARY TABLE SESSION.t
       (
        SqlFieldID INTEGER ,
		FieldName VARCHAR(50) ,
		SqlTableID INTEGER ,
		TableName VARCHAR(50) ,
		--PathStr VARCHAR(250) ,
		PathID INTEGER ,
		StartRow INTEGER ,
		StartCol INTEGER ,
		EndRow INTEGER ,
		EndCol INTEGER 
        )  ON COMMIT PRESERVE ROWS 
		   NOT LOGGED;

      CREATE INDEX t_cidx1 ON SESSION.t (SqlFieldID ASC) CLUSTER;


         -- fill in temp tables
         INSERT INTO SESSION.sr
          /*                        
		SELECT OccurID, ResourceID
		 FROM  StatementReference 
		 WHERE ResourceType = 187
		 GROUP BY OccurID, ResourceID
		 */
		 SELECT OccurID, ResourceID
         FROM( 
                 SELECT OccurID, ResourceID
                        ,ROW_NUMBER() OVER(PARTITION BY OccurID, ResourceID ORDER BY OccurID) AS RN
				 FROM  StatementReference 
				 WHERE ResourceType = 187
		      )src WHERE RN = 1 -- distinct :(
		 ;
         COMMIT;


          INSERT INTO SESSION.s
		  SELECT 
		       os.OccurID,
			   os.StartRow AS StatementStartRow,
			   os.StartCol AS StatementStartColumn,
			   os.EndRow   AS StatementEndRow,
			   os.EndCol   AS StatementEndColumn,
			   --p.PathStr   AS StmtPathStr,
			   os.PathID AS StmtPathID,
			   s.Description,
			   p1.ProgramID,
			   p1.ProgramName,
			   p1.ProgramTypeID,
			   --p2.PathStr AS ProgramPath,
			   o.PathID AS ProgramPathID,
			   o.StartRow AS ProgStartRow,
			   o.StartCol AS ProgStartCol,
			   o.EndRow AS ProgEndRow,
			   o.EndCol AS ProgEndCol,
			   p1.Ancestor,
			   p3.ProgramID AS AncestorID,
			   p3.ProgramTypeID AS AncestorTypeID
		 FROM OccurrencesStmt os
			 --INNER JOIN Paths p ON os.PathID = p.PathID
			 INNER JOIN Statements s ON os.StatementType = s.StatementType
			 INNER JOIN 
			          (
					    SELECT DISTINCT
					           tp.ProgramID,
							   tp.ProgramTypeID,
							   tpa.AliasName AS ProgramName,
							   tp.Ancestor,
							   UPPER(tp.Ancestor) AS AncestorU,
							   tp.OccurId
						FROM Programs tp
							 INNER JOIN ProgramAliases tpa ON tp.ProgramID = tpa.ProgramID AND tpa.AliasType = 0
					  ) p1 ON p1.ProgramID = os.ProgID
			 INNER JOIN Occurrences o ON o.OccurID = p1.OccurID
			 --INNER JOIN Paths p2 ON o.PathID = p2.PathID
			 LEFT OUTER JOIN 
			         (
					    SELECT DISTINCT
						       tp.ProgramID,
							   tp.ProgramTypeID,
							   UPPER(tpa.AliasName) AS ProgramNameU
							   --tp.Ancestor,
							   --tp.OccurId
						FROM Programs tp
							 INNER JOIN ProgramAliases tpa ON tp.ProgramID = tpa.ProgramID
					  ) p3 ON p3.ProgramNameU = p1.AncestorU
		  WHERE os.OccurID IN  
				   (
					  SELECT x.OccurID
					  FROM SESSION.sr x
				   ) ;
           COMMIT;
      

         INSERT INTO SESSION.t
         SELECT DISTINCT
              f.SqlFieldID,
			  f.FieldName,
			  t.SqlTableID,
			  t.TableName,
			  --p.PathStr,
			  o.PathID,
			  o.StartRow,
			  o.StartCol,
			  o.EndRow,
			  o.EndCol
		FROM SqlFields f
			INNER JOIN SqlTables t ON f.SqlTableID = t.SqlTableID
									AND t.szDataBase = '1'
			INNER JOIN Occurrences o ON o.OccurID = t.OccurID;
			--INNER JOIN Paths p ON o.PathID = p.PathID;                      
         COMMIT;


		BEGIN
		  COMMIT; 
		  TRUNCATE TABLE cacheEZViewer_Usage_SQLTableFields ;
		END;


        LOCK TABLE  cacheEZViewer_Usage_SQLTableFields IN EXCLUSIVE MODE ;-- lock table 
		INSERT INTO cacheEZViewer_Usage_SQLTableFields
	     SELECT 
						   t.SqlTableID,
						   t.TableName,
						   t.SqlFieldID,
						   t.FieldName,
						   s.Description,
						   s.StatementStartRow,
						   s.StatementStartColumn,
						   s.StatementEndRow,
						   s.StatementEndColumn,
						   p1.PathStr AS STMTPATHSTR, 
						   --s.StmtPathID,
						   s.ProgramName,
						   s.ProgramID,
						   s.ProgramTypeID,
						   p2.PathStr AS PROGRAMPATH,
						   --s.ProgramPathID,
						   s.ProgStartRow,
						   s.ProgStartCol,
						   s.ProgEndRow,
						   s.ProgEndCol,
						   s.Ancestor,
						   s.AncestorID,
						   s.AncestorTypeID,
						   p3.PathStr AS TABLEPATH,
						   --t.PathID AS TablePathID,
						   t.StartRow AS DeclareStmtStartRow,
						   t.StartCol AS DeclareStmtStartCol,
						   t.EndRow AS DeclareStmtEndRow,
						   t.EndCol AS DeclareStmtEndCol 
					 FROM SESSION.sr sr
					      INNER JOIN SESSION.t t ON sr.ResourceID = t.SqlFieldID 
					      INNER JOIN SESSION.s s ON sr.OccurID = s.OccurID
				          INNER JOIN Paths p1 ON s.StmtPathID = p1.PathID
					      INNER JOIN Paths p2 ON s.ProgramPathID = p2.PathID
					      INNER JOIN Paths p3 ON t.PathID = p3.PathID	 
				;
         COMMIT;			

END 