| Пакет для работы с сетью |
|
|
ORa_networkPLSQL Пакет с сервисными функциями для работы с сетевыми протоколами , преобразования , маски , сети , различные системы счисления , выборки ....ВНИМАНИЕ!!!! для корректной работы скрипта необходимо сначала создать тип!!!!CREATE OR REPLACE TYPE ds_ip_type as table of varchar2(50);
>>Скачать программу в формате ZIPCREATE OR REPLACE PACKAGE Pkg_Networkservice AS /****************************************************************************** Наименование: Pkg_NetworkService НАЗНАЧЕНИЕ: функции , процедуры и функции для упрощения работы с сетью , ip адреса , маски подсетей , интервалы , сетевой калькулятор адресов , функции для работы с unixtime
СВЕДЕНИЯ: Версия Создана Автор Описание --------- ---------- --------------- ------------------------------------ 1.0 24.12.2006 Чалышев М.М. 1. Работа с файлами в oracle СУБД ******************************************************************************/ -- процедуры и функции пакета cv_ipseparator CONSTANT VARCHAR2(1) := '.'; cv_unixtimeoffset CONSTANT NUMBER := 4*3600; -- преобразует строку ip адрес в число -- Fn_IPtoNum('255.255.200.1') результат 4294952961 FUNCTION Fn_IPtoNum(p_ip IN VARCHAR2) RETURN NUMBER;
-- преобразует число в строковый ip адрес -- Fn_NumToIP(4294952961) результат '255.255.200.1' FUNCTION Fn_NumToIP(p_ipnumber IN INTEGER) RETURN VARCHAR2; -- преобразует маску в ip адрес -- Fn_MasktoIP(24) результат 4294967040 FUNCTION Fn_MasktoIPN(p_mask IN INTEGER) RETURN NUMBER; -- преобразует маску в ip адрес - число -- Fn_IPtoNum('255.255.200.1') результат 4294952961 FUNCTION Fn_MasktoIP(p_mask IN INTEGER) RETURN VARCHAR2;
-- конвертирует возвращает декаду из Ip адреса IP адрес - строка -- Pkg_Networkservice.fn_GetIPDec('255.1.1.1' , 1) -- результат: 255 FUNCTION fn_GetIPDec(p_ip VARCHAR2 , p_decno NUMBER) RETURN NUMBER; -- конвертирует датувремя из формата unixtime (timestamp) в стандартный формат oracle -- Pkg_Networkservice.fn_UnixTimeToDate('946706461') -- результат: 01.01.2000 01:01:01 FUNCTION fn_UnixTimeToDate(p_unixtime NUMBER) RETURN DATE;
-- конвертирует датувремя из формата oracle date в формат unixtime (timestamp)) -- Pkg_Networkservice.fn_DateToUNIXTime(TO_DATE( '01.01.2000 01:01:01', 'DD.MM.YYYY HH24:mI:ss')) -- результат: 946706461 FUNCTION fn_DateToUnixTime( p_Date IN DATE ) RETURN NUMBER; -- логический AND двух чисел p_first , p_next -- Pkg_Networkservice.fn_BITAND(12345 ,65535) -- результат: 12345 FUNCTION fn_BITAND(p_first NUMBER , p_next NUMBER) RETURN NUMBER; -- логический OR двух чисел p_first , p_next -- Pkg_Networkservice.fn_BITOR(12345 ,65535) -- результат: 12345 FUNCTION fn_BITOR(p_first NUMBER , p_next NUMBER) RETURN NUMBER; -- логический XOR двух чисел p_first , p_next -- Pkg_Networkservice.fn_BITXOR(12345 ,65535) -- результат: 12345 FUNCTION fn_BITXOR(p_first NUMBER , p_next NUMBER) RETURN NUMBER; -- перевод целого числа из десятичного в шестнадцатеричный формат -- Pkg_Networkservice.fn_DecToHex(255) -- результат: "FF" FUNCTION fn_DecToHex(p_int INTEGER ) RETURN VARCHAR2; -- прерводит значение из шестнадцатиричного формата в десятичный -- Pkg_Networkservice.fn_HexToDec('FC16') -- результат: 64534 FUNCTION fn_HexToDec(p_hex VARCHAR2) RETURN INTEGER; -- перевод двоичного значения в десятичное число -- Pkg_Networkservice.fn_BinToDec('11111111') -- результат: 255 FUNCTION fn_BinToDec(p_bin VARCHAR2) RETURN INTEGER; -- верхний диапазон ip адреса по маске -- Pkg_Networkservice.fn_MaskAddrHigh(); -- результат: 255 FUNCTION fn_MaskAddrHigh(p_mask NUMBER, p_ipnum NUMBER) RETURN NUMBER; -- нижний диапазон ip адреса по маске -- Pkg_Networkservice.fn_MaskAddrLow(); -- результат: 255 FUNCTION fn_MaskAddrLow(p_mask NUMBER, p_ipnum NUMBER) RETURN NUMBER; -- Определяет приналедность ip адреса к заданной подсети -- подсеть задется по ip адресу и маске -- Pkg_Networkservice.fn_IpIsMask('123.123.123.0','255.255.255.0' ,123.123.123.7) -- результат true -- Pkg_Networkservice.fn_IpIsMask('21312312','24' ,123.123.123.0) -- результат false FUNCTION fn_IpIsMask(p_MaskIp VARCHAR2, p_Mask VARCHAR2, p_IpNum VARCHAR2) RETURN NUMBER; -- Генерирет диапазон ip адресов по заданной подсети -- подсеть задется по ip адресу и маске -- результат возвращается в sys_refcursor -- Pkg_Networkservice.fn_BITXOR(12345 ,65535) -- результат: 12345 FUNCTION Fn_Generatenetwork(p_mask INTEGER, p_maskip VARCHAR , IpType VARCHAR := 'VARCHAR') RETURN ds_ip_typePIPELINED; -- Находит сумму , среднее , минимальное , максимальное значение -- в наборе данных в выбранной подсети -- рекомендуется ипользовать на некритичных наборах данных -- операции SUM, AVG, MIN, MAX -- подсеть задется по ip адресу и маске -- Pkg_Networkservice.fn_BITXOR(12345 ,65535) -- результат: 12345 FUNCTION fn_GroupMask(p_maskip VARCHAR2, p_mask VARCHAR2, p_TableName VARCHAR2, p_fieldNAMEip VARCHAR2, p_fieldnamebytes VARCHAR2, p_Operation VARCHAR2, p_where_clause VARCHAR2 := ' 1=1 ') RETURN NUMBER; END Pkg_Networkservice;/ CREATE OR REPLACE PACKAGE BODY Pkg_Networkservice AS /******************************************************************** PL SQL Назначение: Преобразует строку IP адреса в число Параметры: p_ip - ip адрес строка Зависимости:
Ограничения: Пример: Pkg_Networkservice.Fn_IPtoNum('255.255.200.1') результат 4294952961 Список исправлений: *********************************************************************/ FUNCTION Fn_IPtoNum(p_ip IN VARCHAR2) RETURN NUMBERIS vr_IpNumber VARCHAR2(255); vr_IpReturnNumber NUMBER; vr_dec1 VARCHAR2(255); vr_dec2 VARCHAR2(255); vr_dec3 VARCHAR2(255); vr_dec4 VARCHAR2(255); BEGIN BEGIN vr_ipNumber := p_ip ; vr_dec1 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1);vr_dec2 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1);vr_dec3 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1)||'.';vr_dec4 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); -- IF TO_NUMBER(vr_dec1)>255 THENvr_dec1:='0'; END IF; IF TO_NUMBER(vr_dec2)>255 THENvr_dec2:='0'; END IF; IF TO_NUMBER(vr_dec3)>255 THENvr_dec3:='0'; END IF; IF TO_NUMBER(vr_dec4)>255 THENvr_dec4:='0'; END IF; vr_IpReturnNumber :=TO_NUMBER(vr_dec4) + TO_NUMBER(vr_dec3) * 256 + TO_NUMBER(vr_dec2) * 256* 256 + TO_NUMBER(vr_dec1) * 256 * 256 * 256; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('Fn_IPtoNum '||SQLERRM ,0 ); END;RETURN vr_ipReturnNumber; END Fn_IpToNum; /********************************************************************PL SQL Назначение: Преобразует число в строку IP адреса Параметры: p_ipnumber - ip адрес целое число Зависимости: Ограничения: Пример: Pkg_Networkservice.Fn_NumtoIP(4294952961) результат '255.255.200.1' Список исправлений: *********************************************************************/FUNCTION Fn_NumToIP(p_ipnumber IN INTEGER) RETURN VARCHAR2 IS vr_TmpVar NUMBER; vr_dec1 NUMBER; vr_dec2 NUMBER; vr_dec3 NUMBER; vr_dec4 NUMBER; vr_ReturnIp VARCHAR(15); BEGIN BEGINvr_TmpVar := p_ipnumber; vr_dec4 := MOD(TRUNC(p_ipnumber / (256*256*256)), 256); vr_dec3 := MOD(TRUNC(p_ipnumber / (256*256)), 256); vr_dec2 := MOD(TRUNC(p_ipnumber / 256), 256); vr_dec1 := MOD(p_ipnumber, 256);vr_ReturnIp := TO_CHAR(vr_dec4)||'.'||TO_CHAR(vr_dec3)||'.'||TO_CHAR(vr_dec2)||'.'||TO_CHAR(vr_dec1); RETURN vr_ReturnIp; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('Fn_NumToIP '||SQLERRM ,0 ); END;END Fn_NumToIP; /********************************************************************Назначение: Преобразует маску в строку ip адреса Параметры: p_mask - маска для ip адреса Зависимости: Ограничения: Пример: Pkg_Networkservice.Fn_MaskToIPN(24) результат 4294967040 Список исправлений: *********************************************************************/FUNCTION Fn_MaskToIPN(p_mask IN INTEGER) RETURN NUMBER IS vr_ReturnValue NUMBER; BEGIN BEGINIF p_mask>32 THEN RAISE INVALID_NUMBER; END IF;vr_ReturnValue := fn_bintodec(LPAD('1', p_mask, '1')||LPAD('0', 32-p_mask, '0')); RETURN vr_ReturnValue; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('Fn_NumToIP '||SQLERRM ,0 ); END;END Fn_MaskToIPN; /******************************************************************** PL SQL Назначение: Преобразует маску в строку ip адреса Параметры: p_mask - маска для ip адреса Зависимости: Ограничения: Пример: Pkg_Networkservice.Fn_MaskToIP(24) результат "255.255.255.0" Список исправлений: *********************************************************************/FUNCTION Fn_MasktoIP(p_mask IN INTEGER) RETURN VARCHAR2 IS vr_ReturnValue VARCHAR2(15); BEGIN BEGINIF p_mask > 32 THEN RAISE INVALID_NUMBER; END IF;vr_ReturnValue := Fn_NumToIp(Fn_MasktoIPN(p_mask)); RETURN vr_ReturnValue; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('Fn_NumToIP '||SQLERRM ,0 ); END;END Fn_MaskToIP; /******************************************************************** PL SQL Назначение: преобразование UnixTime в дату фоpмата Oracle Параметры: p_unixtime дата в unixtime офрмате Зависимости: Ограничения: Пример: Pkg_Networkservice.fn_UnixTimeToDate('946706461') 01.01.2000 01:01:01 Список исправлений: *********************************************************************/FUNCTION fn_UnixTimeToDate(p_unixtime NUMBER) RETURN DATE ISvr_returnvalue DATE; BEGIN BEGIN SELECTNEW_TIME( TO_DATE('01011970','ddmmyyyy') + 1/24/60/60 * (p_UnixTime+cv_unixtimeoffset) ,'GMT', 'EDT' ) INTO vr_returnvalueFROM dual; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_UnixTimeToDate '||SQLERRM ,0 ); END;RETURN vr_ReturnValue; END fn_UnixTimeToDate; /********************************************************************PL SQL Назначение: преобразование Oracle дату в UnixTime Параметры: p_Date дата в формате oracle date Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_DateToUNIXTime(TO_DATE( '01.01.2000 01:01:01', 'DD.MM.YYYY HH24:mI:ss')) -- 946706461 Список исправлений: *********************************************************************/ FUNCTION fn_DateToUNIXTime(p_Date IN DATE ) RETURN NUMBERIS BEGIN RETURN TRUNC( ( p_Date - TO_DATE( '01-01-1970', 'dd-mm-yyyy' )) * 60 * 60 * 24 +(5/24) * 60 * 60 * 24) ; END fn_DateToUNIXTime; /******************************************************************** PL SQL Назначение: логический and двух чисел p_first , p_next Параметры: p_first - первое значение p_next - второе значение Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_BITAND(12345 ,65535) -- 12345 Список исправлений: *********************************************************************/ FUNCTION fn_BITAND(p_first NUMBER , p_next NUMBER) RETURN NUMBERIS vr_returnvalue NUMBER; BEGIN BEGINSELECT BITAND(p_first, p_next) INTO vr_returnvalueFROM dual; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_BITAND '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_BITAND; /******************************************************************** PL SQL Назначение: возращает значения декады адреса ip Параметры: p_ip - ip адрес строка p_decno - номер декады от 1..4 Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_BITOR('255.1.1.0' ,1) -- 12345 Список исправлений: *********************************************************************/FUNCTION fn_GetIPDec(p_ip VARCHAR2 , p_decno NUMBER) RETURN NUMBER ISvr_IpNumber VARCHAR2(255); vr_IpReturnNumber NUMBER; vr_dec1 VARCHAR2(255); vr_dec2 VARCHAR2(255); vr_dec3 VARCHAR2(255); vr_dec4 VARCHAR2(255); vr_returnvalue VARCHAR2(15); BEGINBEGIN IF p_decno NOT IN (1, 2, 3, 4)THEN RAISE INVALID_NUMBER ; END IF ;vr_ipNumber := p_ip ; vr_dec1 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1);vr_dec2 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1);vr_dec3 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); vr_ipNumber := SUBSTR(vr_ipNumber , INSTR(vr_ipNumber, cv_ipseparator )+1)||'.';vr_dec4 := SUBSTR(vr_ipNumber, 1, INSTR(vr_ipNumber, cv_ipseparator )-1); SELECT DECODE(p_decno ,1, vr_dec1, 2, vr_dec2, 3, vr_dec3, 4, vr_dec4)ret_val INTO vr_returnvalue FROM dual; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_GetIPDec '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_GetIPDec; /******************************************************************** PL SQL Назначение: логический and двух чисел p_first , p_next Параметры: p_first первое значение p_next второе значение Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_BITOR(12345 ,65535) -- 12345 Список исправлений: *********************************************************************/ FUNCTION fn_BITOR(p_first NUMBER , p_next NUMBER) RETURN NUMBERIS vr_returnvalue NUMBER; BEGIN BEGINSELECT p_first + p_next - BITAND(p_first, p_next) INTO vr_returnvalue FROMdual; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_BITOR '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_BITOR;
/******************************************************************** PL SQL Назначение: логический XOR двух чисел p_first , p_next Параметры: p_first первое значение p_next второе значение Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_BITXOR(12345 ,65535) -- 12345 Список исправлений: *********************************************************************/ FUNCTION fn_BITXOR(p_first NUMBER , p_next NUMBER) RETURN NUMBERIS vr_returnvalue NUMBER; BEGIN BEGINvr_returnvalue := p_first + p_next - 2*BITAND(p_first, p_next); EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_BITXOR '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_BITXOR; /******************************************************************** PL SQL Назначение: перевод целого числа из десятичного в число шестнадцатеричного формата Параметры: p_int - десятичное число Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_DecToHex(255) -- "FF" Список исправлений: *********************************************************************/ FUNCTION fn_DecToHex(p_int INTEGER ) RETURN VARCHAR2 IS vr_returnvalue VARCHAR2(255); vr_hex VARCHAR2(255); vr_number INTEGER; vr_num1 INTEGER; vr_num2 INTEGER; BEGIN BEGINvr_hex := ''; vr_returnvalue := '';vr_number := p_int; WHILE (vr_number <> 0)LOOP SELECT DECODE( TRUNC(vr_number / POWER(16, TRUNC(LOG(16, vr_number)))) , 0, '0' , 1, '1' , 2, '2' , 3, '3' , 4, '4' , 5, '6' , 7, '7' , 8, '8' , 9, '9' , 10, 'A' , 11, 'B' , 12, 'C' , 13, 'D' , 14, 'E' , 15, 'F' ) INTO vr_hexFROM dual; vr_returnvalue := vr_returnvalue || vr_hex;vr_num1 := POWER(16, TRUNC(LOG(16, vr_number))); vr_num2 := TRUNC(vr_number/POWER(16, TRUNC(LOG(16, vr_number)))); vr_number := vr_number - vr_num1 * vr_num2; END LOOP;EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_DecToHex '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_DecToHex; /******************************************************************** PL SQL Назначение: перевод шестнадцатиричного целого числа в десятичный формат Параметры: p_int - десятичное число Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_HexToDec('FFFA') -- 64530 Список исправлений: *********************************************************************/ FUNCTION fn_HexToDec(p_hex VARCHAR2) RETURN INTEGER IS vr_returnvalue VARCHAR2(255); vr_hex VARCHAR2(255); vr_number INTEGER; vr_digs INTEGER; vr_value INTEGER;BEGIN BEGINvr_hex := UPPER(p_hex); vr_number := 0; vr_value := LENGTH(p_hex); WHILE (vr_value > 0)LOOP SELECTDECODE(SUBSTR(vr_hex , vr_value,1) , '0', 0 , '1', 1 , '2', 2 , '3', 3 , '4', 4 , '5', 5 , '6', 6 , '7', 7 , '8', 8 , '9', 9 , 'A', 10, 'B', 11 , 'C', 12 , 'D', 13 , 'E', 14 , 'F', 15 ) INTO vr_digs FROM dual; vr_number := vr_number + vr_digs * POWER(16, LENGTH(p_hex) - vr_value); vr_value := vr_value - 1;END LOOP; vr_returnvalue := vr_number;RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_DecToHex '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_HexToDec; /******************************************************************** PL SQL Назначение: перевод десятичного числа в двоичный формат Параметры: p_dec - десятичное число Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_DecToBin(255) -- 11111111 Список исправлений: *********************************************************************/ FUNCTION fn_DecToBin(p_dec INTEGER) RETURN VARCHAR2 IS vr_returnvalue VARCHAR2(255); vr_number INTEGER; vr_digs INTEGER; vr_value INTEGER;BEGIN BEGINvr_number := p_dec; vr_value := 0;WHILE (vr_number > 0) LOOPvr_digs := MOD(vr_number , 2); vr_returnvalue := vr_returnvalue || TO_CHAR(vr_digs);vr_number := TRUNC(vr_number / 2); END LOOP;RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_DecToBin '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_DecToBin;
/******************************************************************** PL SQL Назначение: перевод двоичного числа в десятичный формат Параметры: p_bin - двоичное число Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_HexToDec('11111111') -- 255 Список исправлений: *********************************************************************/ FUNCTION fn_BinToDec(p_bin VARCHAR2) RETURN INTEGER IS vr_returnvalue INTEGER; vr_bin VARCHAR2(255); vr_number INTEGER; vr_digs VARCHAR2(1); vr_value INTEGER;BEGIN BEGINvr_bin := UPPER(p_bin); vr_number := 0; vr_value := LENGTH(p_bin); WHILE (vr_value > 0)LOOP vr_digs := SUBSTR(vr_bin , vr_value,1); IF vr_digs = '1' THENvr_number := vr_number + vr_digs * POWER(2, LENGTH(p_bin) - vr_value); END IF; vr_value := vr_value - 1;END LOOP; vr_returnvalue := vr_number;RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_BinToDec '||SQLERRM ,0 );END; RETURN vr_ReturnValue;END fn_BinToDec; /******************************************************************** PL SQL Назначение: нижняя граница ip адресов диапазона Параметры: p_ipnum - IP диапазона адресов p_mask - маска диапазона Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_MaskAddrLow() -- 255 Список исправлений: *********************************************************************/ FUNCTION fn_MaskAddrLow(p_mask NUMBER, p_ipnum NUMBER) RETURN NUMBER IS vr_returnvalue NUMBER; vr_masknum NUMBER; BEGIN BEGINSELECT fn_masktoipn(p_mask) INTO vr_masknumFROM dual; SELECT fn_BITAND(p_ipnum, vr_masknum)+1INTO vr_returnvalue FROM DUAL;-- RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_MaskAddrLow '||SQLERRM ,0 );END; END fn_MaskAddrLow; /******************************************************************** PL SQL Назначение: нижняя граница ip адресов диапазона Параметры: p_ipnum - IP диапазона адресов p_mask - маска диапазона Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_MaskAddrHigh() -- 255 Список исправлений: *********************************************************************/ FUNCTION fn_MaskAddrHigh(p_mask NUMBER, p_ipnum NUMBER) RETURN NUMBER IS vr_returnvalue NUMBER; BEGIN BEGINSELECT TRUNC(TRUNC(p_ipnum / POWER(2, 32 - p_mask)) * POWER(2, 32 - p_mask) + (POWER(2, 32 - p_mask) - 1)) INTO vr_returnvalue FROM DUAL;RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_MaskAddrLow '||SQLERRM ,0 );END; END fn_MaskAddrHigh; /********************************************************************PL SQL Назначение: определяет приналедность ip адреса к заданной подсети Параметры: p_MaskIp - адрес характеризующий подсеть p_Mask - маска данной подсети p_IpNum - адрес который проверяем на принадлежность к данной подсети Ограничения: Пример: Pkg_Networkservice.fn_IpIsMask('123.123.123.0','255.255.255.0' ,123.123.123.7) результат true Pkg_Networkservice.fn_IpIsMask('21312312','24' ,123.123.123.0) результат false Список исправлений: *********************************************************************/FUNCTION fn_IpIsMask(p_MaskIp VARCHAR2, p_Mask VARCHAR2, p_IpNum VARCHAR2) RETURN NUMBER IS vr_returnvalue NUMBER; vr_Numip NUMBER; vr_NumMaskip NUMBER; vr_NumMask NUMBER; vr_NumReturn NUMBER;BEGIN BEGIN IF INSTR(p_MaskIp, '.') = 0 THENvr_NumMaskip := TO_NUMBER(p_MaskIp); ELSEvr_NumMaskip := fn_IpToNum(p_MaskIp); END IF; IF INSTR(p_IpNum, '.') = 0 THENvr_Numip := TO_NUMBER(p_IpNum); ELSEvr_Numip := fn_IpToNum(p_IpNum); END IF; IF INSTR(p_Mask, '.') = 0 THENIF vr_NumMask<33 THEN vr_NumMask := TO_NUMBER(p_Mask); ELSEvr_NumMask := fn_IpToNum(p_Mask); END IF;ELSE vr_NumMask := fn_IpToNum(p_Mask); -- здесь надо доработать END IF;SELECT BITAND(vr_NumMask, vr_NumIp) INTO vr_NumReturnFROM dual; vr_returnvalue := 0;SELECT DECODE(vr_NumReturn, vr_NumMaskip, 1 , 0) INTO vr_returnvalueFROM dual ;RETURN vr_returnvalue; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_IpIsMask '||SQLERRM ,0 );END; END fn_IpIsMask;
/******************************************************************** PL SQL Назначение:Генерирует диапазон ip адресов по заданной подсети подсеть задется по ip адресу и маске, результат возвращается в piplined функцию Параметры: p_MaskIp - адрес характеризующий подсеть p_Mask - маска данной подсети Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_DecToBin(255) -- 11111111 Список исправлений: *********************************************************************/ FUNCTION Fn_Generatenetwork(p_mask INTEGER,p_maskip VARCHAR, IpType VARCHAR := 'VARCHAR') RETURN ds_ip_type PIPELINED IS vr_low INTEGER; vr_heigh INTEGER; vr_ipnum INTEGER;BEGIN BEGINSELECT fn_MaskAddrLow(p_mask, fn_iptonum(p_maskip)) INTO vr_low FROM dual;SELECT fn_MaskAddrHigh(p_mask, fn_iptonum(p_maskip)) INTO vr_heighFROM dual; FOR vr_ipnum IN 0..vr_heigh-vr_low-1 LOOP pipe ROW(fn_numtoip(vr_low+vr_ipnum)); END LOOP; RETURN; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_GenerateNetWork '||SQLERRM ,0 ); END;END Fn_Generatenetwork; /******************************************************************** PL SQL Назначение:Генерирует диапазон ip адресов по заданной подсети подсеть задется по ip адресу и маске, результат возвращается в piplined функцию Параметры: p_MaskIp - адрес характеризующий подсеть p_Mask - маска данной подсети Зависимости: Ограничения: Пример: -- Pkg_Networkservice.fn_DecToBin(255) -- 11111111 Список исправлений: *********************************************************************/ FUNCTION fn_GroupMask(p_maskip VARCHAR2, p_mask VARCHAR2, p_TableName VARCHAR2, p_fieldNAMEip VARCHAR2, p_fieldnamebytes VARCHAR2, p_Operation VARCHAR2, p_where_clause VARCHAR2 := ' 1=1 ') RETURN NUMBER IS vr_script VARCHAR2(32565); vr_returnvalue NUMBER(32); BEGIN BEGIN-- сделал так, а всем любителям критики... :P vr_script := 'SELECT nvl('||p_Operation||'('||p_fieldnamebytes||'),0)'||' FROM '||p_TableName||' WHERE PKG_NETWORKSERVICE.fn_IpIsMask('||''''||p_maskip||''''||' , '||''''|| p_Mask ||''''||' , '|| p_fieldNAMEip||' ) = 1 and '||p_where_clause; DBMS_OUTPUT.PUT_LINE(vr_script); EXECUTE IMMEDIATE vr_script INTO vr_returnvalue ;RETURN vr_returnvalue; EXCEPTIONWHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_GroupMask '||SQLERRM ,0 ); END;END fn_GroupMask; END Pkg_Networkservice ; /
|
| След. » |
|---|
PL SQL Сеть 


Комментарии
2011-10-1806:55:12 !!!!!!!!!!
для корректной работы скрипта добавить!!!!
CREATE OR REPLACE TYPE ds_ip_type as table of varchar2(50);
2011-10-1208:56:29 Привет!
попробовал установить пэкедж из oranetwork.zip
оказалось, что не объявлен тип ds_ip_type
поправьте, пожалуйста.