From e42b1f63b7695aeb4867c7e9aab63e47abb79a6d Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Tue, 28 Apr 2026 10:31:05 +0000 Subject: [PATCH] fix(address): ORA-06502 pe apart/scara/etaj token lung + strip city+region din adresa GoMag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Doua root cause-uri pentru ORA-12899 la importul comenzii #485841056: 1. Oracle ORA-06502: v_apart/v_scara/v_bloc/v_etaj in cauta_sau_creeaza_adresa declarate VARCHAR2(10/20/30) → Oracle mostenea constrangerea pe OUT parametrii din parseaza_adresa_semicolon → crash INAINTE de fix-ul overflow de la linia 521. Fix: marite la VARCHAR2(100). 2. Python format_address_for_oracle stripuia doar city exact, nu si 'city region' sau 'region city'. GoMag trimite adresa cu suffix 'Municipiul Bucuresti Bucuresti' (city+region) → token urias pentru apartament → declansa ORA-06502 de mai sus. Fix: incearca toate combinatiile city+region, region+city, city, region. Co-Authored-By: Claude Sonnet 4.6 --- api/app/services/import_service.py | 23 +++++++++++++------ .../05_pack_import_parteneri.pck | 11 +++++---- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/api/app/services/import_service.py b/api/app/services/import_service.py index dc03b1f..6cff22a 100644 --- a/api/app/services/import_service.py +++ b/api/app/services/import_service.py @@ -93,14 +93,23 @@ def format_address_for_oracle(address: str, city: str, region: str) -> str: city_clean = clean_web_text(city) address_clean = clean_web_text(address) address_clean = " ".join(address_clean.replace(",", " ").split()) - # Strip city name from end of address (users often type it) - if city_clean: + # Strip city/region suffixes users often append to address + if city_clean or region_clean: addr_upper = address_clean.upper().rstrip() - city_upper = city_clean.upper().strip() - if addr_upper.endswith(city_upper): - stripped = address_clean[:len(address_clean.rstrip()) - len(city_upper)].rstrip() - if stripped: # don't strip if nothing remains - address_clean = stripped + city_upper = city_clean.upper().strip() if city_clean else "" + region_upper = region_clean.upper().strip() if region_clean else "" + for pattern in [ + (city_upper + " " + region_upper).strip(), + (region_upper + " " + city_upper).strip(), + city_upper, + region_upper, + ]: + if pattern and addr_upper.endswith(pattern): + stripped = address_clean[:len(address_clean.rstrip()) - len(pattern)].rstrip() + if stripped: + address_clean = stripped + addr_upper = address_clean.upper().rstrip() + break return f"JUD:{region_clean};{city_clean};{address_clean}" diff --git a/api/database-scripts/05_pack_import_parteneri.pck b/api/database-scripts/05_pack_import_parteneri.pck index 7a82ce1..321ea15 100644 --- a/api/database-scripts/05_pack_import_parteneri.pck +++ b/api/database-scripts/05_pack_import_parteneri.pck @@ -23,6 +23,9 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS -- COM/ORAS/MUN ignorate (deja in p_localitate din GoMag city) -- 23.04.2026 - hardening: SUBSTR(1,10) neconditionat dupa split, blocheaza -- overflow rezidual pe prefix lung fara spatiu in primii 10 char. + -- 28.04.2026 - fix ORA-06502: v_bloc/scara/apart/etaj in cauta_sau_creeaza_adresa + -- marite la VARCHAR2(100) — Oracle OUT param mostenea constrangerea + -- VARCHAR2(10) si cadea pe "apartament 140 interfon 140 Municipiul..." -- ==================================================================== -- CONSTANTS @@ -975,10 +978,10 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS v_strada VARCHAR2(1000); v_numar VARCHAR2(1000); v_sector VARCHAR2(100); - v_bloc VARCHAR2(30); - v_scara VARCHAR2(10); - v_apart VARCHAR2(10); - v_etaj VARCHAR2(20); + v_bloc VARCHAR2(100); + v_scara VARCHAR2(100); + v_apart VARCHAR2(100); + v_etaj VARCHAR2(100); v_id_tara NUMBER(10); v_principala NUMBER(1); begin