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

由于项目功能有时候需从其他部门提供的Excel... 等其他文档中,往数据库表不间断的塞入一些数据, 所以就写了个简单的解析 过程 避免重复工作;
整理出来分享下


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;

你可能感兴趣的:(oracle,pl/sql)