字符串拆分为CLOB值,并在特定位置之后插入拆分字符串作为新行

时间:2016-03-11 02:31:10

标签: sql database oracle plsql split

我有一个字符串,其中有几个句子由';'分隔。 我需要一个解决方案将字符串拆分成单独的行并将它们插入另一个表中。

分割字符串的条件应如下:

  

字符串长度最多可容纳699个字符,并以最近的'结尾;'因为这标志着声明的结束,我们不希望它在中途结束。

例如:如果我们有一个字符串,如" abcdefg; thjiksfg; a;" 我们希望我们的字符串长度最多为12个字符串 然后,拆分和处理后得到的行应该具有类似

的值
row1:abcdefg; 
row2:thjiksfg;a; 

请建议我如何使用pl / sql程序来完成。

当前字符串作为CLOB值存储在表中,因为它可以容纳多达7000/8000个字符。

非常感谢任何有关此事的帮助。

2 个答案:

答案 0 :(得分:0)

请尝试以下程序。在内部过程中,我将clob数据转换为v_text。根据您的要求,您可以将clob数据作为变量传递给过程。

   `PROCEDURE proc_split_str --(ur_clob_data IN CLOB)
     AS
    v_text_full CLOB;
    length_of_str PLS_INTEGER:=1;
    v_text CLOB;
    v_text_temp1 CLOB;
    v_text_temp CLOB;
    position PLS_INTEGER:=1;

    BEGIN
      /*getting data from table to v_text*/
        SELECT ur_colm_clob 
          INTO v_text
          FROM ur_table;

        WHILE(length_of_str>0)LOOP


         v_text_temp1:= SUBSTR(v_text_full,1,699);

         v_text_temp:= v_text_temp1;

             v_text_full:=SUBSTR(v_text_full,LENGTH(v_text_temp1)+1,LENGTH(v_text_full)-LENGTH(v_text_temp1));

          length_of_str:=  LENGTH(v_text_full);


        WHILE (position>0) LOOP

          /*splitting clob data and stored in v_text*/
            position   :=INSTR(v_text_temp,';',1);

             IF position >0 THEN
                v_text:=SUBSTR(v_text_temp,1,position-1);
                    v_text_temp:=SUBSTR(v_text_temp,length(v_text)+2,length(v_text_temp)-length(v_text)-1);
             ELSIF position=0 THEN
                v_text      :=v_text_temp;
                v_text_temp :=null;
             END IF;

             INSERT INTO ur_new_table(ur_column)
             VALUES (v_text);


        END LOOP;

   END LOOP;

END;
/`

答案 1 :(得分:0)

我可以使用以下示例代码在SQL SERVER中使用它,在此示例中使用最大允许长度为15。 (不是一个很好的代码,只是为了证明这个想法!)

这个想法是 *用半冒号分割字符串 *保持连接分割值,直到它们达到最大允许长度
*插入目的地表

Declare @sentences varchar(max) = 'hi;hey buddy;how are you;see you again;bye;';
SELECT splitdata 
INTO #TempTable 
FROM dbo.fnSplitString(@sentences,';') --function to spit string into rows

DECLARE @tempSentence VARCHAR(MAX) = ''
DECLARE @tempBackup VARCHAR(MAX) = ''
DECLARE @current VARCHAR(MAX) = ''
WHILE EXISTS (select splitdata from #TempTable)
BEGIN
    SET @tempBackup = @tempSentence;
    SET @current = (SELECT TOP 1 splitdata FROM #TempTable) + ';'
    SET @tempSentence = @tempSentence + @current;
    IF LEN(@tempSentence) > 15
    BEGIN
        --BMS_OUTPUT.PUT_LINE('Sentence = ' || @tempBackup);
        INSERT INTO dbo.MySentences VALUES(@tempBackup)
        SET @tempBackup = '';
        SET @tempSentence = @current;
    END
    DELETE TOP (1) FROM #TempTable
END
INSERT INTO dbo.MySentences VALUES(@tempSentence)
DROP TABLE #TempTable

结果:
enter image description here

我不了解Oracle,但您可以尝试类似(修复语法)

DECLARE @tempSentence VARCHAR(MAX)
DECLARE @tempBackup VARCHAR(MAX)
BEGIN --split code from > https://lalitkumarb.com/2014/12/02/split-comma-delimited-string-into-rows-in-oracle/
  FOR str IN (
        WITH DATA AS (
        SELECT 'sentence1;sentence2;sentence3;sentence4;' str FROM dual --table here
    )
    SELECT trim(regexp_substr(str, '[^;]+', 1, LEVEL)) str
    FROM DATA
    CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0
  )
  LOOP
    @tempBackup = @tempSentence;
    @tempSentence = @tempSentence || str || ';';
    IF LENGTH(@tempSentence) > 699 THEN
        BMS_OUTPUT.PUT_LINE('Sentence = ' || @tempBackup);
        --insert @tempBackup to your table
        @tempBackup = '';
        @tempSentence = str || ';';
    END IF;
  END LOOP;
  BMS_OUTPUT.PUT_LINE('Last Sentence = ' || @tempSentence);
  --insert @tempSentence to your table
END;