LANGUAGE SQL
BEGIN


                       -- declare temp tables
                       DECLARE GLOBAL TEMPORARY TABLE SESSION.sr
		               (
		               OccurID INTEGER ,
                       ResourceID INTEGER
		                )  WITH REPLACE 
                           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
		                )  WITH REPLACE 
                           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
		                )  WITH REPLACE 
                           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,
											   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,
											   tpa.AliasName AS ProgramName
											   --tp.Ancestor,
											   --tp.OccurId
										FROM Programs tp
											 INNER JOIN ProgramAliases tpa ON tp.ProgramID = tpa.ProgramID
									  ) p3 ON p3.ProgramName = p1.Ancestor
						  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 IMMEDIATE ;
				              --DELETE FROM 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 
