FUNCTION Get_Field ( p_line IN VARCHAR2 , p_delimiter IN VARCHAR2 , p_field_no IN NUMBER , p_encapsulator IN VARCHAR2 DEFAULT '"' ) RETURN VARCHAR2 IS --============================================================================== -- NAME: Get_Field -- -- PURPOSE: Get value of field n from a delimited line of ascii data -- -- DESCRIPTION -- This utility function will returrn the value of a field from -- a delimited line of ascii text -- -- PARAMETERS -- p_line IN VARCHAR2 - line of data -- p_delimiter IN VARCHAR2 - Delimiter character -- p_field_no IN NUMBER - Field occurance to be -- returned -- p_encapsulator IN VARCHAR2 - Character used to encapsulate text -- Defaults to double quotes " -- EXAMPLE -- SELECT GET_FIELD( '"ABC",1223,"DE,FG",456' -- , ',' -- , 3 -- , '"' -- ) -- FROM dual; -- -- RETURNS -- VARCHAR2 - Value of field -- -- HISTORY -- Who WHEN Comments -- --------- ---------- --------------------------------------------- -- Chet West 06/18/2003 Initial Verssion --============================================================================== -- Local variables l_current NUMBER :=0; l_count NUMBER :=1; l_start NUMBER :=0; l_end NUMBER :=0; l_skip BOOLEAN :=FALSE; BEGIN -- Determine start position IF p_field_no = 1 THEN l_start := 0; ELSE l_current := 1; LOOP IF SUBSTR( p_line, l_current, 1) = p_delimiter AND NOT l_skip THEN l_count := l_count + 1; IF p_field_no = l_count THEN IF SUBSTR( p_line, l_current+1, 1) = p_encapsulator THEN l_start := l_current + 1; ELSE l_start := l_current; END IF; EXIT; END IF; ELSIF SUBSTR(p_line, l_current, 1) = p_encapsulator AND NOT l_skip THEN l_skip := TRUE; ELSIF SUBSTR(p_line, l_current, 1) = p_encapsulator AND l_skip THEN l_skip := FALSE; END IF; l_current := l_current + 1; IF l_current > LENGTH(p_line) THEN RAISE NO_DATA_FOUND; END IF; END LOOP; END IF; IF SUBSTR( p_line, l_current+1, 1) = p_encapsulator THEN l_start := l_current + 1; END IF; l_current := l_current + 1; l_skip := FALSE; -- Determine end position LOOP IF SUBSTR( p_line, l_current, 1) = p_delimiter AND NOT l_skip THEN EXIT; ELSIF SUBSTR(p_line, l_current, 1) = p_encapsulator AND NOT l_skip THEN l_skip := TRUE; ELSIF SUBSTR(p_line, l_current, 1) = p_encapsulator AND l_skip THEN l_skip := FALSE; END IF; IF l_current = LENGTH(p_line) THEN l_current := l_current + 1; EXIT; END IF; l_current := l_current + 1; END LOOP; IF SUBSTR( p_line, l_current-1, 1) = p_encapsulator THEN l_end := l_current - 1; ELSE l_end := l_current; END IF; -- Extract the field data IF (l_end - l_start) = 1 THEN RETURN NULL; ELSE RETURN SUBSTR(p_line,(l_start + 1),((l_end - l_start) - 1)); END IF; EXCEPTION WHEN OTHERS THEN RETURN NULL; END Get_Field; ---__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__--__-- ---__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__--__-- ---__--__--__--__--__--__--__--__--__---__--__--__--__--__--__--__--__--__--__--