功能:通过Hash运算散列表的思想来进行两个字符串的匹配
思想:先把字符串l_a和l_b平均的分布在数组中,然后对两个数组各部分进行循环匹配。分布的
范围可以自己定义。
/********************************************
找出字符串l_b中字母在字符串l_a中存在的字母
**********************************************/
DECLARE
l_a Varchar2(50) := 'ADEFGHIKX';
l_b VARCHAR2(50) := 'EDGLKJOS';
l_length NUMBER;
l_length2 NUMBER;
TYPE var_rec IS RECORD
(
num_a NUMBER,
var_c VARCHAR2(1)
);
TYPE var_rec_table IS TABLE OF var_rec INDEX BY BINARY_INTEGER;
var_rec_tmp var_rec_table;
TYPE var_a IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
vara var_a;
varb var_a;
TYPE l_num_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
l_numa l_num_table;
l_numb l_num_table;
v VARCHAR2(1);
l_count NUMBER;
BEGIN
l_length := LENGTH(l_a);
l_length2 := LENGTH(l_b);
l_count := 0;
l_numa(1) := 1;
l_numa(2):= 7;
l_numa(3) := 13;
l_numa(4) := 19;
l_numa(5) := 25;
l_numb(1) := 1;
l_numb(2) := 7;
l_numb(3) := 13;
l_numb(4) := 19;
l_numb(5):= 25;
var_rec_tmp(1).num_a := 1;
var_rec_tmp(2).num_a := 7;
var_rec_tmp(3).num_a := 13;
var_rec_tmp(4).num_a := 19;
var_rec_tmp(5).num_a := 25;
var_rec_tmp(1).var_c := 'A';
var_rec_tmp(2).var_c := 'G';
var_rec_tmp(3).var_c := 'M';
var_rec_tmp(4).var_c := 'S';
var_rec_tmp(5).var_c := 'Y';
--把字符串l_a按照散列的形式存储在数组vara中
dbms_output.put_line('l_a:');
FOR i IN 1..l_length LOOP
v := SUBSTRB(l_a,1,1);
l_a := SUBSTRB(l_a,2,l_length);
<>
FOR i IN 1..5 LOOP
IF v < var_rec_tmp(i).var_c THEN
vara(l_numa(i-1)) := v;
l_numa(i-1):= l_numa(i-1) + 1;
dbms_output.put(v || ' ');
EXIT l_inner;
END IF;
END LOOP l_inner;
END LOOP;
dbms_output.put_line('');
--把数组l_b按照散列的形式存放在数组varb中
dbms_output.put_line('l_b:');
FOR i IN 1..l_length2 LOOP
v := SUBSTRB(l_b,1,1);
l_b := SUBSTRB(l_b,2,l_length);
<>
FOR i IN 1..5 LOOP
IF v < var_rec_tmp(i).var_c THEN
varb(l_numb(i-1)) := v;
l_numb(i-1):= l_numb(i-1) + 1;
dbms_output.put(v || ' ');
EXIT l_inner;
END IF;
END LOOP l_inner;
END LOOP;
--分别对各部分进行双重循环查询字符串l_b在l_a中存在的字母
dbms_output.put_line('');
FOR i IN 1..5 LOOP
FOR j IN var_rec_tmp(i).num_a..l_numb(i)-1 LOOP
FOR k IN var_rec_tmp(i).num_a..l_numa(i)-1 LOOP
l_count := l_count + 1;
IF varb(j) = vara(k) THEN
dbms_output.put(varb(j)|| ' ');
END IF;
END LOOP;
END LOOP;
END LOOP;
dbms_output.put_line(l_count);
END;
思想:先把字符串l_a和l_b平均的分布在数组中,然后对两个数组各部分进行循环匹配。分布的
范围可以自己定义。
/********************************************
找出字符串l_b中字母在字符串l_a中存在的字母
**********************************************/
DECLARE
l_a Varchar2(50) := 'ADEFGHIKX';
l_b VARCHAR2(50) := 'EDGLKJOS';
l_length NUMBER;
l_length2 NUMBER;
TYPE var_rec IS RECORD
(
num_a NUMBER,
var_c VARCHAR2(1)
);
TYPE var_rec_table IS TABLE OF var_rec INDEX BY BINARY_INTEGER;
var_rec_tmp var_rec_table;
TYPE var_a IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
vara var_a;
varb var_a;
TYPE l_num_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
l_numa l_num_table;
l_numb l_num_table;
v VARCHAR2(1);
l_count NUMBER;
BEGIN
l_length := LENGTH(l_a);
l_length2 := LENGTH(l_b);
l_count := 0;
l_numa(1) := 1;
l_numa(2):= 7;
l_numa(3) := 13;
l_numa(4) := 19;
l_numa(5) := 25;
l_numb(1) := 1;
l_numb(2) := 7;
l_numb(3) := 13;
l_numb(4) := 19;
l_numb(5):= 25;
var_rec_tmp(1).num_a := 1;
var_rec_tmp(2).num_a := 7;
var_rec_tmp(3).num_a := 13;
var_rec_tmp(4).num_a := 19;
var_rec_tmp(5).num_a := 25;
var_rec_tmp(1).var_c := 'A';
var_rec_tmp(2).var_c := 'G';
var_rec_tmp(3).var_c := 'M';
var_rec_tmp(4).var_c := 'S';
var_rec_tmp(5).var_c := 'Y';
--把字符串l_a按照散列的形式存储在数组vara中
dbms_output.put_line('l_a:');
FOR i IN 1..l_length LOOP
v := SUBSTRB(l_a,1,1);
l_a := SUBSTRB(l_a,2,l_length);
<>
FOR i IN 1..5 LOOP
IF v < var_rec_tmp(i).var_c THEN
vara(l_numa(i-1)) := v;
l_numa(i-1):= l_numa(i-1) + 1;
dbms_output.put(v || ' ');
EXIT l_inner;
END IF;
END LOOP l_inner;
END LOOP;
dbms_output.put_line('');
--把数组l_b按照散列的形式存放在数组varb中
dbms_output.put_line('l_b:');
FOR i IN 1..l_length2 LOOP
v := SUBSTRB(l_b,1,1);
l_b := SUBSTRB(l_b,2,l_length);
<>
FOR i IN 1..5 LOOP
IF v < var_rec_tmp(i).var_c THEN
varb(l_numb(i-1)) := v;
l_numb(i-1):= l_numb(i-1) + 1;
dbms_output.put(v || ' ');
EXIT l_inner;
END IF;
END LOOP l_inner;
END LOOP;
--分别对各部分进行双重循环查询字符串l_b在l_a中存在的字母
dbms_output.put_line('');
FOR i IN 1..5 LOOP
FOR j IN var_rec_tmp(i).num_a..l_numb(i)-1 LOOP
FOR k IN var_rec_tmp(i).num_a..l_numa(i)-1 LOOP
l_count := l_count + 1;
IF varb(j) = vara(k) THEN
dbms_output.put(varb(j)|| ' ');
END IF;
END LOOP;
END LOOP;
END LOOP;
dbms_output.put_line(l_count);
END;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28268054/viewspace-1075793/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28268054/viewspace-1075793/