当前位置:数据库 > Oracle >>

[Oracle]字符串解析生成关联数据

[Oracle]字符串解析生成关联数据
 
由于项目功能有时候需从其他部门提供的Excel... 等其他文档中,往数据库表不间断的塞入一些数据, 所以就写了个简单的解析 过程 避免重复工作; 
整理出来分享下 
 
Sql代码  
CREATE OR REPLACE PROCEDURE PRO_STR_ANALYZING_INSERT_DATA(  
                            DATA_NAMES VARCHAR2,  
                            DATA_NUMBERS VARCHAR2,  
                            REAMK VARCHAR2 DEFAULT 'PRO_CREATE') AS  
  
 -- 组编码  
 NEW_GROUP_CODE VARCHAR2(20);  
   
 --类型  
 TYPE VAR20 IS TABLE OF VARCHAR2(20);  
 --DATA(字符串过长时,需扩大字节数)  
 CNAME VARCHAR2(1024);  
 CNUMBER VARCHAR2(1024);  
   
 --初始化  
 NAMES VAR20 := VAR20();  
 NUMBERS VAR20 := VAR20();  
   
 I INTEGER DEFAULT 0;  
 DATA_LEN INTEGER DEFAULT 0;  
BEGIN  
  
   -- DATA format  
   /*CNAME := ',王佳冰,刘玉龙,王建华,';  
   CNUMBER := ',15895985619  
              ,15951902106  
              ,18951853833  
              ,';*/  
                
   CNAME := REPLACE(REPLACE(DATA_NAMES,CHR(10),''), ' ', '');  
   CNUMBER := REPLACE(REPLACE(DATA_NUMBERS,CHR(10),''), ' ', '');  
             
   --数据分割后个数  
   DATA_LEN := LENGTHB(REGEXP_REPLACE(CNUMBER, '[^,]+', ''));  
     
   --插入关联主表数据  
   NEW_GROUP_CODE := TEST_TABLE1_SEQ.NEXTVAL;  
   INSERT INTO TEST_TABLE_1(ID, CODE) VALUES(GID, NEW_GROUP_CODE);  
         
   --解析生成联系人信息  
   IF DATA_LEN < 1 THEN  
      ROLLBACK;  
      RETURN;  
   END IF;  
   LOOP  
       I := I+1;  
       EXIT WHEN I > DATA_LEN;  
       --增加集合长度  
       NAMES.EXTEND;  
       NUMBERS.EXTEND;  
         
       --SUBSTR开始位置截取对应个数字符, REPLACE 替换空格  
       NAMES(I) := SUBSTR(CNAME,INSTR(CNAME,',',1,I)+1,(INSTR(CNAME,',',1,I+1)-2) - (INSTR(CNAME,',',1,I)+1));  
                           
       NUMBERS(I) := SUBSTR(CNUMBER,INSTR(CNUMBER,',',1,I)+1,  
                                    (INSTR(CNUMBER,',',1,I+1)-2) - INSTR(CNUMBER,',',1,I)+1);  
                     
       --关联表  
       INSERT INTO TEST_TABLE_GROUP(ID,TEST_TABLE1_ID  
                                    contact_name,mobile_number)  
       VALUES (SYS_GUID(),NEW_GROUP_CODE  
               NAMES(I), NUMBERS(I));  
          
   END LOOP;   
   COMMIT;  
END;  
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,