Пакет для работы с сетью Печать E-mail
Рейтинг: / 7
ХудшаяЛучшая 

ORa_network 

PLSQL Пакет с сервисными функциями для  работы с сетевыми протоколами , преобразования , маски , сети , различные системы счисления , выборки ....

ВНИМАНИЕ!!!! для корректной работы скрипта необходимо сначала создать тип!!!!


CREATE OR REPLACE TYPE ds_ip_type as table of varchar2(50);

 

>>Скачать программу в формате ZIP

CREATE 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_type

PIPELINED;

-- Находит сумму , среднее , минимальное , максимальное значение

-- в наборе данных в выбранной подсети

-- рекомендуется ипользовать на некритичных наборах данных

-- операции 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 NUMBER

IS

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 THEN

vr_dec1:='0';

END IF;

IF TO_NUMBER(vr_dec2)>255 THEN

vr_dec2:='0';

END IF;

IF TO_NUMBER(vr_dec3)>255 THEN

vr_dec3:='0';

END IF;

IF TO_NUMBER(vr_dec4)>255 THEN

vr_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;

EXCEPTION

WHEN 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

BEGIN

vr_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;

EXCEPTION

WHEN 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

BEGIN

IF 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;

EXCEPTION

WHEN 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

BEGIN

IF p_mask > 32 THEN

RAISE INVALID_NUMBER; END IF;

vr_ReturnValue := Fn_NumToIp(Fn_MasktoIPN(p_mask));

RETURN vr_ReturnValue;

EXCEPTION

WHEN 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

IS

vr_returnvalue DATE;

BEGIN

BEGIN

SELECT

NEW_TIME( TO_DATE('01011970','ddmmyyyy') + 1/24/60/60 * (p_UnixTime+cv_unixtimeoffset)

,'GMT', 'EDT' )

INTO vr_returnvalue

FROM dual;

EXCEPTION

WHEN 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 NUMBER

IS

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 NUMBER

IS

vr_returnvalue NUMBER;

BEGIN

BEGIN

SELECT BITAND(p_first, p_next)

INTO vr_returnvalue

FROM 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

IS

vr_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);

BEGIN

BEGIN

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 NUMBER

IS

vr_returnvalue NUMBER;

BEGIN

BEGIN

SELECT p_first + p_next - BITAND(p_first, p_next)

INTO vr_returnvalue FROM

dual;

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 NUMBER

IS

vr_returnvalue NUMBER;

BEGIN

BEGIN

vr_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

BEGIN

vr_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_hex

FROM 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

BEGIN

vr_hex := UPPER(p_hex);

vr_number := 0;

vr_value := LENGTH(p_hex);

WHILE (vr_value > 0)

LOOP

SELECT

DECODE(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

BEGIN

vr_number := p_dec;

vr_value := 0;

WHILE (vr_number > 0)

LOOP

vr_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

BEGIN

vr_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' THEN

vr_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

BEGIN

SELECT fn_masktoipn(p_mask)

INTO vr_masknum

FROM dual;

SELECT fn_BITAND(p_ipnum, vr_masknum)+1

INTO 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

BEGIN

SELECT 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 THEN

vr_NumMaskip := TO_NUMBER(p_MaskIp);

ELSE

vr_NumMaskip := fn_IpToNum(p_MaskIp);

END IF;

IF INSTR(p_IpNum, '.') = 0 THEN

vr_Numip := TO_NUMBER(p_IpNum);

ELSE

vr_Numip := fn_IpToNum(p_IpNum);

END IF;

IF INSTR(p_Mask, '.') = 0 THEN

IF vr_NumMask<33 THEN

vr_NumMask := TO_NUMBER(p_Mask);

ELSE

vr_NumMask := fn_IpToNum(p_Mask);

END IF;

ELSE

vr_NumMask := fn_IpToNum(p_Mask);

-- здесь надо доработать

END IF;

SELECT BITAND(vr_NumMask, vr_NumIp)

INTO vr_NumReturn

FROM dual;

vr_returnvalue := 0;

SELECT DECODE(vr_NumReturn, vr_NumMaskip, 1 , 0)

INTO vr_returnvalue

FROM 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

BEGIN

SELECT fn_MaskAddrLow(p_mask, fn_iptonum(p_maskip))

INTO vr_low FROM dual;

SELECT fn_MaskAddrHigh(p_mask, fn_iptonum(p_maskip))

INTO vr_heigh

FROM dual;

FOR vr_ipnum IN 0..vr_heigh-vr_low-1

LOOP

pipe ROW(fn_numtoip(vr_low+vr_ipnum

));

END LOOP;

RETURN;

EXCEPTION

WHEN 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;

EXCEPTION

WHEN OTHERS THEN RAISE_APPLICATION_ERROR('fn_GroupMask '||SQLERRM ,0 );

END;

END fn_GroupMask;

 

END Pkg_Networkservice ;

/

 

 

Комментарии  

  1. #2 Максим
    2011-10-1806:55:12 !!!!!!!!!!
    для корректной работы скрипта добавить!!!!
    CREATE OR REPLACE TYPE ds_ip_type as table of varchar2(50);
  2. #1 Oleg
    2011-10-1208:56:29 Привет!

    попробовал установить пэкедж из oranetwork.zip

    оказалось, что не объявлен тип ds_ip_type

    поправьте, пожалуйста.

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:


Защитный код
Обновить

След. »