Вообщем вот
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;
Comment