有一张idd表  有2个字段  DZXZ 存储地址    AIDEDIDD 存储地址编码现在表中DZXZ 字段值都存在  现在需要实现的是
根据dzxz字段的地址  生成    在AIDEDIDD字段中生成地址代码                 
地址有以下四种情况
一:石门一路
二:石门一路336弄
三:石门一路114号
四:石门一路336弄17号其中有D_LM字典表  根据***路可以在字典表中查出相应的代码(6位)
假如查出“石门一路”的代码为“000001”
以上四种情况分别生成的AIDEDIDD为:
一:00000100000000    只有**路的取出路的代码+0000+0000(要保证弄和号的代码为4位数)
二:00000103360000    有路和弄的  取出路的代码 + 弄号+号的代码(要保证弄和号的代码为4位数 不足4位 在前面补0)
三:00000100000114    有路和号的  取出路的代码 + 弄号+号的代码(要保证弄和号的代码为4位数 不足4位 在前面补0)
四:00000103360017    有路,弄和号的  取出路的代码 + 弄号+号的代码(要保证弄和号的代码为4位数 不足4位 在前面补0)
求一个存储过程  小弟谢过啦

解决方案 »

  1.   

    这样设计会有问题吧,最好新增一个address表,
    可以有省,市,路,弄,号等字段,
    界面地址输入的时候也让分别输,这样就比较好取了。
    否则没法取的
      

  2.   

    CREATE OR REPLACE FUNCTION codebyaddr(straddr varchar2) RETURN varchar2
    IS
       strtmpaddr varchar2(100) ;
       strjie varchar2(20) := '' ;
       strlong varchar2(20) := '' ;
       strhao varchar2(20) := '' ;
       strjiecode varchar2(6) := '000000' ;
       strlongcode varchar2(4) := '0000' ;
       strhaocode varchar2(4) := '0000' ;
       intnum int;
    BEGIN
       intnum := instr(straddr,'路');
       IF intnum = 0 
       THEN
          RETURN strjiecode || strlongcode  || strhaocode ;
       END IF;   strjie := substr(straddr,1,intnum);
       strtmpaddr := substr(straddr,intnum+1,length(straddr));
       BEGIN 
          SELECT lpad(AIDEDIDD,6,'0') INTO strjiecode FROM IDD WHERE dzxz = strjie ;
       EXCEPTION
          WHEN NO_DATA_FOUND THEN 
             strjiecode := '000000' ;
       END;   intnum := instr(strtmpaddr,'弄');
       IF intnum > 0
       THEN
          strlongcode :=  lpad( substr(strtmpaddr,1,intnum-1),4,'0');
          strtmpaddr := substr(strtmpaddr,intnum+1,length(strtmpaddr));
       ELSE 
          strlongcode := '0000' ;
       END IF;   intnum := instr(strtmpaddr,'号');
       IF intnum > 0
       THEN
          strhaocode :=  lpad(substr(strtmpaddr,1,intnum-1),4,'0');
       END IF;   RETURN strjiecode || strlongcode  || strhaocode ;END codebyaddr ;测试结果:1. select codebyaddr('石门一路') from dual;
    CODEBYADDR('石门一路')
    -------------------------------
    000001000000002. select codebyaddr('石门一路315弄') from dual;CODEBYADDR('石门一路315弄')
    -------------------------------
    000001031500003. select codebyaddr('石门一路114号') from dual;
    CODEBYADDR('石门一路114号')
    -------------------------------
    000001000001144. select codebyaddr('石1门一路123弄456号') from dual;
    CODEBYADDR('石1门一路123弄456号')
    -------------------------------
    00000001230456