LANGUAGE SQL
sp:BEGIN   

             
			-- clean-up temporary tables / session tables
     			BEGIN
					DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
					BEGIN END;
					
					COMMIT;
					DROP TABLE SESSION.idmsx_v;
					DROP TABLE SESSION.deelem; 
					DROP TABLE SESSION.s1;
					DROP TABLE SESSION.s2;
					DROP TABLE SESSION.s3;
				END;



			-- declare temp tables
          
	          DECLARE GLOBAL TEMPORARY TABLE session.idmsx_v 
		               (
			             ElementNameU VARGRAPHIC(512)
		                ) 
		                CCSID UNICODE
		                ON COMMIT PRESERVE ROWS
						   NOT LOGGED;
	              
	              
	          DECLARE GLOBAL TEMPORARY TABLE session.deelem 
		               (
			             Id INTEGER ,
						 Name VARGRAPHIC(400) ,
						 NameU VARGRAPHIC(400),
						 DdsTypeId INTEGER ,
						 SourceInfo INTEGER 
		                ) 
		                CCSID UNICODE
		                ON COMMIT PRESERVE ROWS
						   NOT LOGGED;    

	           DECLARE GLOBAL TEMPORARY TABLE session.s1 
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(512) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						usedInElementTypeID INTEGER ,
						usedInDescription VARGRAPHIC(1024) ,
						usedInElementName VARGRAPHIC(400) ,
						ElemId INTEGER ,
						ElemStartRow INTEGER ,
						ElemStartCol INTEGER ,
						ElemEndRow INTEGER ,
						ElemEndCol INTEGER ,
						inProperty VARGRAPHIC(256) ,
						withAlias VARGRAPHIC(512) ,
						ddclfilePath VARCHAR(250) ,
						IsIDMSX INTEGER ,
						PropertyStartRow INTEGER ,
						PropertyEndRow INTEGER ,
						PropertyStartCol INTEGER ,
						PropertyEndCol INTEGER 
				       )
				       CCSID UNICODE 
				       ON COMMIT PRESERVE ROWS
					   NOT LOGGED;
  
               DECLARE GLOBAL TEMPORARY TABLE session.s2
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(400) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						ProgramTypeID INTEGER ,
						ProgramName VARCHAR(50) ,
						ProgramId INTEGER ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						StatementTypeName VARCHAR(50) ,
						ProgramPath VARCHAR(250) ,
						StatementStartRow INTEGER ,
						StatementEndRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndColumn INTEGER 
						) 
						CCSID UNICODE
						ON COMMIT PRESERVE ROWS
						NOT LOGGED;
  
  
			  DECLARE GLOBAL TEMPORARY TABLE session.s3
						(
						usedTypeID INTEGER ,
						usedTypeDescription VARGRAPHIC(1024) ,
						usedName VARGRAPHIC(400) ,
						usedID INTEGER ,
						usedStartRow INTEGER ,
						usedEndRow INTEGER ,
						usedStartCol INTEGER ,
						usedEndCol INTEGER ,
						usedSourceFile VARCHAR(250) ,
						usedIsIDMSX INTEGER ,
						ProgramTypeID INTEGER ,
						ProgramName VARCHAR(50) ,
						ProgramId INTEGER ,
						ProgStartRow INTEGER ,
						ProgStartCol INTEGER ,
						ProgEndRow INTEGER ,
						ProgEndCol INTEGER ,
						StatementTypeName VARCHAR(50) ,
						ProgramPath VARCHAR(250) ,
						StatementStartRow INTEGER ,
						StatementEndRow INTEGER ,
						StatementStartColumn INTEGER ,
						StatementEndColumn INTEGER
						) 
						CCSID UNICODE
						ON COMMIT PRESERVE ROWS
						NOT LOGGED;
  
   
 
                         -- fill in temp tables

                      INSERT INTO session.idmsx_v(ElementNameU)
                      SELECT DISTINCT UPPER(ElementName)
                      FROM EZViewer_IDMSX_View ;
                      COMMIT;



					 INSERT INTO SESSION.deelem (ID, Name, NameU, ddstypeid, SourceInfo)
					 SELECT ID, Name, UPPER(Name), ddstypeid, SourceInfo 
					 FROM DDCLElement;
					 COMMIT;

                     CREATE INDEX deelem_ncidx1 ON SESSION.deelem (ddstypeid, NameU);


						INSERT INTO session.s1
						SELECT     rt.id AS usedTypeID,
						           rt.Description AS usedTypeDescription,
						           v.referencename AS usedName,
						           u.Id AS usedID,
						           us.StartRow AS usedStartRow,
						           us.EndRow AS usedEndRow,
						           us.StartCol AS usedStartCol,
						           us.EndCol AS usedEndCol,
						           pth2.PathStr AS usedSourceFile,
						           CASE
						               WHEN (IDMSX_View_For_Used.ElementNameU IS NOT NULL)
						               THEN 1
						               ELSE 0
						           END AS usedIsIDMSX,
						           et.Id AS usedInElementTypeID,
						           et.Description AS usedInDescription,
						           e.name AS usedInElementName,
						           e.Id AS ElemId,
						           es.StartRow AS ElemStartRow,
						           es.StartCol AS ElemStartCol,
						           es.EndRow AS ElemEndRow,
						           es.EndCol AS ElemEndCol,
						           p.name AS inProperty,
						           v.referencealias AS withAlias,
						           pth.PathStr AS ddclfilePath,
						           CASE
						               WHEN (IDMSX_View.ElementNameU IS NOT NULL)
						               THEN 1
						               ELSE 0
						           END AS IsIDMSX,
						           si.startrow AS PropertyStartRow,
						           si.EndRow AS PropertyEndRow,
						           si.StartCol AS PropertyStartCol,
						           si.EndCol AS PropertyEndCol
						    FROM DDCLValue AS v
						         INNER JOIN SESSION.deelem AS e ON e.id = v.elementid
						         INNER JOIN DDCLSourceInfo AS es ON es.Id = e.SourceInfo
						         INNER JOIN DDCLDdsType AS et ON et.id = e.ddstypeid
						         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View ON e.DdsTypeId IN (3, 10)
											                            AND e.NameU = IDMSX_View.ElementNameU
						         INNER JOIN DDCLProperty AS p ON p.id = v.propertyid
						         INNER JOIN DDCLDdsType AS rt ON rt.id = v.ReferenceDdsTypeId
						         LEFT OUTER JOIN SESSION.deelem AS u ON u.DdsTypeId = rt.Id
						                                       AND u.NameU = UPPER(v.ReferenceName)
						         LEFT OUTER JOIN DDCLSourceInfo AS us ON us.Id = u.SourceInfo 
								 LEFT OUTER JOIN Programs prg2 ON prg2.ProgramID = us.ProgramId
						         LEFT OUTER JOIN Occurrences occ2 ON occ2.ProgID = prg2.programid
						         LEFT OUTER JOIN Paths pth2 ON pth2.PathID = occ2.PathID
						         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON u.DdsTypeId IN (3, 10)
						                                                             AND u.NameU = IDMSX_View_For_Used.ElementNameU
						         INNER JOIN DDCLSourceInfo AS si ON si.id = v.sourceinfo
						         INNER JOIN Programs AS prg ON prg.programid = si.programid
						         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
						         LEFT OUTER JOIN Paths AS pth ON pth.pathid = occ.pathid
						    WHERE v.valuetypeid IN (2, 4);
                            COMMIT;



							INSERT INTO session.s2
							SELECT dt.Id AS usedTypeID,
							           dt.Description AS usedTypeDescription,
							           de.Name AS usedName,
							           de.Id AS usedID,
							           di.StartRow AS usedStartRow,
							           di.EndRow AS usedEndRow,
							           di.StartCol AS usedStartCol,
							           di.EndCol AS usedEndCol,
							           ddclpth.PathStr AS usedSourceFile,
							           CASE
							               WHEN(IDMSX_View_For_Used.ElementNameU IS NOT NULL)
							               THEN 1
							               ELSE 0
							           END AS usedIsIDMSX,
							           prg2.ProgramTypeID AS ProgramTypeID,
							           prg2.ProgramName AS ProgramName,
							           prg2.ProgramID AS ProgramId,
							           prgOcc.StartRow AS ProgStartRow,
							           prgOcc.StartCol AS ProgStartCol,
							           prgOcc.EndRow AS ProgEndRow,
							           prgOcc.EndCol AS ProgEndCol,
							           s.Description AS StatementTypeName,
							           PrgFilePath.PathStr AS ProgramPath,
							           os.StartRow AS StatementStartRow,
							           os.EndRow AS StatementEndRow,
							           os.StartCol AS StatementStartColumn,
							           os.EndCol AS StatementEndColumn
							    FROM OccurrencesStmt os
							         INNER JOIN StatementReference sr ON os.OccurID = sr.OccurID
							         INNER JOIN (
												SELECT r.ResourceID, r.OccurID,
													  UPPER(SUBSTR(r.Name, LOCATE_IN_STRING(r.Name, '-') + 1, LENGTH(r.Name))) AS DDCLElement_NameU,
													  UPPER(SUBSTR(r.Name, 1, CASE WHEN LOCATE_IN_STRING(r.Name, '-')> 0 THEN LOCATE_IN_STRING(r.Name, '-') - 1 ELSE 0 END  )) AS DDCLDdsType_NameU
												FROM Resources r
												WHERE r.ResourceType = 13
								                ) r ON sr.ResourceID =r.ResourceID                 
							         INNER JOIN Statements s ON sr.StatementType = s.StatementType
							         INNER JOIN Occurrences occ2 ON r.OccurID = occ2.OccurID
							         INNER JOIN Paths pth ON occ2.PathID = pth.PathID
							         INNER JOIN 
												(   
													 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
												  )  prg2 ON os.ProgID = prg2.ProgramID
							         INNER JOIN Paths AS PrgFilePath ON os.PathID = PrgFilePath.PathID
							         INNER JOIN Occurrences AS prgOcc ON prgOcc.OccurID = prg2.OccurID
							         INNER JOIN SESSION.deelem de ON de.NameU = r.DDCLElement_NameU
							         INNER JOIN DDCLDdsType dt ON UPPER(dt.Name) = r.DDCLDdsType_NameU
							         INNER JOIN DDCLSourceInfo di ON di.Id = de.SourceInfo
							         INNER JOIN Programs AS prg ON prg.programid = di.programid
							         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
							         LEFT OUTER JOIN Paths AS ddclpth ON ddclpth.pathid = occ.pathid
							         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON  de.DdsTypeId IN (3, 10) AND de.NameU = IDMSX_View_For_Used.ElementNameU
								WHERE sr.StatementType = 44
							           AND UPPER(pth.PathStr) LIKE '%DDCL INCLUDES%' ;
                                COMMIT;






									INSERT INTO session.s3
									SELECT dt.Id AS usedTypeID,
									           dt.Description AS usedTypeDescription,
									           de.Name AS usedName,
									           de.Id AS usedID,
									           di.StartRow AS usedStartRow,
									           di.EndRow AS usedEndRow,
									           di.StartCol AS usedStartCol,
									           di.EndCol AS usedEndCol,
									           ddclpth.PathStr AS usedSourceFile,
									           CASE
									               WHEN(IDMSX_View_For_Used.ElementNameU IS NOT NULL)
									               THEN 1
									               ELSE 0
									           END AS usedIsIDMSX,
									           prg2.ProgramTypeID AS ProgramTypeID,
									           prg2.ProgramName AS ProgramName,
									           prg2.ProgramID AS ProgramId,
									           prgOcc.StartRow AS ProgStartRow,
									           prgOcc.StartCol AS ProgStartCol,
									           prgOcc.EndRow AS ProgEndRow,
									           prgOcc.EndCol AS ProgEndCol,
									           s.Description AS StatementTypeName,
									           PrgFilePath.PathStr AS ProgramPath,
									           os.StartRow AS StatementStartRow,
									           os.EndRow AS StatementEndRow,
									           os.StartCol AS StatementStartColumn,
									           os.EndCol AS StatementEndColumn
									    FROM SESSION.deelem de
									         INNER JOIN 
												   (
													    SELECT 78 AS ResourceType1, 10 AS ResourceType2, ID AS SetOrRecordID, UPPER(SetName) AS SetOrRecordNameU
													    FROM IdmsSubschemaSets
													    UNION
													    SELECT 77 AS ResourceType1, 3 AS ResourceType2, ID AS SetOrRecordID, UPPER(RecordName) AS SetOrRecordNameU
													    FROM IdmsSubschemaRecords
												    ) SetOrRecord  ON de.ddstypeid = SetOrRecord.ResourceType2
												                      AND de.NameU = SetOrRecord.SetOrRecordNameU                  
									         INNER JOIN StatementReference sr ON SetOrRecord.SetOrRecordID = sr.ResourceID
										                                         AND  SetOrRecord.ResourceType1 =  sr.ResourceType
									         INNER JOIN Statements s ON sr.StatementType = s.StatementType
									         INNER JOIN OccurrencesStmt os ON os.OccurID = sr.OccurID
									         INNER JOIN 
														(   
															 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
														  )prg2 ON prg2.ProgramID = os.ProgID
									         INNER JOIN Paths AS PrgFilePath ON os.PathID = PrgFilePath.PathID
									         INNER JOIN Occurrences AS prgOcc ON prgOcc.OccurID = prg2.OccurID
									         INNER JOIN DDCLDdsType dt  ON dt.Id = de.DdsTypeId
									         INNER JOIN DDCLSourceInfo di ON di.Id = de.SourceInfo
									         INNER JOIN Programs AS prg ON prg.programid = di.programid
									         LEFT OUTER JOIN Occurrences AS occ ON occ.progid = prg.programid
									         LEFT OUTER JOIN Paths AS ddclpth ON ddclpth.pathid = occ.pathid
									         LEFT OUTER JOIN session.idmsx_v AS IDMSX_View_For_Used ON de.NameU = IDMSX_View_For_Used.ElementNameU
									    WHERE (
									           (de.ddstypeid = 3 AND sr.ResourceType = 77)
											    OR
											    (de.ddstypeid = 10 AND sr.ResourceType = 78)
											   );
                                        COMMIT;




            BEGIN
			      COMMIT; 
	              TRUNCATE TABLE cacheEZViewer_Usage_DDCL_Dictionary ;
	        END;


            -- fill in cache table
            LOCK TABLE  cacheEZViewer_Usage_DDCL_Dictionary IN EXCLUSIVE MODE ;-- lock table
			INSERT INTO cacheEZViewer_Usage_DDCL_Dictionary
			SELECT usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol, 
			       usedSourceFile, usedIsIDMSX, usedInElementTypeID, usedInDescription, usedInElementName, 
				  ElemId, ElemStartRow, ElemStartCol, ElemEndRow, ElemEndCol, inProperty, withAlias, ddclfilePath, IsIDMSX, 
				  PropertyStartRow, PropertyEndRow, PropertyStartCol, PropertyEndCol, ProgramTypeID, ProgramName, ProgramId, 
				  ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath, 
				  StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn 
			FROM(	 
			       SELECT 	
			            usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol, 
						usedSourceFile, usedIsIDMSX, 
						usedInElementTypeID, usedInDescription, usedInElementName, 
						ElemId, ElemStartRow, ElemStartCol, ElemEndRow, 
						ElemEndCol, inProperty, withAlias, ddclfilePath, 
						IsIDMSX, PropertyStartRow, PropertyEndRow, 
						PropertyStartCol, PropertyEndCol, 
						CAST(NULL AS INTEGER) AS ProgramTypeID, 
						CAST(NULL AS VARCHAR(250)) ProgramName, 
						CAST(NULL AS INTEGER) AS ProgramId, 
						CAST(NULL AS INTEGER) AS ProgStartRow,
						CAST(NULL AS INTEGER) AS ProgStartCol, 
						CAST(NULL AS INTEGER) AS ProgEndRow, 
						CAST(NULL AS INTEGER) AS ProgEndCol, 
						CAST(NULL AS VARCHAR(50)) AS StatementTypeName,
						CAST(NULL AS VARCHAR(250)) AS ProgramPath, 
						CAST(NULL AS INTEGER) AS StatementStartRow, 
						CAST(NULL AS INTEGER) AS StatementEndRow, 
						CAST(NULL AS INTEGER) AS StatementStartColumn,  
						CAST(NULL AS INTEGER) AS StatementEndColumn  
				  FROM session.s1
			
				  UNION
				  SELECT  usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol, 
					      usedSourceFile, usedIsIDMSX, 
					      CAST(NULL AS INTEGER) AS usedInElementTypeID, 
					      CAST(NULL AS VARGRAPHIC(1024)) AS  usedInDescription, 
					      CAST(NULL AS VARGRAPHIC(400)) AS usedInElementName,
			              CAST(NULL AS INTEGER) AS ElemId, 
			              CAST(NULL AS INTEGER) AS ElemStartRow, 
			              CAST(NULL AS INTEGER) AS ElemStartCol, 
			              CAST(NULL AS INTEGER) AS ElemEndRow,
			              CAST(NULL AS INTEGER) AS ElemEndCol, 
			              CAST(NULL AS VARGRAPHIC(256)) AS inProperty, 
			              CAST(NULL AS VARGRAPHIC(512)) AS withAlias, 
			              CAST(NULL AS VARGRAPHIC(250)) AS ddclfilePath,
			              CAST(NULL AS INTEGER) AS IsIDMSX, 
			              CAST(NULL AS INTEGER) AS PropertyStartRow, 
			              CAST(NULL AS INTEGER) AS PropertyEndRow,
			              CAST(NULL AS INTEGER) AS PropertyStartCol, 
			              CAST(NULL AS INTEGER) AS PropertyEndCol,
					    ProgramTypeID, ProgramName, ProgramId,
					    ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath, 
					    StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn  
				  FROM session.s2
				  
				  UNION
				  SELECT  usedTypeID, usedTypeDescription, usedName, usedID, usedStartRow, usedEndRow, usedStartCol, usedEndCol, 
					      usedSourceFile, usedIsIDMSX, 
					      CAST(NULL AS INTEGER) AS usedInElementTypeID, 
					      CAST(NULL AS VARGRAPHIC(1024)) AS  usedInDescription, 
					      CAST(NULL AS VARGRAPHIC(400)) AS usedInElementName,
			              CAST(NULL AS INTEGER) AS ElemId, 
			              CAST(NULL AS INTEGER) AS ElemStartRow, 
			              CAST(NULL AS INTEGER) AS ElemStartCol, 
			              CAST(NULL AS INTEGER) AS ElemEndRow,
			              CAST(NULL AS INTEGER) AS ElemEndCol, 
			              CAST(NULL AS VARGRAPHIC(256)) AS inProperty, 
			              CAST(NULL AS VARGRAPHIC(512)) AS withAlias, 
			              CAST(NULL AS VARGRAPHIC(250)) AS ddclfilePath,
			              CAST(NULL AS INTEGER) AS IsIDMSX, 
			              CAST(NULL AS INTEGER) AS PropertyStartRow, 
			              CAST(NULL AS INTEGER) AS PropertyEndRow,
			              CAST(NULL AS INTEGER) AS PropertyStartCol, 
			              CAST(NULL AS INTEGER) AS PropertyEndCol,     
					    ProgramTypeID, ProgramName, ProgramId,
					    ProgStartRow, ProgStartCol, ProgEndRow, ProgEndCol, StatementTypeName, ProgramPath, 
					    StatementStartRow, StatementEndRow, StatementStartColumn, StatementEndColumn 
				  FROM session.s3
				  ) s; 
				  COMMIT;


END