Я пытаюсь преобразовать данные 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