SET TERMOUT ON
SET LINESIZE 120
SET ECHO OFF
SET SHOW OFF
SET VER ON
SET FEEDBACK OFF

SPOOL nct_info.log

ACCEPT Server PROMPT 'Enter DATABASE name (default - MAGICASH): ' DEFAULT MAGICASH
ACCEPT SYSpsw PROMPT 'Enter SYS password: ' DEFAULT NCTSYS HIDE

CONNECT SYS/&SYSpsw@&Server AS SYSDBA

PROMPT *******************
PROMPT nct_info 2.6
PROMPT *******************

-- Время начала исполнения
SET HEADING OFF
PROMPT Current time:
select to_char(sysdate,'DD.MM.YYYY HH24:MI:SS') TIME from dual;
SET HEADING ON

SET SERVEROUTPUT ON 
EXEC DBMS_OUTPUT.ENABLE(20000000);

PROMPT
PROMPT

EXEC DBMS_OUTPUT.PUT_LINE('*');
EXEC DBMS_OUTPUT.PUT_LINE('*');
EXEC DBMS_OUTPUT.PUT_LINE('****************************************');
EXEC DBMS_OUTPUT.PUT_LINE('************ Overall DB Info ***********');
EXEC DBMS_OUTPUT.PUT_LINE('****************************************');
COLUMN INAME FORMAT A20 HEADING "Database Name"
COLUMN HNAME FORMAT A40 HEADING "Server Name"
COLUMN VERSION FORMAT A20 HEADING "DB Version"
COLUMN INITYPE FORMAT A15 HEADING "Init File Type"
SELECT 	UPPER(inst.INSTANCE_NAME) INAME, 
		UPPER(inst.HOST_NAME) HNAME, 
		inst.VERSION, 
		DECODE(param.value, NULL, 'PFILE', 'SPFILE') INITYPE
				FROM 	v$instance inst, 
						(select value from v_$parameter where name = 'spfile') param;
EXEC DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------');


DECLARE

CURSOR cur_tables -- Общий курсор выбирающий имя и схему таблицы из dba_tables
IS
	SELECT   table_name, owner
	FROM   dba_tables
	WHERE owner NOT LIKE '%SYS%'
	ORDER BY owner; 


var_table varchar2(45); -- Общая переменная (имя_таблицы)
var_owner varchar2(45); -- Общая переменная (схема_таблицы)
var_version varchar2(18); -- Общая переменная (версия_модуля)
var_emitent varchar2(12); -- Общая переменная (эмитент_модуля)
var_type varchar2(12); -- Общая переменная (тип_модуля)
var_type_str varchar2(12); -- Общая переменная (тип_модуля)

var_lnr_ver varchar2(18); -- Переменная для ЛНР (версия_ЛНР)
var_rep_ver varchar2(18); -- Переменная для d-reports (версия_отчетов)
var_rlnr_ver varchar2(18); -- Переменная для d-reports (версия_отчетов)
var_mcs_ver varchar2(18); -- Переменная для d-reports (версия_отчетов)
var_pcrep_ver varchar2(18); -- Переменная для d-reports (версия_отчетов)
var_coup_ver varchar2(18); -- Переменная для Coupons

var_onl_prod varchar2(18); -- Переменная для ONLINE
var_onl_ver varchar2(18); -- Переменная для ONLINE
var_onl_date date; -- Переменная для ONLINE

var_plh1 varchar2(45); -- placeholder
var_plh2 varchar2(45); -- placeholder

var_tms_ver varchar2(18); -- Переменная для TMS
var_pws_oc_ver varchar2(18); -- Переменная для PWS OC
var_pws_web_ver varchar2(18); -- Переменная для PWS WEB
var_aqua_ver varchar2(18); -- Переменная для AQUA
var_phoenix_ver varchar2(18); -- Переменная для Phoenix
var_iemoc_ver varchar2(18); -- Переменная для IEM-OC
var_online_prod varchar2(18); -- Переменная для ONLINE
var_online_loop number := 1; -- Переменная для ONLINE

BEGIN

DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('**********************************************');
DBMS_OUTPUT.PUT_LINE('***** Users/Schemas with OC and LNR(LFC) *****');
DBMS_OUTPUT.PUT_LINE('**********************************************');

