将字符串拆分为多行,包含多列

时间:2015-02-27 14:09:50

标签: oracle insert string regex

我有一个包含用户信息的字符串。我必须编写一个函数,它将字符串作为输入并插入到某个表中。

输入字符串包含多行,其中包含多个列,如下所示:

inputString= "1,cassey,1222,12-12-12:2,timon,,02-02-12:3,john,3333,03-03-12"

我想要的是从这个创建插入......

如何实现?

2 个答案:

答案 0 :(得分:1)

单个Query中的解决方案如下: 但我更换了' ,,'用' NULL'

inputString= "1,cassey,1222,12-12-12:2,timon,NULL,02-02-12:3,john,3333,03-03-12"

                SELECT REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 1) AS Col1,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 2) AS Col2,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 3) AS Col3,
                       REGEXP_SUBSTR (REGEXP_SUBSTR (inputString, '[^:]+', 1, LEVEL), '[^,]+', 1, 4) AS Col4
                  FROM DUAL 
            CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (inputString, '[^:]+')) + 1;

结果:

Col1    Col2    Col3    Col4
------  ------  ------  ------
1       cassey  1222    12-12-12
2       timon   NULL    02-02-12
3       john    3333    03-03-12


3 rows selected.

答案 1 :(得分:0)

包装规格:

创建或替换包String_conversion AS

TYPE string_test_tab IS TABLE OF VARCHAR2(2000);

TAB string_test_tab;

PROCEDURE string_convert(v_input IN VARCHAR2,v_output OUT string_test_tab);

END string_conversion;

/

包裹体:

创建或替换包裹物体string_conversion AS

PROCEDURE string_convert(v_input IN VARCHAR2,v_output OUT string_test_tab)IS

v_index NUMBER := 1;

v_index_comma NUMBER := 1;

TAB2 string_test_tab;

v_input_str VARCHAR2(2000):= v_input||',';

BEGIN

v_output := string_test_tab();

LOOP

  v_index_comma := INSTR (v_input_str, ',',v_index);

  EXIT WHEN v_index_comma = 0;

  v_output.extend();

  v_output(v_output.count):= SUBSTR(v_input_str, v_index, v_index_comma - v_index);

  dbms_output.put_line(v_output(v_output.count));

  v_index := v_index_comma + 1; 

END LOOP;

END string_convert;

END string_conversion;

/

测试:

DECLARE

v_out1 string_conversion.string_test_tab;

BEGIN

string_conversion.string_convert(&#39; A,B,C,d,E&#39;,V_OUT1);

FOR j IN v_out1.FIRST .. v_out1.LAST

LOOP

  dbms_output.put_line(v_out1(j));

END LOOP;

END; /

输出:

B'/ P>

C

d

ë