假设表名:ipList,ip字段为ip_long用户输入的ip段(数字ip)0.0.0.0到255.255.255.255,权限要求他只能查看2046820352 and 2097151999,3523215361 and 3556769791,385875969 and 855638015
这些ip段之间的记录,ip段转换前字符串形式如下122.0.0.0
124.255.255.255
210.0.0.1
211.255.255.255
23.0.0.1
50.255.255.255假设表名:ipList,ip字段:ip_long小弟是做程序的,请问这样的sql语句应该怎么写?谢谢
这些ip段之间的记录,ip段转换前字符串形式如下122.0.0.0
124.255.255.255
210.0.0.1
211.255.255.255
23.0.0.1
50.255.255.255假设表名:ipList,ip字段:ip_long小弟是做程序的,请问这样的sql语句应该怎么写?谢谢
解决方案 »
- oracle创建触发器 Warning: Trigger created with compilation errors
- Oracle 调用store procedre的问题
- 如何将下面的JSP调用ORACLE存储过程修改为ASP啊?
- 找出两个表中差异的记录。
- 散 50分 解决最后一个rman恢复的问题!
- 日期转换问题
- TIME ZONE和SYSDATE的关系!
- 求教“从ORACLE的已有数据库导出含所有DDL的SQL语句文件”,请各位大虾帮忙。
- 急救:游标里的sql语句是动态的该怎么办???
- 在OEM 中如何建立DBLINK
- !!!!哪位高手能帮忙解下这两道Oracle题,
- Oracle 无法解析指定的对象标识符?
SQL> SELECT * FROM IP_LIST;IP_LONG
---------------
255.255.255.255
0.0.0.100
100.0.1.1
100.0.0.1
10.23.34.277
0.0.0.16 rows selectedSQL> SELECT * FROM USER_IPS; USERID MIN_IP MAX_IP
---------- ------- ---------
1 0.0.0.0 100.0.0.0SQL> SELECT DISTINCT IP_LONG
2 FROM (SELECT RN1,
3 TO_NUMBER(REPLACE(WMSYS.WM_CONCAT(NEW_IP_LONG)
4 OVER(PARTITION BY RN1),
5 ',',
6 '')) NEW_IP_LONG,
7 IP_LONG
8 FROM (SELECT RN1,
9 LPAD(SUBSTR('.' || IP_LONG || '.',
10 INSTR('.' || IP_LONG || '.', '.', 1, RN2) + 1,
11 INSTR('.' || IP_LONG || '.',
12 '.',
13 1,
14 RN2 + 1) -
15 INSTR('.' || IP_LONG || '.', '.', 1, RN2) - 1),
16 3,
17 '0') NEW_IP_LONG,
18 IP_LONG
19 FROM (SELECT ROWNUM RN1, TT.*
20 FROM IP_LIST TT) YY,
21 (SELECT ROWNUM RN2 FROM DUAL CONNECT BY ROWNUM <= 3) ZZ
22 WHERE INSTR('.' || IP_LONG || '.', '.', 1, RN2) > 0
23 ORDER BY RN1, RN2) SS) T1,
24 (SELECT RN1,
25 TO_NUMBER(REPLACE(WMSYS.WM_CONCAT(MIN_IP), ',', '')) MIN_IP,
26 TO_NUMBER(REPLACE(WMSYS.WM_CONCAT(MAX_IP), ',', '')) MAX_IP
27 FROM (SELECT USERID RN1,
28 LPAD(SUBSTR('.' || MIN_IP || '.',
29 INSTR('.' || MIN_IP || '.', '.', 1, RN2) + 1,
30 INSTR('.' || MIN_IP || '.', '.', 1, RN2 + 1) -
31 INSTR('.' || MIN_IP || '.', '.', 1, RN2) - 1),
32 3,
33 '0') MIN_IP,
34 LPAD(SUBSTR('.' || MAX_IP || '.',
35 INSTR('.' || MAX_IP || '.', '.', 1, RN2) + 1,
36 INSTR('.' || MAX_IP || '.', '.', 1, RN2 + 1) -
37 INSTR('.' || MAX_IP || '.', '.', 1, RN2) - 1),
38 3,
39 '0') MAX_IP
40 FROM USER_IPS UT,
41 (SELECT ROWNUM RN2 FROM DUAL CONNECT BY ROWNUM <= 3) ZZ
42 WHERE INSTR('.' || MIN_IP || '.', '.', 1, RN2) > 0
43 ORDER BY USERID, RN2) SS
44 GROUP BY RN1) T2
45 WHERE NEW_IP_LONG BETWEEN MIN_IP AND MAX_IP;IP_LONG
---------------
0.0.0.1
0.0.0.100
10.23.34.277
第一是把像192.168.1.1转换成数字
CREATE OR REPLACE FUNCTION sf_ip2num (in_ip VARCHAR)
RETURN NUMBER
IS
tmpvar NUMBER;
/******************************************************************************
NAME: SF_IP2NUM
PURPOSE: REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2008/8/28 He Bo 1. Created this function. NOTES: Automatically available Auto Replace Keywords:
Object Name: SF_IP2NUM
Sysdate: 2008/8/28
Date and Time: 2008/8/28, 11:59:28, and 2008/8/28 11:59:28
Author: He Bo
Table Name: (set in the "New PL/SQL Object" dialog)******************************************************************************/
BEGIN
tmpvar := 0; SELECT TO_NUMBER ( SUBSTR (in_ip, 1, INSTR (in_ip, '.', 1) - 1)
* 255
* 255
* 255
)
+ TO_NUMBER (SUBSTR (in_ip,
INSTR (in_ip, '.', 1) + 1,
INSTR (in_ip, '.', 1, 2)
- INSTR (in_ip, '.', 1)
- 1
)
)
* 255
* 255
+ TO_NUMBER (SUBSTR (in_ip,
INSTR (in_ip, '.', 1, 2) + 1,
INSTR (in_ip, '.', 1, 3)
- INSTR (in_ip, '.', 1, 2)
)
)
* 255
+ TO_NUMBER (SUBSTR (in_ip, INSTR (in_ip, '.', 1, 3) + 1))
INTO tmpvar
FROM DUAL; RETURN tmpvar;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN 0;
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
RETURN 0;
END sf_ip2num;
/第二个是查找IP所属位置CREATE OR REPLACE FUNCTION sf_get_ip_loc (in_ip VARCHAR2)
RETURN VARCHAR2
IS
tmpvar VARCHAR2(500);
/******************************************************************************
NAME: SF_GET_IP_LOC
PURPOSE: REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 2008/8/28 He Bo 1. Created this function. NOTES: Automatically available Auto Replace Keywords:
Object Name: SF_GET_IP_LOC
Sysdate: 2008/8/28
Date and Time: 2008/8/28, 12:57:40, and 2008/8/28 12:57:40
Author: He Bo
Table Name: (set in the "New PL/SQL Object" dialog)******************************************************************************/
BEGIN
SELECT country || '-' ||local
INTO tmpvar
FROM tb_ipdata
WHERE sf_ip2num (in_ip) BETWEEN start_ip_num AND end_ip_num AND ROWNUM = 1; RETURN tmpvar;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN '未知地点';
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
RETURN '查找IP地点异常错误';
END sf_get_ip_loc;
/
where to_number(substr(ip_long,1,instr(ip_long,'.')-1)) between 1 and 99
CREATE OR REPLACE FUNCTION ConvertIP(p_IP VARCHAR2) RETURN VARCHAR2 DETERMINISTIC IS
BEGIN
RETURN regexp_replace('00' || REPLACE(p_IP, '.', '.00'), '\d+(\d{3})', '\1');
END;
/SELECT * FROM ipList WHERE ConvertIP(IP_Long) BETWEEN ConvertIP('0.0.0.0') AND ConvertIP('100.0.0.0');