如何在PL / SQL中逐行分割文本?

时间:2016-06-07 12:54:56

标签: oracle stored-procedures plsql split

我想实现一个过程,该过程采用由多行组成的字符串。我想逐行拆分字符串。然后我想解析和操纵字符串。我没有为此找到内置方法。我试图找到\ n字符的索引,但它没有用。我的代码如下所示:

create or replace
PROCEDURE VFROLLOUT_MULTIPLE(test_var VARCHAR2) AS
BEGIN
  dbms_output.put_line(INSTR('test1
  test2
  test3
  ', '\n'));
  commit;
END ;

它不起作用。怎么做以及如何逐行分割文本?

3 个答案:

答案 0 :(得分:2)

请使用以下查询,

SELECT regexp_substr( 'test1  
test2  
test3  
','[[:alnum:]]+',1,level) Result FROM dual connect by level<= regexp_count('test1  
test2  
test3  
',chr(10));

答案 1 :(得分:1)

CHR()函数可能对您有所帮助。

请记住,不同的平台需要不同的换行符:

CHR(10)=&gt; LF,换行(unix)

CHR(13)=&gt; CR,回车(窗口,与换行一起)

您可以找到第一个LF出现的索引,如下所示:

BEGIN
  dbms_output.put_line(instr('test1
  test2
  test3
  '
                            ,chr(10)
                            ,1));
END;

此外,您可以用逗号替换新行并使用/调整此处讨论的一些技巧:Convert comma separated string to array in PL/SQL

答案 2 :(得分:0)

你怎么试试这个...

   Create or replace PROCEDURE VFROLLOUT_MULTIPLE(test_var VARCHAR2 ) 
            AS
            NEW_TEST_VAR VARCHAR2(2000);
            OUT_TEST_VAR VARCHAR2(2000);
            STRING1 VARCHAR2(2000);
            STRING2 VARCHAR2(2000);
            STRING3 VARCHAR2(2000);
         BEGIN 
            SELECT REGEXP_REPLACE(TEST_VAR,'[[:space:]]+',',') INTO NEW_TEST_VAR
                       FROM DUAL; --Replaces the line breaks/spaces with a delimeter
            SELECT 
                    SUBSTR(NEW_TEST_VAR,1,INSTR(NEW_TEST_VAR,',')-1)    AS  STRING1,
                    SUBSTR(NEW_TEST_VAR,INSTR(NEW_TEST_VAR,',',1,1)+1,
                      ( (INSTR(NEW_TEST_VAR,',',1,2)+1)
                       -INSTR(NEW_TEST_VAR,',',1,1)-1 ) -1)   AS STRING2 ,
                    SUBSTR( NEW_TEST_VAR,INSTR(NEW_TEST_VAR,',',1,2)+1 )  AS STRING3
                    INTO STRING1,STRING2,STRING3
            FROM DUAL ; -- Using the delimeter the string is splitted
            DBMS_OUTPUT.PUT_LINE('First Part   : ' || STRING1);
            DBMS_OUTPUT.PUT_LINE('Second Part  : ' || STRING2);
            DBMS_OUTPUT.PUT_LINE('Third Part   : ' || STRING3);  
             --you can perform manipulations using these variables
            OUT_TEST_VAR := STRING1 ||  ' ' || STRING2 || ' ' || STRING3 ;
            DBMS_OUTPUT.PUT_LINE('Full String  : ' || OUT_TEST_VAR );
            END;

--Executing procedure

Output