OPEN cur_tables; -- Открываем курсор для ОЦ
LOOP
	FETCH cur_tables INTO var_table,var_owner;
	EXIT WHEN cur_tables%NOTFOUND;

	IF var_table = 'P5CONFIG' THEN
		BEGIN
			EXECUTE IMMEDIATE ('SELECT version,id_emitent,id_filial FROM ' || var_owner || '.P5CONFIG WHERE date_version = (SELECT MAX(date_version) FROM ' || var_owner || '.P5CONFIG) and rownum=1') INTO var_version,var_emitent,var_type;
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_emitent := '0000';
			var_type_str := '00';
        		var_version := 'NO_DATA';
		END;
		BEGIN
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''LNR_CONFIG'' ') INTO 				var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			EXECUTE IMMEDIATE ('SELECT SUBSTR(C_3,1,1) || ''.'' || SUBSTR(C_3,2,1) || ''.'' || SUBSTR(C_3,3,1) || ''.'' || SUBSTR(C_3,4,1) 
						FROM ' || var_owner || '.LNR_CONFIG WHERE c_1 = (SELECT MAX(c_1) FROM ' || var_owner || '.LNR_CONFIG) and ROWNUM=1') INTO var_lnr_ver;
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_lnr_ver := 'NO_DATA';
		END;
		BEGIN
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''CONFIGS'' ') INTO 				var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			EXECUTE IMMEDIATE ('SELECT param_val FROM ' || var_owner || '.CONFIGS WHERE param_type=''DB_VERSION'' and ROWNUM=1') INTO var_rep_ver;
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_rep_ver := 'NO_REPORTS';
		END;

		BEGIN	
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''INSTALL_LOG'' ') INTO 				var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%LNR%'' OR DESCRIPTION LIKE ''%ЛНР%'') and ROWNUM=1') INTO var_rlnr_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_rlnr_ver := 'NO_REPORTS';
		END;

		BEGIN	
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''INSTALL_LOG'' ') INTO 				var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%Monitor%'' OR DESCRIPTION LIKE ''%Монитор%'') and ROWNUM=1') INTO var_mcs_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_mcs_ver := 'NO_REPORTS';
		END;

		BEGIN	
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''PCPN_SETTINGS'' ') INTO 				var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			BEGIN
				EXECUTE IMMEDIATE ('SELECT t.PARAMETER_VALUE FROM ' || var_owner || '.' || 'PCPN_SETTINGS t WHERE t.PARAMETER_NAME=''PCPN_DB_VERSION'' and ROWNUM=1') INTO var_coup_ver; 
			EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    				WHEN NO_DATA_FOUND THEN
				var_coup_ver := 'NO_DATA';
			END;
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_coup_ver := 'NO_REPORTS';
		END;


		DBMS_OUTPUT.PUT_LINE( var_owner || ' - OC ' || var_emitent || ',' || var_type || ' version: ' || var_version || ';  LNR version: ' || var_lnr_ver );

		IF var_rep_ver != 'NO_REPORTS' THEN
			DBMS_OUTPUT.PUT_LINE('--- D-Reports OC version: ' || var_rep_ver);
		END IF;

		IF var_rlnr_ver != 'NO_REPORTS' THEN
			DBMS_OUTPUT.PUT_LINE('--- D-Reports LNR version: ' || var_rlnr_ver);
		END IF;

		IF var_mcs_ver != 'NO_REPORTS' THEN
			DBMS_OUTPUT.PUT_LINE('--- D-Reports MCS version: ' || var_mcs_ver);
		END IF;

		IF var_coup_ver != 'NO_REPORTS' THEN
			DBMS_OUTPUT.PUT_LINE('--- OC Coupons version: ' || var_coup_ver);
		END IF;

		DBMS_OUTPUT.PUT_LINE('----------------------------------------');


	END IF;

END LOOP;

CLOSE cur_tables; -- Закрываем курсор для ОЦ


DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('**************************************************');
DBMS_OUTPUT.PUT_LINE('******* Users/Schemas with ROC and PC(DPC) *******');
DBMS_OUTPUT.PUT_LINE('**************************************************');

OPEN cur_tables; -- Открываем курсор для ПЦ\РОЦ

