表名:psr_info
涉及字段名: psr_ics(编号), chnname(中文名) sfzh(身份证号)
编号有重复,中文名有重复,身份证号唯一
Psr_ics chnname sfzh
3q587 小张 101100198201020987
3q587 老李 409087197603049876
4d365 老李 409087197603049876
9yedu 小王 230908199301025678
7uiop 小王 230908199301025678
9yedu 孙二 436765195609250099
8rtyu 赵六 234567197603089076例如:
给出“小张”“101100198201020987”查询处表中所有chnname和sfzh相符合的记录,
然后读出他们的psr_ics编号,
然后读出所有这些psr_ics编号里面的chnname和sfzh记录,
在根据读出来chnname和sfzh信息,
读出相应的psr_ics编号,
再根据读出的编号来查找相应的chnname和sfzh信息
…………
其中,如果一个psr_ics编号读出来的人员信息超过10条,并且chnname字段长度小于4个汉字,则该记录忽略不计。最终,就是得到所有根据给出的一个人为出发点查找到的所有数据
涉及字段名: psr_ics(编号), chnname(中文名) sfzh(身份证号)
编号有重复,中文名有重复,身份证号唯一
Psr_ics chnname sfzh
3q587 小张 101100198201020987
3q587 老李 409087197603049876
4d365 老李 409087197603049876
9yedu 小王 230908199301025678
7uiop 小王 230908199301025678
9yedu 孙二 436765195609250099
8rtyu 赵六 234567197603089076例如:
给出“小张”“101100198201020987”查询处表中所有chnname和sfzh相符合的记录,
然后读出他们的psr_ics编号,
然后读出所有这些psr_ics编号里面的chnname和sfzh记录,
在根据读出来chnname和sfzh信息,
读出相应的psr_ics编号,
再根据读出的编号来查找相应的chnname和sfzh信息
…………
其中,如果一个psr_ics编号读出来的人员信息超过10条,并且chnname字段长度小于4个汉字,则该记录忽略不计。最终,就是得到所有根据给出的一个人为出发点查找到的所有数据
应该可以实现的
1,因为身份证号唯一,所以在取身份证号和中文名时,我只取了身份证号!
2,我返回的是包括所有身份证号的字符串,如果需要数据集可以再做一次查询既可!
3,我这个是再pl/sql下写的!
type t_string_array is table of varchar2(4000) index by binary_integer; --该函数是被调用得函数用来把数组转换为字符串
function get_string(
a_strings pkg_lebut_commons.t_string_array,
a_separator varchar2,
a_ varchar2
) return varchar2 is
v_result varchar(4000);
v_index binary_integer;
begin
if a_strings.count > 0 then
for v_index in a_strings.first..a_strings.last loop
if v_index > a_strings.first then
v_result := v_result||a_separator;
end if;
v_result := v_result||a_||a_strings(v_index)||a_;
end loop;
end if;
return v_result;
end get_string;
--实现函数
get_id_card(a_id_card int, a_id_card out varchar2) is
v_psr_arr t_string_array;--编号数组
v_id_card_arr t_string_array;--身份数组
v_count number;--记录信息数量
begin
v_sign = true;
select
distinct
psr_ics
bulk collect into
v_psr_arr
from
psr_info
where
sfzh = a_id_card;
select
sfzh
bulk collect into
v_id_card_arr
from
psr_info
where
psr_ics in get_string(v_psr_arr, ',', '''');
v_count := 1;
while v_count <> v_id_card_arr.count
loop
v_count := v_id_card_arr.count;
select
distinct
psr_ics
bulk collect into
v_psr_arr
from
psr_info
where
sfzh in get_string(v_id_card_arr, ',', '''');
select
sfzh
bulk collect into
v_id_card_arr
from
psr_info
where
psr_ics in get_string(v_psr_arr, ',', '''');
end loop;
a_id_card := get_string(v_id_card_arr, ',', '''');
end get_id_card;
2、最终,就是得到所有根据给出的一个人(这里是一个人的什么信息阿?编号、中文名、还是sfzh???)为出发点查找到的所有数据
2、在VB中调用这个存储过程;在程序中应用递归也可以
3、在中间表中去相应的数据
4. 清空结果表
create table temp_psr_info;create or replace serchman(vchnname in varchar2 ,vsfzh in varchar2) as
flag number(5);
v_chnname varchar2(255);
v_sfzh varchar2(30);begin
select count(*) into flag from psr_info where psr_ics in(select psr_ics where chnname=vchnname and sfzh=vsfzh);
if flag>0 then
insert into temp_psr_info as select * from psr_info where psr_ics in(select psr_ics where chnname=vchnname and sfzh=vsfzh) and length(chnname)>8;
v_chnname:=vchnname;
v_sfzh:=vsfzh;
for r in select * from psr_info where psr_ics in(select psr_ics where
chnname=v_chnname and sfzh=v_sfzh) and length(chnname)>8
loop
begin
v_chnname:=r.chnname;
v_sfzh:=r.sfzh;
serchman(v_chnname,v_sfzh);
end;
end loop;
end if;
end serchman;