【问题标题】:How to split text line by line in PL/SQL?如何在 PL/SQL 中逐行拆分文本?
【发布时间】:2016-10-07 09:27:49
【问题描述】:

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

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

它不起作用。如何做到这一点以及如何逐行拆分文本?

【问题讨论】:

  • “它不起作用”。这是否意味着 INSTR 不返回换行符的位置,或者您不确定在使用 INSTR 获取换行符的位置后如何继续?
  • 编辑您的帖子以显示一个实际的示例输入字符串,描述您将如何解析和操作并包括完成后的输出应该是什么样子。换句话说,展示更大的图景,以便更好地了解您想要实现的目标。

标签: oracle stored-procedures plsql split


【解决方案1】:

请使用以下查询,

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

【讨论】:

  • 干净简单!感谢您为我节省了重新发明轮子的时间!
  • 但是只有一行中有一个单词才有效,如果一行中有多个单词,则不起作用
【解决方案2】:

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

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

CHR(10) => LF,换行(unix)

CHR(13) => CR,回车(windows,加上换行)

你可以像这样找到第一个 LF 出现的索引:

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

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

【讨论】:

    【解决方案3】:

    你试试这个怎么样...

       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
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多