I have code that generally works well and splits the string, but I want to make it so that if there is no keyword or separator in the string, it writes a message to this line: The keyword was not found on line 2 or //
v_position NUMBER := 1;
v_max_length CONSTANT NUMBER := 35;
v_key_words VARCHAR2_TABLE := VARCHAR2_TABLE('/DEDUCT/', '/CCDNDR/', '/CCTFDR/', '/INS/', '/FULLPAY/', '/INT/', '/ACC/', '/BOOK/');
v_field VARCHAR2(100) := '';
keyword_found BOOLEAN := FALSE;
current_segment_contains_keyword BOOLEAN := FALSE;
BEGIN
v_info := VARCHAR2_TABLE();
WHILE v_position <= LENGTH(input_string) AND v_info.COUNT < 6 LOOP
keyword_found := FALSE;
FOR i IN 1..v_key_words.COUNT LOOP
IF INSTR(input_string, v_key_words(i), v_position) = v_position THEN
current_segment_contains_keyword := TRUE; -- Mark that current segment contains a keyword
IF v_field IS NOT NULL THEN
v_info.EXTEND;
v_info(v_info.LAST) := v_field;
v_field := '';
END IF;
v_field := v_key_words(i);
v_position := v_position + LENGTH(v_key_words(i));
keyword_found := TRUE;
EXIT;
END IF;
END LOOP;
IF NOT keyword_found THEN
IF INSTR(input_string, '//', v_position) = v_position AND v_info.COUNT < 5 THEN
current_segment_contains_keyword := TRUE; -- Mark that current segment contains a separator
IF v_field IS NOT NULL THEN
v_info.EXTEND;
v_info(v_info.LAST) := v_field;
v_field := '';
END IF;
v_field := '//';
v_position := v_position + 2;
ELSE
IF LENGTH(v_field) >= v_max_length THEN
v_info.EXTEND;
v_info(v_info.LAST) := v_field;
v_field := '';
END IF;
v_field := v_field || SUBSTR(input_string, v_position, 1);
v_position := v_position + 1;
END IF;
END IF;
END LOOP;
IF v_field IS NOT NULL AND v_info.COUNT < 6 THEN
IF current_segment_contains_keyword THEN
v_info.EXTEND;
v_info(v_info.LAST) := v_field;
ELSE
v_info.EXTEND;
v_info(v_info.LAST) := 'No keywords or separator // found in the ' || TO_CHAR(v_info.COUNT) || ' строка';
END IF;
END IF;
FOR i IN v_info.COUNT + 1..6 LOOP
v_info.EXTEND;
END LOOP;
I’ve tried many options, but for some reason it doesn’t work.