LOOP
	FETCH cur_tables INTO var_table,var_owner;
	EXIT WHEN cur_tables%NOTFOUND;

	IF var_table = 'PC_CONFIGURATION' THEN
		BEGIN
			EXECUTE IMMEDIATE ('SELECT db_version,pc_number,pc_type FROM ' || var_owner || '.' || var_table) INTO var_version,var_emitent,var_type;
			IF var_type = 1 THEN
				var_type_str := 'ROC';
			ELSE
				var_type_str := 'PC';
			END IF;
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_emitent := '0000';
			var_type_str := '???';
        		var_version := 'NO_DATA';
		END;
		BEGIN
			EXECUTE IMMEDIATE ('SELECT table_name,owner FROM dba_tables WHERE owner=''' || var_owner || ''' AND table_name=''PC_CONFIGS'' ') INTO var_plh1, var_plh2; -- Необходимо на случай отсутствия самой таблицы
			EXECUTE IMMEDIATE ('SELECT param_val FROM ' || var_owner || '.PC_CONFIGS WHERE param_type=''DB_VERSION''  and ROWNUM=1') INTO var_pcrep_ver;		
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_pcrep_ver := 'NO_REPORTS';
		END;

		DBMS_OUTPUT.PUT_LINE( var_owner || ' - ' || var_type_str || ' ' || var_emitent || ' версии: ' || var_version);

		IF var_pcrep_ver != 'NO_REPORTS' THEN
			DBMS_OUTPUT.PUT_LINE('--- D-Reports PC/ROC version: ' || var_pcrep_ver);
		END IF;

		DBMS_OUTPUT.PUT_LINE('--------------------------------');


	END IF;

END LOOP;
CLOSE cur_tables; -- Закрываем курсор для ПЦ\РОЦ

DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('***************************************************');
DBMS_OUTPUT.PUT_LINE('******* Users/Schemas with AS and P+ Online *******');
DBMS_OUTPUT.PUT_LINE('***************************************************');

OPEN cur_tables; -- Открываем курсор для ONLINE

LOOP
	FETCH cur_tables INTO var_table,var_owner;

	EXIT WHEN cur_tables%NOTFOUND;

	IF var_table = 'INSTALL_ONL' THEN
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - P+ Online components installed:');
		var_online_loop := 1;
		LOOP
		EXIT WHEN var_online_loop = 4;
			BEGIN

					IF var_online_loop = 1 THEN
						var_online_prod := 'FASTPREPARE';
					END IF;
					IF var_online_loop = 2 THEN
						var_online_prod := 'IEM';
					END IF;
					IF var_online_loop = 3 THEN
						var_online_prod := 'AS';
					END IF;

					var_online_loop := var_online_loop + 1;
					EXECUTE IMMEDIATE ('SELECT t1.product, t1.version FROM ' || var_owner || '.INSTALL_ONL t1, (SELECT t3.product as r_prod, MAX(t3.INSTALL_DATE) as r_date FROM ' || var_owner || '.INSTALL_ONL t3  WHERE t3.product=''' || var_online_prod || ''' GROUP BY t3.product) t2 WHERE t1.INSTALL_DATE=t2.r_date AND t1.product=t2.r_prod') INTO var_onl_prod, var_onl_ver;
					DBMS_OUTPUT.PUT_LINE('--- ' || var_onl_prod || ' version: ' || var_onl_ver);

			EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    				WHEN NO_DATA_FOUND THEN
				var_onl_prod := 'NO_DATA';
        			var_onl_ver := 'NO_DATA';
			END;
		END LOOP;
		DBMS_OUTPUT.PUT_LINE('--------------------------------');

	END IF;

END LOOP;
CLOSE cur_tables; -- Закрываем курсор для ONLINE

DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('*');
DBMS_OUTPUT.PUT_LINE('*************************************************');
DBMS_OUTPUT.PUT_LINE('*** Users/Schemas with other P+ Plus Software ***');
DBMS_OUTPUT.PUT_LINE('*************************************************');

OPEN cur_tables; -- Открываем курсор для остальных приложений
LOOP
	FETCH cur_tables INTO var_table,var_owner;
	EXIT WHEN cur_tables%NOTFOUND;

	IF var_table = 'TERMINALCONFIG' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%TMS%'') and ROWNUM=1') INTO var_tms_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_tms_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - TMS version: ' || var_tms_ver);
	END IF;

	IF var_table = 'X$PWS_EMT_LIST' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%PWS OC%'') and ROWNUM=1') INTO var_pws_oc_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_pws_oc_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - PWS-OC version: ' || var_pws_oc_ver);
	END IF;

	IF var_table = 'PWS_CARD_HOLDER' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%PWS WEB%'') and ROWNUM=1') INTO var_pws_web_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_pws_web_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - PWS-WEB version: ' || var_pws_web_ver);
	END IF;

	IF var_table = 'AQUA_PHONE' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%AQUA%'') and ROWNUM=1') INTO var_aqua_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_aqua_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - AQUA-Center version: ' || var_aqua_ver);
	END IF;

	IF var_table = 'CS_ACTIONS' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT TRIM(SUBSTR(DESCRIPTION,INSTR(DESCRIPTION,''.'')-2)) FROM ' || var_owner || '.' || 'INSTALL_LOG t where t.DATEOF=(SELECT MAX(DATEOF) FROM ' || var_owner || '.' || 'INSTALL_LOG WHERE DESCRIPTION LIKE ''%Phoenix%'') and ROWNUM=1') INTO var_phoenix_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_phoenix_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - IS-Phoenix version: ' || var_phoenix_ver);
	END IF;

	IF var_table = 'IEM_CONFIG' THEN
		BEGIN	
			EXECUTE IMMEDIATE ('SELECT MAX(VERSION) FROM ' || var_owner || '.IEM_CONFIG') INTO var_iemoc_ver; 
		EXCEPTION -- Необходимо на случай отсутствия данных в таблице
    			WHEN NO_DATA_FOUND THEN
			var_iemoc_ver := 'NO_DATA';
		END;
		DBMS_OUTPUT.PUT_LINE( var_owner || ' - IEM-OC version: ' || var_iemoc_ver);
	END IF;

END LOOP;

CLOSE cur_tables; -- Закрываем курсор для остальных приложений

END;
/

SPOOL OFF
SET TERMOUT ON
SET ECHO ON
EXIT
