Straße und Hausnr. trennen

CREATE OR REPLACE PROCEDURE EDV.P_SPLIT_STR_HNR(P1_STR IN VARCHAR2, P_CKC_STRNR_NEU IN OUT VARCHAR2, P_CKC_STR_NEU IN OUT VARCHAR2) IS
-- Splitten von Straße und Hausnummer aus p1_str in P_CKC_STRNR_NEU (Hausnummer) und P_CKC_STR_NEU (Straße ohne Hausnummer)
E_STR           VARCHAR(40);
V_CKC_STRNR_NEU VARCHAR(40);
V_CKC_STR_NEU   VARCHAR(40);
I_STR           NUMBER;
I_STR_1         NUMBER;
I_STR_2         NUMBER;
I_NUM_CNT       NUMBER;
I_ALF_CNT       NUMBER;
I_NUM_ON        BOOLEAN;
V_ERRM          VARCHAR2(2000);
Z               CHAR(1);
V_STEP          NUMBER;
BEGIN
      V_STEP := 1;
      V_CKC_STRNR_NEU := '';
      V_CKC_STR_NEU   := '';
      I_NUM_CNT       := 0;
      I_ALF_CNT       := 0;
      I_NUM_ON        := TRUE;
      E_STR           := LTRIM(RTRIM(P1_STR));
      I_STR           := LENGTH(E_STR);
      WHILE I_STR > 0
      LOOP
         IF I_STR > 1 THEN
            I_STR_1 := I_STR - 1;
         ELSE
            I_STR_1 := 1;
         END IF;
         IF I_STR > 2 THEN
            I_STR_2 := I_STR - 2;
         ELSE
            I_STR_2 := 1;
         END IF;
         Z := SUBSTR(E_STR,I_STR,1);
         IF I_NUM_ON AND Z = '-' AND V_CKC_STRNR_NEU NOT LIKE '%-%' THEN
            I_NUM_CNT := I_NUM_CNT + 1;
         ELSIF I_NUM_ON AND Z = ' ' THEN
            I_NUM_CNT := I_NUM_CNT + 1;
         ELSIF I_NUM_ON AND SUBSTR(E_STR,I_STR,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN
            I_NUM_CNT := I_NUM_CNT + 1;
         ELSIF (I_STR = LENGTH(E_STR) AND SUBSTR(E_STR,I_STR_1,1) IN ('0','1','2','3','4','5','6','7','8','9'))
         OR    (I_STR = LENGTH(E_STR) AND SUBSTR(E_STR,I_STR_2,1) IN ('0','1','2','3','4','5','6','7','8','9') AND SUBSTR(E_STR,I_STR_1,1)  = ' ')THEN
            I_NUM_CNT := I_NUM_CNT + 1;
         ELSE 
            I_ALF_CNT := I_ALF_CNT + 1;
            I_NUM_ON  := FALSE;
         END IF; 
         IF I_NUM_ON THEN
            V_CKC_STRNR_NEU := SUBSTR(E_STR,I_STR,1) || V_CKC_STRNR_NEU;
         ELSE
            V_CKC_STR_NEU   := SUBSTR(E_STR,I_STR,1) || V_CKC_STR_NEU;
         END IF;
         I_STR := I_STR - 1;
      END LOOP;
      P_CKC_STRNR_NEU := RTRIM(LTRIM(V_CKC_STRNR_NEU));
      P_CKC_STR_NEU   := RTRIM(LTRIM(V_CKC_STR_NEU));
EXCEPTION
   WHEN OTHERS THEN
   null;
END;
/