Way 1
-- ^ value delimiter
DECLARE
temp_attr_ VARCHAR2(32000);
CURSOR get_splitted_values IS
SELECT REGEXP_SUBSTR(temp_attr_, '[^^]+', 1, LEVEL) AS split_value
FROM DUAL
CONNECT BY REGEXP_SUBSTR(temp_attr_, '[^^]+', 1, LEVEL) IS NOT NULL;
BEGIN
temp_attr_ := 'value1^value2^value3^value4^value5^value6^value7^value8^';
FOR rec_ IN get_splitted_values LOOP
Dbms_Output.Put_Line(rec_.split_value);
END LOOP;
END;
Way 2
DECLARE
attr_ VARCHAR2(32000);
rec_delim_ VARCHAR2(100);
rec_count_ NUMBER;
temp_rec_ VARCHAR2(32000);
value_delim_ VARCHAR2(100);
value_count_ NUMBER;
temp_value_ VARCHAR2(32000);
BEGIN
rec_delim_ := '[^;]+'; -- ; record delimiter
value_delim_ := '[^^]+'; -- ^ value delimiter
attr_ := '123^AAA^;108242-5^BBB^;01-HH-105^CCC^;456^DDD^;';
rec_count_ := REGEXP_COUNT(attr_, rec_delim_);
FOR k_ IN 1..rec_count_ LOOP
Dbms_Output.Put_Line('record: ' || k_);
temp_rec_ := REGEXP_SUBSTR(attr_, rec_delim_, 1, k_);
value_count_ := REGEXP_COUNT(temp_rec_, value_delim_);
FOR j_ IN 1..value_count_ LOOP
temp_value_ := REGEXP_SUBSTR(temp_rec_, value_delim_, 1, j_);
Dbms_Output.Put_Line(' value_ : ' || temp_value_);
END LOOP;
Dbms_Output.Put_Line('');
END LOOP;
END;
Comments