CREATE OR REPLACE FUNCTION SBUSTR(STR_INPUT IN VARCHAR2, LENGTH_INPUT IN NUMBER) RETURN VARCHAR2 IS I NUMBER; SUB_STR VARCHAR2(2000); SUB_LENGTH NUMBER := 0; STR_COUNT NUMBER := 0; TEMP NUMBER := 0; RETURN_STR VARCHAR2(2000) := ''; BEGIN SELECT LENGTH(STR_INPUT) INTO SUB_LENGTH FROM DUAL; FOR I IN 1 .. SUB_LENGTH LOOP SELECT SUBSTR(STR_INPUT, I, 1) INTO SUB_STR FROM DUAL; SELECT LENGTHB(SUB_STR) INTO SUB_LENGTH FROM DUAL; IF (SUB_LENGTH = 1) THEN TEMP := 1; ELSE TEMP := 2; END IF; IF (STR_COUNT + TEMP <= LENGTH_INPUT) THEN IF (SUB_LENGTH = 1) THEN STR_COUNT := STR_COUNT + 1; ELSE STR_COUNT := STR_COUNT + 2; END IF; RETURN_STR := RETURN_STR || SUB_STR; ELSE EXIT; END IF; END LOOP; RETURN RETURN_STR; END SBUSTR; /