--- name: roa-oracle-migration description: Scrie si publica scripturi de migrare Oracle pentru suita ROA: script nou de schema (tabela, view, procedura, functie, pachet), coloana noua, numerotare YYYY_MM_DD_NN, incheiere cu UpdateVersiune + commit, import in UPD_DATABASE si arhiva lunara catre clienti, plus re-exportul sursei unui pachet PL/SQL. Foloseste skill-ul cand auzi "scrie un script de migrare pentru...", "publica scripturile catre clienti", "am nevoie de o coloana noua pe...", "exporta sursa pachetului Y", "modific un pachet", "adaug o optiune de meniu", "rulez scripturile la client". Acopera exact capcanele care nu dau nicio eroare: o instructiune fara `;` e aruncata tacut de SQL*Plus, un NN refolosit colizioneaza intre prefixe, iar o constructie 11g+ pica doar la clientul pe Oracle 10.2. Cere compatibilitate 10.2, idempotenta si sursa de referinta MARIUSM_AUTO. --- # roa-oracle-migration Scrie scripturi de migrare Oracle si publica-le catre clienti. Detalii de context: vezi Referinta, doar cand ramura o cere. ## Cand se foloseste - schimbi schema: tabela, view, procedura, functie sau pachet; - iti trebuie o coloana noua / index / constrangere pe un obiect existent; - scrii un script nou in `D:\ROA\DATABASE\SCRIPTURI_CLAR`; - adaugi o optiune de meniu sau un drept (`co_..._OBIECTE.sql`); - publici scripturile catre clienti (import in `UPD_DATABASE` + arhiva lunara); - re-exporti sursa unui pachet PL/SQL sau citesti un corp de pachet (`oracle_export.md`). Un agent **scrie** scriptul, nu il aplica. Rularea pe o schema se face doar la cererea explicita a lui Marius. ## Pasi 1. Confirma ca sursa de referinta `MARIUSM_AUTO` (pe `ROA_CENTRAL`) e la zi: compara scripturile din `SCRIPTURI_CLAR` cu inregistrarile din `VERSIUNE`. Daca lipseste vreunul, opreste-te si semnaleaza-i lui Marius. Nu porni de la sursa citita dintr-o schema de client. 2. Alege numele `_YYYY_MM_DD_NN_.sql`. Prefixe in uz: `ff`, `co`, `sys`, `ris`, `rf`. `NN` e o secventa **unica pe zi, comuna tuturor prefixelor**. 3. Scrie scriptul ASCII, CRLF, **scoped** pe cazul tratat si **idempotent** (`merge`, `where is null`). Un pachet sta singur in scriptul lui, fara alt DDL/DML alaturi. 4. Termina **fiecare instructiune** explicit cu `;` (sau `/` pentru blocurile PL/SQL). 5. Scrie la nivel **Oracle 10.2** - numitorul comun al parcului de clienti. Proba se face pe serverul cel mai vechi (ROMCONSTRUCT), nu pe dev. 6. Incheie scriptul cu: ```sql exec pack_migrare.UpdateVersiune(''); commit; ``` Numele se da **fara** `.sql` (extensia o adauga `UpdateVersiune`). `UpdateVersiune` e DML: fara `commit` explicit, versiunea nu se inregistreaza si `VERSIUNE` minte. 7. Publica: intai `-DryRun`, apoi fara, conform `publicare-scripturi-db.md`: ```powershell powershell -File D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1 -DryRun powershell -File D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1 ``` Publicarea = import al fiecarui `.sql` in `CONTAFIN_ORACLE.UPD_DATABASE` (pe `ROA_CENTRAL`) **si** regenarea arhivei lunare in `Y:\ROAUPDATE\_UPDATE\`. Directorul e live. 8. Dupa publicare, strange dovezile din "Criterii de acceptare si dovada". ## Capcane - **O instructiune fara `;` final e ARUNCATA fara nicio eroare.** Prima linie goala inchide bufferul SQL*Plus; scriptul continua pana la `UpdateVersiune`, se marcheaza aplicat, iar obiectul ramane cel vechi. `WHENEVER SQLERROR EXIT` nu prinde cazul. - **`;` la capatul unei linii dintr-un comentariu `--` din interiorul unei instructiuni** termina instructiunea acolo: restul `CREATE VIEW`-ului se interpreteaza linie cu linie (`SP2-0734`, `ORA-00936` derutant). Pune `.` in loc de `;` in comentariu. Comentariile de dinaintea instructiunii nu sunt afectate. - **`NN` se colizioneaza intre prefixe**: acelasi numar nu se reia intr-un alt prefix in aceeasi zi. Un script deja in `VERSIUNE` nu se reaplica; corectia se livreaza ca script nou, cu data si `NN` noi - nu prin republicarea aceluiasi fisier. - **Constructiile 11g+/12c+ trec pe dev dar pica la clientul 10.2** (`REGEXP_COUNT`, `CONTINUE`, `LISTAGG`, `PIVOT`, `FETCH FIRST`, identificatori peste 30 de caractere...). Detalii in `scripturi-migrare-db.md`. - **Un obiect nu se poate referi la ceva creat de un script ulterior.** Daca un script creeaza tabela si altul pachetul care o foloseste, tabela are `NN` mai mic. - **LF in loc de CRLF** sparge parsarea pe client (`ALINES` pe `CHR(13)+CHR(10)`): tot fisierul devine un rand. Publicarea refuza fisierele LF. - **DDL neprefixat merge pe schema conexiunii.** Rularea manuala se face conectat pe schema tinta (`CONTAFIN_ORACLE` pentru `co_`, schema firmei pentru `ff_`), niciodata pe un user de lucru. `PACK_UPDATE` face singur `CONNECT` pe schema corecta. - **`linesize` prea mic corupe tacut exportul**: SQL*Plus rupe liniile lungi, inclusiv prin mijlocul unui identificator. Foloseste `linesize 32767`; exportul e pentru citit, nu baza pentru un script de migrare. - Niciodata `select` de raportare in script, `insert` fara `ID_OBIECT` explicit, sau `ID_GRUP` fix (grupurile difera per client). ## Criterii de acceptare si dovada Fara dovada nu se spune "gata". Ruleaza si pastreaza iesirea: - fisierul e **ASCII pur** (0 octeti > 127), fara BOM, cu **CRLF**; - ultima linie a fiecarui `CREATE`/`ALTER`/`MERGE` se termina cu `;`; - scriptul se termina cu `UpdateVersiune('')` urmat de `commit;`; - `NN` e liber: nu exista rand in `VERSIUNE` si nici fisier cu acelasi `data||NN`; - dupa aplicare, `select script_final from versiune where script_final = '.sql';` intoarce randul si nu `..._.sql.sql`; - `publicare_scripturi.ps1 -DryRun` listeaza scripturile fara sa scrie; arhiva generata se citeste inapoi si se compara lungime + MD5 per fisier; - importul compara CLOB-ul citit inapoi octet cu octet cu fisierul. Verificarea de ASCII + CRLF (trebuie sa intoarca `0` si `True`): ```powershell $b = [IO.File]::ReadAllBytes('D:\ROA\DATABASE\SCRIPTURI_CLAR\