【问题标题】:split string then insert records in a table拆分字符串然后在表中插入记录
【发布时间】:2019-10-25 04:25:49
【问题描述】:

我有一个表 emp,其中的字段是 id、name、salary、dept。 我想创建一个在该 emp 表中插入记录的过程。

在该过程中,只有一个字符串是参数。

字符串 = 1$shubham$1000$comp#2$vijay$5000$civil#33$ram$23456$mech#......

然后在 emp 表中插入记录,例如 编号 |姓名 |工资 |部门 1 个舒巴姆 1000 比赛 2 维杰 5000 民用 33 ram 23456 机甲

行由'#'分隔,任何列值都由'$'分隔,并且 如果给定的记录已经存在,则根据 emp ID 更新该记录,即 emp ID 是该表中的主键。

以下程序未向我提供正确的输出。

create or replace procedure proc_one_stack_DUP ( string_in in varchar2 )


IS 

limit_a varchar2(1000);
v_id number(10);
v_name varchar2(1000);
v_salary varchar2(1000);
v_dept varchar2(1000);

v_one  varchar2(100);

pos_id number(10);
pos_name number(10);
pos_salary number(10);
pos_dept number(10);

counter number(10);
string_1 varchar2(1000);
len_all number(10);
len_copy  number(10);
a1 number(10);
begin 


len_copy:=0;
pos_id := 1;
counter := 0;

len_all:=length(string_in);



limit_a := REGEXP_COUNT (string_in, '#');

for i in 1..limit_a
loop 


string_1 := substr(string_in,counter+1,INSTR (string_in,'#')-1);
 a1 := length(string_1);

--for k in 1..1
--loop

v_id := substr(string_1,pos_id,INSTR (string_1,'$')-1);
pos_id := length(v_id);

v_name := substr(string_1,pos_id+2,INSTR (string_1,'$',1,2)-pos_id-1-1);
pos_name := length(v_name);

v_salary := substr(string_1,pos_name+pos_id+3,INSTR (string_1,'$',1,3)-pos_name-pos_id-1-2);
pos_salary := length(v_salary);

v_dept := substr(string_1,pos_salary+pos_id+pos_name+4,INSTR (string_1,'#')-pos_name-pos_id-pos_salary-1-3); -- INSTR (string_1,'#')-1
pos_dept := length(v_dept);

insert into emp values (v_id,v_name,v_salary,v_dept);
commit;

--end loop;  

counter := counter+a1+1;

end loop;

end;

【问题讨论】:

    标签: oracle oracle11g


    【解决方案1】:

    您可以简单地使用一个选择语句,其中您的字符串必须被拆分为所需的列,如下所示:

    SQL> DROP TABLE EMP;
    
    Table dropped.
    
    SQL>
    SQL> CREATE TABLE EMP (
      2      ID       NUMBER,
      3      NAME     VARCHAR2(10),
      4      SALARY   NUMBER,
      5      DEPT     VARCHAR2(10)
      6  );
    
    Table created.
    
    SQL>
    SQL> DEFINE P_INPUT_STRING = '1$shubham$1000$comp#2$vijay$5000$civil#33$ram$23456$mech#';
    SQL>
    SQL> INSERT INTO EMP
      2      SELECT
      3          REGEXP_SUBSTR(INP, '[^$]+', 1, 1) AS ID,
      4          REGEXP_SUBSTR(INP, '[^$]+', 1, 2) AS NAME,
      5          REGEXP_SUBSTR(INP, '[^$]+', 1, 3) AS SALARY,
      6          REGEXP_SUBSTR(INP, '[^$]+', 1, 4) AS DEPT
      7      FROM
      8          (
      9              SELECT
     10                  REGEXP_SUBSTR(TRIM('#' FROM '&p_input_string'), '[^#]+', 1, LEVEL) AS INP
     11              FROM
     12                  DUAL
     13              CONNECT BY
     14                  LEVEL <= REGEXP_COUNT(TRIM('#' FROM '&p_input_string'), '#')
     15          );
    
    2 rows created.
    
    SQL>
    SQL> SELECT * FROM EMP;
    
            ID NAME           SALARY DEPT
    ---------- ---------- ---------- ----------
             1 shubham          1000 comp
             2 vijay            5000 civil
    
    SQL>
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多