表名: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个汉字,则该记录忽略不计。最终,就是得到所有根据给出的一个人为出发点查找到的所有数据

解决方案 »

  1.   

    搂住的意思是,给出一个人的Psr_ics、chnname、sfzh,枚举所有包含任意字段的相关的记录。
    应该可以实现的
      

  2.   

    我写了一个,你看是否用的着!说明一下:
    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;
      

  3.   

    题目有两点不清楚:1、给出“小张”“101100198201020987”查询处表中所有chnname和sfzh相符合的记录(sfzh既然是唯一的,给出一个sfzh号应该对应唯一一条数据阿?)
    2、最终,就是得到所有根据给出的一个人(这里是一个人的什么信息阿?编号、中文名、还是sfzh???)为出发点查找到的所有数据
      

  4.   

    加一个变量,然后把select改一下也就可以了
      

  5.   

    1.写一个存储过程;其间建立一个中间表或者物化试图存储结果列表,结构与PSR_INFO一致
    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;
      

  6.   

    在END IF 后面加个COMMIT。写漏了