拆分'$'分隔的字符串并插入到表中

Posted

技术标签:

【中文标题】拆分\'$\'分隔的字符串并插入到表中【英文标题】:split '$' seperated string and insert into table拆分'$'分隔的字符串并插入到表中 【发布时间】:2019-11-05 17:09:58 【问题描述】:

我有一个表员工 emp_id,emp_first_name,emp_last_name,emp_salary 字段。

我想创建一个在员工表中插入记录的过程,但在 '1$shubham$tathe$5000#2$vijaj$bakse&10000#3$ram$sharma$200' 中的过程 IN 参数中,我想将此字符串插入员工表,行由“#”分隔,列字段由“$”分隔。

emp_id   |  emp_first_name |  emp_last_name  |  emp_salary

1           shubham           tathe             5000
2           vijaj             bakse             10000
3           ram               sharma            200

create or replace procedure procedure_split
(
 In_string IN varchar
)

IS

Begin
...
...
...
END;

In_string='1$shubham$tathe$5000#2$vijaj$bakse&10000#3$ram$sharma$200'

in_string 是过程中的输入参数。

【问题讨论】:

【参考方案1】:

基本上,您不需要 PL/SQL。

表:

SQL> create table test
  2    (emp_id number,
  3     emp_first_name varchar2(20),
  4     emp_last_name  varchar2(20),
  5     emp_salary number);

Table created.

代码:

SQL> insert into test (emp_id, emp_first_name, emp_last_name, emp_salary)
  2  with
  3  data (col) as
  4    (select '1$shubham$tathe$5000#2$vijaj$bakse$10000#3$ram$sharma$200' from dual),
  5  red as
  6    (select regexp_substr(col, '[^#]+', 1, level) val,
  7            level lvl
  8     from data
  9     connect by level <= regexp_count(col, '#') + 1
 10    ),
 11  emp as
 12    (select regexp_substr(val, '\w+', 1, 1) emp_id,
 13            regexp_substr(val, '\w+', 1, 2) emp_first_name,
 14            regexp_substr(val, '\w+', 1, 3) emp_last_name,
 15            regexp_substr(val, '\w+', 1, 4) emp_salary
 16     from red
 17    )
 18  select * From emp;

3 rows created.

结果:

SQL> select * From test;

    EMP_ID EMP_FIRST_NAME       EMP_LAST_NAME        EMP_SALARY
---------- -------------------- -------------------- ----------
         1 shubham              tathe                      5000
         2 vijaj                bakse                     10000
         3 ram                  sharma                      200

SQL>

如果它必须是一个过程,也没问题。

程序:

SQL> rollback;

Rollback complete.

SQL> create or replace procedure p_test (par_col in varchar2) is
  2  begin
  3    insert into test (emp_id, emp_first_name, emp_last_name, emp_salary)
  4    with
  5    red as
  6      (select regexp_substr(par_col, '[^#]+', 1, level) val,
  7              level lvl
  8       from dual
  9       connect by level <= regexp_count(par_col, '#') + 1
 10      ),
 11    emp as
 12      (select regexp_substr(val, '\w+', 1, 1) emp_id,
 13              regexp_substr(val, '\w+', 1, 2) emp_first_name,
 14              regexp_substr(val, '\w+', 1, 3) emp_last_name,
 15              regexp_substr(val, '\w+', 1, 4) emp_salary
 16       from red
 17      )
 18    select * From emp;
 19  end;
 20  /

Procedure created.

测试:

SQL> exec p_test('1$shubham$tathe$5000#2$vijaj$bakse$10000#3$ram$sharma$200');

PL/SQL procedure successfully completed.

SQL> select * From test;

    EMP_ID EMP_FIRST_NAME       EMP_LAST_NAME        EMP_SALARY
---------- -------------------- -------------------- ----------
         1 shubham              tathe                      5000
         2 vijaj                bakse                     10000
         3 ram                  sharma                      200

SQL>

【讨论】:

以上是关于拆分'$'分隔的字符串并插入到表中的主要内容,如果未能解决你的问题,请参考以下文章

拆分字符串并循环遍历 MySql 过程中的值

获取字符串,按分隔符拆分并插入到 Oracle 中的表过程 [重复]

如何将子字符串拆分为多个块并使用 C# 将它们输入到表中?

sql server里如何将一组用逗号分隔的字符串分解并插入到另一张表中,比如:11873,27827, 也可能是好多

如何在存储过程中拆分逗号分隔的字符串?

Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中