fix(plsql): encoding-safe strip_diacritics + localitate match in address lookup
TRANSLATE with UTF-8 literals was silently corrupted when compiled via Windows sqlplus (ĂăÂâÎî→����, ȘșȚț→????). Replaced with REPLACE/UNISTR for comma-below→cedilla normalization + CONVERT US7ASCII. Also applied strip_diacritics to localitate/judet in TIER 1 lookup and locality search (was only on strada), fixing 'FĂLTICENI' vs 'FALTICENI' BINARY mismatch. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,8 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
|
||||
-- 02.04.2026 - parser adrese: extrage APARTAMENT/SCARA/ETAJ embedded in strada (fix "Nr17 apartament 8")
|
||||
-- 02.04.2026 - fallback cautare PF cu permutari nume (evita duplicate la swap firstname/lastname)
|
||||
-- 06.04.2026 - eliminat TIER 2 cautare adresa (judet+loc fara strada) — creeaza adresa noua cand strada difera
|
||||
-- 06.04.2026 - fix strip_diacritics: UNISTR encoding-safe (TRANSLATE cu UTF-8 literal se corupea pe Windows)
|
||||
-- 06.04.2026 - fix TIER 1: strip_diacritics si pe localitate (nu doar strada)
|
||||
|
||||
-- ====================================================================
|
||||
-- CONSTANTS
|
||||
@@ -160,15 +162,23 @@ END PACK_IMPORT_PARTENERI;
|
||||
CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
-- 01.04.2026 - strip_diacritics la stocare adrese si parteneri
|
||||
-- 06.04.2026 - fix: UNISTR encoding-safe (TRANSLATE cu UTF-8 literal se corupea pe Windows sqlplus)
|
||||
-- Hybrid: REPLACE comma-below Ș/Ț → cedilla Ş/Ţ, apoi CONVERT US7ASCII (strips Ă/Â/Î/Ş/Ţ)
|
||||
FUNCTION strip_diacritics(p_text IN VARCHAR2) RETURN VARCHAR2 IS
|
||||
BEGIN
|
||||
IF p_text IS NULL THEN
|
||||
RETURN NULL;
|
||||
END IF;
|
||||
RETURN TRANSLATE(
|
||||
UPPER(TRIM(p_text)),
|
||||
'ĂăÂâÎîȘșȚțŞşŢţ',
|
||||
'AAAAIISSTTSSTT'
|
||||
RETURN CONVERT(
|
||||
UPPER(TRIM(
|
||||
REPLACE(REPLACE(REPLACE(REPLACE(
|
||||
p_text,
|
||||
UNISTR('\0218'), UNISTR('\015E')), -- Ș → Ş (comma-below → cedilla)
|
||||
UNISTR('\0219'), UNISTR('\015F')), -- ș → ş
|
||||
UNISTR('\021A'), UNISTR('\0162')), -- Ț → Ţ
|
||||
UNISTR('\021B'), UNISTR('\0163')) -- ț → ţ
|
||||
)),
|
||||
'US7ASCII', 'AL32UTF8'
|
||||
);
|
||||
END strip_diacritics;
|
||||
|
||||
@@ -933,14 +943,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_etaj);
|
||||
|
||||
-- 01.04.2026 - cautare adresa pe strada + diacritics + id_loc validation
|
||||
-- TIER 1: county + city + street (diacritics normalized) + valid id_loc
|
||||
-- 06.04.2026 - strip_diacritics si pe localitate (fix: 'FĂLTICENI' vs 'FALTICENI')
|
||||
-- TIER 1: county + city + street (all diacritics normalized) + valid id_loc
|
||||
begin
|
||||
select id_adresa into p_id_adresa from (
|
||||
select id_adresa
|
||||
from vadrese_parteneri
|
||||
where id_part = p_id_part
|
||||
and judet = v_judet
|
||||
and localitate = v_localitate
|
||||
and strip_diacritics(judet) = strip_diacritics(v_judet)
|
||||
and strip_diacritics(localitate) = strip_diacritics(v_localitate)
|
||||
and strip_diacritics(strada) = strip_diacritics(v_strada)
|
||||
and id_loc IS NOT NULL
|
||||
order by principala desc, id_adresa desc
|
||||
@@ -963,14 +974,14 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_id_judet := N_ID_JUD_DEFAULT;
|
||||
end;
|
||||
|
||||
-- caut localitatea
|
||||
-- caut localitatea (strip_diacritics pe ambele parti — fix encoding mismatch)
|
||||
begin
|
||||
select id_loc, id_judet, id_tara
|
||||
into v_id_localitate, v_id_judet, v_id_tara
|
||||
from (select id_loc, id_judet, id_tara, rownum rn
|
||||
from syn_nom_localitati l
|
||||
where id_judet = v_id_judet
|
||||
and localitate = v_localitate
|
||||
and strip_diacritics(localitate) = strip_diacritics(v_localitate)
|
||||
and inactiv = 0
|
||||
and sters = 0
|
||||
order by localitate)
|
||||
|
||||
Reference in New Issue
Block a user