При разделении данных CLOB по разделителю возникает проблема - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь преобразовать данные BLOB-объектов в clob с помощью приведенной ниже функции, она работает нормально. но после преобразования в CLOB я хочу разделить записи на основе разделителя, который не работает.

CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB)
  RETURN CLOB
AS
     c_buffer  CONSTANT PLS_INTEGER := 32767;
     v_clob    CLOB;
     v_varchar VARCHAR2(32767);
     v_start   PLS_INTEGER := 1;
BEGIN
  DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);

  FOR i IN 1 .. CEIL( DBMS_LOB.GETLENGTH(blob_in) / c_buffer ) LOOP
    v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, c_buffer, v_start));
    DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
    v_start := v_start + c_buffer;
  END LOOP;

  RETURN v_clob;
END blob_to_clob;
/

ниже приведен пример данных CLOB, который показывает разделитель как '?' запрос

select UTL_RAW.CAST_TO_VARCHAR2(XMLRECORD) from FMKC_STMT_PRINTED where recid = '0225307596-20180923';

выход +181390444268592,000001? +181403657657150,120001? 181576596572996,090001? +181586235750048,110001? 182271815726104,190001? +182274070050018,050001? +182294213659098,050001

Но когда я попытался выполнить запрос ниже, чтобы получить только 1-е значение, он не смог разделить его на основе '?'

выберите REGEXP_SUBSTR (UTL_RAW.CAST_TO_VARCHAR2 (XMLRECORD), '[^? "] +', 1, 1) из FMKC_STMT_PRINTED, где recid = '0225307596-20180923';

Я даже попробовал функцию ниже, чтобы разделить данные CLOB

    CREATE OR REPLACE FUNCTION split_clob(
  i_str    IN  CLOB,
  i_delim  IN  VARCHAR2 DEFAULT ','
) RETURN stringlist /* or cloblist */ DETERMINISTIC PIPELINED
AS
  p_start        PLS_INTEGER := 1;
  p_end          PLS_INTEGER;
  c_len CONSTANT PLS_INTEGER := DBMS_LOB.GETLENGTH( i_str );
  c_ld  CONSTANT PLS_INTEGER := LENGTH( i_delim );
BEGIN
  IF c_len > 0 THEN
    p_end := DBMS_LOB.INSTR( i_str, i_delim, p_start );
    WHILE p_end > 0 LOOP
      PIPE ROW ( DBMS_LOB.SUBSTR( i_str, p_end - p_start, p_start ) );
      p_start := p_end + c_ld;
      p_end := DBMS_LOB.INSTR( i_str, i_delim, p_start );
    END LOOP;
    IF p_start <= c_len + 1 THEN
      PIPE ROW ( DBMS_LOB.SUBSTR( i_str, c_len - p_start + 1, p_start ) );
    END IF;
  END IF;
END;
/

но результат все тот же, он показывает мне '?' разделитель, но при использовании его в запросе

SELECT split_clob (blob_to_clob (XMLRECORD), '?') AS RECID FROM KES_STMT_PRINT_TEST t;

не работает

выход 181390444268592,000001? 181403657657150,120001? 181576596572996,090001

Ожидаемый результат +181390444268592,000001 +181403657657150,120001 +181576596572996,090001

...