Ad Widget

Collapse

Oracle процедура для массового создания компл&

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • dotneft
    Senior Member
    • Nov 2008
    • 699

    #1

    Oracle процедура для массового создания компл&

    Вообщем вот
    Code:
    CREATE OR REPLACE PROCEDURE add_graphs_from_host(hostid_in hosts.hostid%TYPE,screenid_in screens.SCREENID%TYPE := NULL, count_graphs_tmp IN NUMBER := NULL)
    IS
    /****************************************************************************
       NAME:      add_graphs_from_host
       PURPOSE:   Массовое добавление комплексных отчетов
       
       PARAMS:	  hostid_in - ID узла сети, графики которого добавляем в комплексный отчет
       			  screenid_in - ID комплексного отчета в который добавляем графики (если не укзаан создается новый)
       			  count_graphs_tmp - минимальное количество графиков у хоста для 
       			  					 создания по нему комплексного отчета
    
       REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        27.02.2010  dotneft         1. Created this procedure.
    ****************************************************************************/
    	-- курсор получения графиков узла сети по его ID
    	CURSOR get_graphs(host_id hosts.hostid%TYPE) IS
    	   SELECT graphid,name, count(*) over() CNT FROM (
    	   			SELECT DISTINCT g.graphid,name FROM graphs g
    					JOIN graphs_items gi ON gi.graphid = g.graphid
    					JOIN items i ON i.itemid = gi.itemid
    					JOIN hosts h ON h.hostid = i.hostid and h.hostid=host_id 
    				ORDER by g.name ASC);
    		
    	-- курсор получения данных о комплексном отчете по его ID
    	CURSOR get_screen (screen_id screens.screenid%TYPE) IS
    		SELECT hsize,vsize FROM SCREENS WHERE screenid = screen_id;
    		
    	-- курсор получения текущего значения sequenct для screens.screenid
    	CURSOR get_screen_id IS
    		SELECT screens_screenid.currval FROM dual;		
    		
    	-- курсор получения количества коплексных отчетов
    	CURSOR get_screens_count(screen_name screens.name%TYPE) IS
    		SELECT count(*) FROM screens WHERE NAME like '%'|| screen_name || '%'
    									OR name = screen_name;			
    		
    	-- курсор получения имени хоста
    	CURSOR get_host IS
    		SELECT host FROM hosts WHERE hostid = hostid_in;		
    		
    	hostname hosts.host%TYPE;
    	
    	h_size screens.HSIZE%TYPE;
    	v_size screens.VSIZE%TYPE;
    	screens_count NUMBER;
    	screens_cnt_with_name NUMBER;
    	screenid_tmp screens.SCREENID%TYPE;
    	
    	count_graphs NUMBER;
    
    	h_size_tmp screens.HSIZE%TYPE;
    	v_size_tmp screens.VSIZE%TYPE;	
    BEGIN
    	h_size_tmp := 0;
    	v_size_tmp := 0;
    	screens_count := 1;
    	
    	-- Если комплексный отчет уже существует с таким же именем хоста
    	OPEN get_host;
    	FETCH get_host INTO hostname;
    	CLOSE get_host;	
    	
    	OPEN get_screens_count(hostname);
    	FETCH get_screens_count INTO screens_cnt_with_name;
    	CLOSE get_screens_count;
    	
    	IF (screens_cnt_with_name != 0) THEN
    		RETURN;
    	END IF; 		
    	
    	-- Если не указано количество графиков берем дефолтное
    	IF (count_graphs_tmp is null) THEN
    		count_graphs := 3;
    	ELSE
    		count_graphs := count_graphs_tmp;
    	END IF;
    	
    	-- Если указан screenid_in, то получаем данные о количестве колонок
    	if (screenid_in is not null) THEN
    		BEGIN
    			screenid_tmp := screenid_in;
    
    			OPEN get_screen(screenid_tmp);
    	
    			FETCH get_screen INTO h_size, v_size;
    	
    			-- Если комплексного отчета с screenid_in не существует, то получаем данные о имени хоста
    			IF (get_screen%ROWCOUNT = 0) THEN
    				BEGIN
    					screens_count := 0;				
    				END;
    			END IF;	
    	
    			CLOSE get_screen;
    		END;
    	ELSE
    		BEGIN -- Если screenid_in не задан, то получаем данные о имени хоста
    			screens_count := 0;	
    		END;	
    	END IF;
    	
    	-- Перебираем графики у хоста hostid_in
    	FOR v_gr IN get_graphs(hostid_in) LOOP
    		-- Если количество графиков меньше заданного количества (по умолчанию 3) выходим из цикла
    		IF (v_gr.cnt <= count_graphs ) THEN
    			EXIT;
    		END IF;
    	
    		-- Если комплексный отчет не задан или не существует
    		IF (screens_count = 0 ) THEN
    			-- Создаем комплексный отчет и получаем его screen_id
    			BEGIN
    				-- Если количество графиков меньше 8, то делаем 1 столбец
    				IF (v_gr.cnt <= 8) THEN
    					BEGIN
    						IF (MOD(v_gr.cnt,2) = 0) THEN
    							v_size := ROUND(v_gr.cnt/2,0);
    						ELSE
    							v_size := ROUND(v_gr.cnt/2,0)+1;
    						END IF;						
    						h_size := 1;
    					END;
    				ELSE
    					BEGIN
    						v_size := ROUND(v_gr.cnt/2,0)+1;
    						h_size := 2;
    					END;
    				END IF;
    				INSERT INTO SCREENS (SCREENID,NAME,HSIZE,VSIZE) VALUES (screens_screenid.nextval,hostname,h_size,v_size);
    				
    				OPEN get_screen_id;
    				
    				FETCH get_screen_id INTO screenid_tmp;
    				
    				CLOSE get_screen_id;
    				
    				screens_count := 1;
    			END;
    		END IF;
    	
    		INSERT INTO SCREENS_ITEMS (SCREENITEMID,screenid,resourcetype,resourceid,width,height,
    									X,Y) 
    							VALUES (screens_items_screenitemid.nextval,screenid_tmp,0,
    									v_gr.graphid,500,100,h_size_tmp,v_size_tmp);
    							
    		-- Если по горизонтали уже заполнили, то 									
    		IF (h_size_tmp = h_size - 1) THEN
    			BEGIN
    				-- Если количество ячеек равно количество вставленных графиков
    				IF (v_size_tmp = v_size - 1) THEN
    					EXIT;
    				END IF;
    				
    				-- Обнуляем столбец и увеличиваем строку на 1
    				h_size_tmp := 0;
    				v_size_tmp := v_size_tmp + 1;
    			END;
    		ELSE
    			-- Увеличиваем столбец на 1
    			h_size_tmp := h_size_tmp + 1;	
    		END IF;  
    		
    											
    	END LOOP;	
    
    END add_graphs_from_host;
  • dotneft
    Senior Member
    • Nov 2008
    • 699

    #2
    добавление для всех хостов (не менее 3-х графиков):

    Code:
    DECLARE
                    CURSOR get_hostid IS
                                   SELECT DISTINCT hostid FROM hosts WHERE status = 0;               
    BEGIN
                    FOR v_gr IN get_hostid LOOP
                                   zabbix_test.add_graphs_from_host(v_gr.hostid,null,3);
                    END LOOP;         
    END;

    Comment

    Working...