Add PACK_JSON generic parser and refactor IMPORT_COMENZI package
- Create PACK_JSON: Generic JSON parser for Oracle 10g/11g/12c compatibility * Uses only standard Oracle functions (no dependencies) * Functions: parse_array, get_string, get_number, get_boolean * Built-in error tracking with g_last_error property * Comprehensive test suite with 4 test functions * Supports nested objects and complex JSON structures - Refactor IMPORT_COMENZI to use PACK_JSON instead of manual parsing * Clean separation of concerns - JSON parsing vs business logic * Improved error handling and logging consistency * Uses pINFO for consistent logging across packages - Update IMPORT_PARTENERI logging to use pINFO consistently * Remove custom log_operatie function * Standardize logging format across all packages 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -134,15 +134,6 @@ CREATE OR REPLACE PACKAGE PACK_IMPORT_PARTENERI AS
|
||||
p_prenume OUT VARCHAR2
|
||||
);
|
||||
|
||||
/**
|
||||
* Scrie in log operatiile executate
|
||||
* @param p_mesaj Mesajul de logat
|
||||
* @param p_nivel Nivelul: INFO, WARN, ERROR
|
||||
*/
|
||||
PROCEDURE log_operatie(
|
||||
p_mesaj IN VARCHAR2,
|
||||
p_nivel IN VARCHAR2 DEFAULT 'INFO'
|
||||
);
|
||||
|
||||
END PACK_IMPORT_PARTENERI;
|
||||
/
|
||||
@@ -181,7 +172,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in valideaza_date_partener: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in valideaza_date_partener: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RAISE;
|
||||
END valideaza_date_partener;
|
||||
|
||||
@@ -212,7 +203,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
v_cod_fiscal_curat := curata_text_cautare(p_cod_fiscal);
|
||||
|
||||
log_operatie('Cautare partener dupa cod_fiscal: ' || v_cod_fiscal_curat);
|
||||
pINFO('Cautare partener dupa cod_fiscal: ' || v_cod_fiscal_curat, 'IMPORT_PARTENERI');
|
||||
|
||||
-- Cautare in NOM_PARTENERI
|
||||
BEGIN
|
||||
@@ -222,12 +213,12 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
WHERE UPPER(TRIM(cod_fiscal)) = v_cod_fiscal_curat
|
||||
AND ROWNUM = 1; -- În caz de duplicate, luam primul
|
||||
|
||||
log_operatie('Gasit partener cu cod_fiscal ' || v_cod_fiscal_curat || ': ID_PART=' || v_id_part);
|
||||
pINFO('Gasit partener cu cod_fiscal ' || v_cod_fiscal_curat || ': ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
log_operatie('Nu s-a gasit partener cu cod_fiscal: ' || v_cod_fiscal_curat);
|
||||
pINFO('Nu s-a gasit partener cu cod_fiscal: ' || v_cod_fiscal_curat, 'IMPORT_PARTENERI');
|
||||
RETURN NULL;
|
||||
|
||||
WHEN TOO_MANY_ROWS THEN
|
||||
@@ -242,14 +233,14 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
)
|
||||
WHERE ROWNUM = 1;
|
||||
|
||||
log_operatie('WARNING: Multiple parteneri cu acelasi cod_fiscal ' || v_cod_fiscal_curat ||
|
||||
'. Selectat ID_PART=' || v_id_part, 'WARN');
|
||||
pINFO('WARNING: Multiple parteneri cu acelasi cod_fiscal ' || v_cod_fiscal_curat ||
|
||||
'. Selectat ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
END;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in cauta_partener_dupa_cod_fiscal: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in cauta_partener_dupa_cod_fiscal: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RAISE;
|
||||
END cauta_partener_dupa_cod_fiscal;
|
||||
|
||||
@@ -264,7 +255,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
v_denumire_curata := curata_text_cautare(p_denumire);
|
||||
|
||||
log_operatie('Cautare partener dupa denumire: ' || v_denumire_curata);
|
||||
pINFO('Cautare partener dupa denumire: ' || v_denumire_curata, 'IMPORT_PARTENERI');
|
||||
|
||||
-- Cautare in NOM_PARTENERI
|
||||
BEGIN
|
||||
@@ -274,12 +265,12 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
WHERE UPPER(TRIM(denumire)) = v_denumire_curata
|
||||
AND ROWNUM = 1; -- În caz de duplicate, luam primul
|
||||
|
||||
log_operatie('Gasit partener cu denumirea ' || v_denumire_curata || ': ID_PART=' || v_id_part);
|
||||
pINFO('Gasit partener cu denumirea ' || v_denumire_curata || ': ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
|
||||
EXCEPTION
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
log_operatie('Nu s-a gasit partener cu denumirea: ' || v_denumire_curata);
|
||||
pINFO('Nu s-a gasit partener cu denumirea: ' || v_denumire_curata, 'IMPORT_PARTENERI');
|
||||
RETURN NULL;
|
||||
|
||||
WHEN TOO_MANY_ROWS THEN
|
||||
@@ -294,14 +285,14 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
)
|
||||
WHERE ROWNUM = 1;
|
||||
|
||||
log_operatie('WARNING: Multiple parteneri cu aceeasi denumire ' || v_denumire_curata ||
|
||||
'. Selectat ID_PART=' || v_id_part, 'WARN');
|
||||
pINFO('WARNING: Multiple parteneri cu aceeasi denumire ' || v_denumire_curata ||
|
||||
'. Selectat ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
END;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in cauta_partener_dupa_denumire: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in cauta_partener_dupa_denumire: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RAISE;
|
||||
END cauta_partener_dupa_denumire;
|
||||
|
||||
@@ -324,7 +315,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in este_persoana_fizica: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in este_persoana_fizica: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RETURN 0;
|
||||
END este_persoana_fizica;
|
||||
|
||||
@@ -369,7 +360,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in separa_nume_prenume: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in separa_nume_prenume: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
p_nume := SUBSTR(p_denumire_completa, 1, 50); -- fallback
|
||||
p_prenume := NULL;
|
||||
END separa_nume_prenume;
|
||||
@@ -394,13 +385,13 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
|
||||
-- Validare input
|
||||
IF p_adresa_text IS NULL THEN
|
||||
log_operatie('Adresa goala, se folosesc valorile default', 'WARN');
|
||||
pINFO('Adresa goala, se folosesc valorile default', 'IMPORT_PARTENERI');
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
v_adresa_curata := TRIM(p_adresa_text);
|
||||
|
||||
log_operatie('Parsare adresa: ' || v_adresa_curata);
|
||||
pINFO('Parsare adresa: ' || v_adresa_curata, 'IMPORT_PARTENERI');
|
||||
|
||||
-- Split dupa semicolon
|
||||
SELECT TRIM(REGEXP_SUBSTR(v_adresa_curata, '[^;]+', 1, LEVEL))
|
||||
@@ -411,7 +402,7 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_count := v_componente.COUNT;
|
||||
|
||||
IF v_count = 0 THEN
|
||||
log_operatie('Nu s-au gasit componente in adresa', 'WARN');
|
||||
pINFO('Nu s-au gasit componente in adresa', 'IMPORT_PARTENERI');
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
@@ -472,12 +463,12 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
p_sector := C_SECTOR_DEFAULT;
|
||||
END IF;
|
||||
|
||||
log_operatie('Adresa parsata: JUD=' || p_judet || ', LOC=' || p_localitate ||
|
||||
', STRADA=' || NVL(p_strada, 'NULL') || ', SECTOR=' || p_sector);
|
||||
pINFO('Adresa parsata: JUD=' || p_judet || ', LOC=' || p_localitate ||
|
||||
', STRADA=' || NVL(p_strada, 'NULL') || ', SECTOR=' || p_sector, 'IMPORT_PARTENERI');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR in parseaza_adresa_semicolon: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR in parseaza_adresa_semicolon: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
-- Pastram valorile default in caz de eroare
|
||||
p_judet := C_JUD_DEFAULT;
|
||||
p_localitate := C_LOCALITATE_DEFAULT;
|
||||
@@ -509,10 +500,10 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_denumire_curata VARCHAR2(200);
|
||||
|
||||
BEGIN
|
||||
log_operatie('=== ÎNCEPUT cauta_sau_creeaza_partener ===');
|
||||
log_operatie('Input: cod_fiscal=' || NVL(p_cod_fiscal, 'NULL') ||
|
||||
pINFO('=== ÎNCEPUT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
|
||||
pINFO('Input: cod_fiscal=' || NVL(p_cod_fiscal, 'NULL') ||
|
||||
', denumire=' || NVL(p_denumire, 'NULL') ||
|
||||
', adresa=' || NVL(p_adresa, 'NULL'));
|
||||
', adresa=' || NVL(p_adresa, 'NULL'), 'IMPORT_PARTENERI');
|
||||
|
||||
-- Validare date input
|
||||
IF NOT valideaza_date_partener(p_cod_fiscal, p_denumire) THEN
|
||||
@@ -527,8 +518,8 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_id_part := cauta_partener_dupa_cod_fiscal(v_cod_fiscal_curat);
|
||||
|
||||
IF v_id_part IS NOT NULL THEN
|
||||
log_operatie('Partener gasit dupa cod_fiscal. ID_PART=' || v_id_part);
|
||||
log_operatie('=== SFÂRȘIT cauta_sau_creeaza_partener ===');
|
||||
pINFO('Partener gasit dupa cod_fiscal. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
pINFO('=== SFÂRȘIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
END IF;
|
||||
END IF;
|
||||
@@ -537,21 +528,21 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
v_id_part := cauta_partener_dupa_denumire(v_denumire_curata);
|
||||
|
||||
IF v_id_part IS NOT NULL THEN
|
||||
log_operatie('Partener gasit dupa denumire. ID_PART=' || v_id_part);
|
||||
log_operatie('=== SFÂRȘIT cauta_sau_creeaza_partener ===');
|
||||
pINFO('Partener gasit dupa denumire. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
pINFO('=== SFÂRȘIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
|
||||
RETURN v_id_part;
|
||||
END IF;
|
||||
|
||||
-- STEP 3: Creare partener nou
|
||||
log_operatie('Nu s-a gasit partener existent. Se creeaza unul nou...');
|
||||
pINFO('Nu s-a gasit partener existent. Se creeaza unul nou...', 'IMPORT_PARTENERI');
|
||||
|
||||
-- Verifica tipul partenerului
|
||||
v_este_persoana_fizica := este_persoana_fizica(v_cod_fiscal_curat);
|
||||
|
||||
IF v_este_persoana_fizica = 1 THEN
|
||||
log_operatie('Detectata persoana fizica (CUI 13 cifre)');
|
||||
pINFO('Detectata persoana fizica (CUI 13 cifre)', 'IMPORT_PARTENERI');
|
||||
separa_nume_prenume(v_denumire_curata, v_nume, v_prenume);
|
||||
log_operatie('Nume separat: NUME=' || NVL(v_nume, 'NULL') || ', PRENUME=' || NVL(v_prenume, 'NULL'));
|
||||
pINFO('Nume separat: NUME=' || NVL(v_nume, 'NULL') || ', PRENUME=' || NVL(v_prenume, 'NULL'), 'IMPORT_PARTENERI');
|
||||
END IF;
|
||||
|
||||
-- Creare partener prin pack_def
|
||||
@@ -606,17 +597,17 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
RAISE_APPLICATION_ERROR(-20003, 'pack_def.adauga_partener a returnat ID invalid');
|
||||
END IF;
|
||||
|
||||
log_operatie('Partener creat cu succes. ID_PART=' || v_id_part);
|
||||
pINFO('Partener creat cu succes. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR la crearea partenerului prin pack_def: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR la crearea partenerului prin pack_def: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RAISE integrare_pack_def_exception;
|
||||
END;
|
||||
|
||||
-- STEP 4: Adaugare adresa (daca exista)
|
||||
IF p_adresa IS NOT NULL THEN
|
||||
log_operatie('Se adauga adresa pentru partenerul nou creat...');
|
||||
pINFO('Se adauga adresa pentru partenerul nou creat...', 'IMPORT_PARTENERI');
|
||||
|
||||
-- Parseaza adresa
|
||||
parseaza_adresa_semicolon(p_adresa, v_judet, v_localitate, v_strada, v_sector);
|
||||
@@ -650,72 +641,41 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_PARTENERI AS
|
||||
);
|
||||
|
||||
IF v_id_adresa IS NOT NULL AND v_id_adresa > 0 THEN
|
||||
log_operatie('Adresa adaugata cu succes. ID_ADRESA=' || v_id_adresa);
|
||||
pINFO('Adresa adaugata cu succes. ID_ADRESA=' || v_id_adresa, 'IMPORT_PARTENERI');
|
||||
ELSE
|
||||
log_operatie('WARNING: pack_def.adauga_adresa_partener2 a returnat ID invalid: ' || NVL(TO_CHAR(v_id_adresa), 'NULL'), 'WARN');
|
||||
pINFO('WARNING: pack_def.adauga_adresa_partener2 a returnat ID invalid: ' || NVL(TO_CHAR(v_id_adresa), 'NULL'), 'IMPORT_PARTENERI');
|
||||
END IF;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR la adaugarea adresei prin pack_def: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR la adaugarea adresei prin pack_def: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
-- Nu raisam exceptia pentru adresa, partenerii pot exista fara adresa
|
||||
log_operatie('Partenerul a fost creat, dar adresa nu a putut fi adaugata', 'WARN');
|
||||
pINFO('Partenerul a fost creat, dar adresa nu a putut fi adaugata', 'IMPORT_PARTENERI');
|
||||
END;
|
||||
ELSE
|
||||
log_operatie('Nu s-a furnizat adresa pentru partenerul nou');
|
||||
pINFO('Nu s-a furnizat adresa pentru partenerul nou', 'IMPORT_PARTENERI');
|
||||
END IF;
|
||||
|
||||
log_operatie('Partener creat complet. ID_PART=' || v_id_part);
|
||||
log_operatie('=== SFÂRȘIT cauta_sau_creeaza_partener ===');
|
||||
pINFO('Partener creat complet. ID_PART=' || v_id_part, 'IMPORT_PARTENERI');
|
||||
pINFO('=== SFÂRȘIT cauta_sau_creeaza_partener ===', 'IMPORT_PARTENERI');
|
||||
|
||||
RETURN v_id_part;
|
||||
|
||||
EXCEPTION
|
||||
WHEN partener_invalid_exception THEN
|
||||
log_operatie('ERROR: Date partener invalide', 'ERROR');
|
||||
pINFO('ERROR: Date partener invalide', 'IMPORT_PARTENERI');
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Date partener invalide: ' || SQLERRM);
|
||||
|
||||
WHEN integrare_pack_def_exception THEN
|
||||
log_operatie('ERROR: Problema la integrarea cu pack_def', 'ERROR');
|
||||
pINFO('ERROR: Problema la integrarea cu pack_def', 'IMPORT_PARTENERI');
|
||||
RAISE_APPLICATION_ERROR(-20003, 'Eroare la integrarea cu pack_def: ' || SQLERRM);
|
||||
|
||||
WHEN OTHERS THEN
|
||||
log_operatie('ERROR NEAȘTEPTAT in cauta_sau_creeaza_partener: ' || SQLERRM, 'ERROR');
|
||||
pINFO('ERROR NEAȘTEPTAT in cauta_sau_creeaza_partener: ' || SQLERRM, 'IMPORT_PARTENERI');
|
||||
RAISE_APPLICATION_ERROR(-20099, 'Eroare neasteptata la crearea partenerului: ' || SQLERRM);
|
||||
|
||||
END cauta_sau_creeaza_partener;
|
||||
|
||||
PROCEDURE log_operatie(
|
||||
p_mesaj IN VARCHAR2,
|
||||
p_nivel IN VARCHAR2 DEFAULT 'INFO'
|
||||
) IS
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
v_timestamp VARCHAR2(50);
|
||||
v_mesaj_complet VARCHAR2(4000);
|
||||
BEGIN
|
||||
v_timestamp := TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS');
|
||||
v_mesaj_complet := v_timestamp || ' | ' || RPAD(p_nivel, 5) || ' | IMPORT_PARTENERI | ' || p_mesaj;
|
||||
|
||||
-- Output in server log (DBMS_OUTPUT pentru sesiuni interactive)
|
||||
DBMS_OUTPUT.PUT_LINE(v_mesaj_complet);
|
||||
|
||||
-- Scrie in tabela INFO pentru logging
|
||||
BEGIN
|
||||
INSERT INTO INFO (info, locatia)
|
||||
VALUES (v_mesaj_complet, 'IMPORT_PARTENERI');
|
||||
|
||||
COMMIT;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- Ignora erorile de logging - nu vrem sa intrerupa procesul principal
|
||||
NULL;
|
||||
END;
|
||||
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- Nu lasam logging-ul sa intrerupa procesul principal
|
||||
NULL;
|
||||
END log_operatie;
|
||||
|
||||
END PACK_IMPORT_PARTENERI;
|
||||
/
|
||||
|
||||
Reference in New Issue
Block a user