DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

PLSQL пакет для работы с сетью

PLSQL Пакет с сервисными функциями для  работы с сетевыми протоколами , преобразования , маски , сети , различные системы счисления , выборки ....
ВНИМАНИЕ!!!! для корректной работы скрипта необходимо сначала создать тип!!!!
CREATE OR REPLACE TYPE ds_ip_type as table of varchar2(50);
 
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 ;
/
 







jAntivirus
 


Продажа плитки тротуарной в срок. Тротуарная плитка продажа через час. . При покупке, книга в подарок - книжный магазин. Работа в Москве, вакансии. . купить диплом в орле