Ha meghívod a progit akár sqlplusból, hibára fut és nem kezeled le sehol a kódban, amúgyis megkapod a hibaüzenetet.
Természetesen a logikai hibákat kaphatod csak el, de működés szempontjából az ORA-600 és ORA-7445 hibák, amik a server process leállásával járnak nyilván nem számítanak :)
Alapból tranzakcióban vagy. Tehát ha semmit nem csinálsz, akkor az az alapértelmezett működés, amit kértél. Arra vigyázni kell, hogy minden korábbi változás is elveszett, hiszen nem kezdtél új tranzakciót. Némi problémát okozhat, hogy az a működési mehanizmus, hogy kapsz egy hibát, ami az álltalad megadott kódban nem kezelődik, tehát valaki majd vagy lekezeli, vagy hibára fut a hívás. Ha teszel bele hibakezelést, akkor megkaphatod azt a viselkedést, amit szerintem szeretnél:
PROCEDURE xyz (n NUMBER) IS BEGIN BEGIN DELETE from ...; DELETE from ...; DELETE from ...; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; END xyz;
Ha pontosan tudod, hogy milyen hiba esetén nem kellene commitálnod, de a program futhat tovább, akkor definiálnod kéne az exception-t a megfelelő hibakódhoz és azt elkapni a hibakezelésben.
Ha azt szeretnéd, hogy csak ez a 3 delete legyen tranzakcióban és a hívó DML-jeit nem szeretnéd rollbackelni vagy commitálni, akkor a defininálnod kell, hogy ez egy autonóm tranzakció a "PRAGMA AUTONOMOUS_TRANSACTION" sorral. Ehhez még heggesztettem egy kis egyedi hibakezelést is:
PROCEDURE xyz (n NUMBER) IS PRAGMA AUTONOMOUS_TRANSACTION; e_role_exists EXCEPTION; PRAGMA EXCEPTION_INIT (e_role_exists, -1921); BEGIN BEGIN DELETE from ...; DELETE from ...; DELETE from ...; COMMIT; EXCEPTION WHEN e_role_exists THEN ROLLBACK; END; END xyz;
Ezesetben csak a saját kódjára nyit egy tranzakciót és csak azt fogja rollbackelni, ráadásul csak akkor, ha ORA-1921-es hibát kap (amit deletenél nem kapsz, de ez volt a kódomban: arra definiálod, amire akarod, csak negatív legyen a szám :)) Más hibákat nem kezel le, így azok feljebb adódnak és meghal a futás a hiba kódjával.
Nem, a procedure egyáltalán nem számít a tranzakciókezelés szempontjából, a ROLLBACK vagy mindent visszacsinál, ami a legutóbbi COMMIT-óta történt, vagy azt ami a megadott SAVEPOINT óta történt...
Lehetséges megközelítések:
1. A procedure-ban nincs semmilyen tranzakciókezelés, a hívó a visszaadott értékből tudja meg, hogy sikeres volt-e, vagy sem, és ő majd COMMIT-ál vagy ROLLBACK-el saját belátása szerint.
2. A procedure-ban van COMMIT siker esetén, és ROLLBACK kudarc esetén.
3. Ugyanez, de autonóm tranzakciókezeléssel, mondjuk ha a procedure egy napló írása, amibe akkor is kell bejegyzést tenni, ha végül a művelet nem is történik meg.
4. Ha a procedure sikeres volt, akkor nincs semmi, majd a hívó COMMIT-ál, Ha valami nem sikerült, akkor a procedure elején lévő SAVEPOINT-ig ROLLBACK-el.
Legfontosabb, hogy aki hívja a procedurádat, az tudjon arról, hogy az hogyan is működik, vö: "Bakker, ebben volt egy COMMIT?!"
Köszi az eddigi segítséget, úgy néz ki, sikerült átvergődnöm a dolgon.
Az importnál készített log alapján kiderült, milyen tablespace-ek kellenek, és azt a kettőt létrehoztam TOAD-dal.
Ezután majd az lesz nagy falat (persze ha a többi normál adatbázis import sikeresen lezajlott), hogy koreai cuccok is vannak, amihez UTF-8-as karakterkészlet dukál.
Igaz, hogy ahhoz egy új Oracle instance-t kell telepíteni?
Mondjuk az OLAP kockát dimenziótábláit még viszonylag könnyen tudtam importálni, velük nem volt gond. Hanem a fact adatok már problémásabbak.
Biztos van más megoldás is (from_user – to_user vagy remap_schema), de a helyedben én elkérném a tablespace és user scripteket is, hozzáígazítanám az adatbázisom környezetéhez (elérési utak, adatfájlok mérete) és azután importálnám be az adatokat…
Igazából külföldről kaptunk néhány exportált Oracle dmp fájlt, és mivel én nem értek hozzá, egy munkatársam segít nekem távolról (Skype-on keresztül), de az eddig vázolt hibaüzenetekkel ő sem nagyon tud mit kezdeni.
Első akadályként a szerverünkre telepített Oracle-nek a partitioning funkciója nem is volt engedélyezett, ezért én raktam egyet a saját gépemre. Most már a partitioning oké, de mindig csak jönnek és jönnek az új hibaüzik:-(
Mondjuk az OLAP kockát dimenziótábláit még viszonylag könnyen tudtam importálni, velük nem volt gond. Hanem a fact adatok már problémásabbak.
Ha valamennyit fel is importálom ugyanazon usernév alá, akkor ott ömlesztve lesznek a táblák/nézetek, vagy az importált fájl neve szerint (esetleg egy abban szereplő másik név szerint) csoportosítva?
Próbáltam, hogy hozok létre más usereket, ami sikerült is, de hozzájuk importálni már nem engedett.
ORA-00959: a(z) 'FACT01S' táblaterület nem létezik Itt akkor lehet, hogy a dmp fájl a hibás?
Ahová be akarod importálni a dmp fájlt ott nem létezik ez a táblaterület.
--> remap_tablespace
Most meg már rá sem tudok csatlakozni a saját adatbázisomra (gépemre?), mert hiába írom be az eddig megfelelőnek bizonyult felh.nevet/jelszót, ezt kapom:
"ORA-12500: TNS: a figyelőnek nem sikerült elindítania a dedikált kiszolgálóprocesszt."
A partitioning-et már be tudtam állítani, az újabb hibaüzenet a következő:
ORA-00959: a(z) 'FACT01S' táblaterület nem létezik
Itt akkor lehet, hogy a dmp fájl a hibás?
Többször kaptam ilyen üzenetet az import végén: "Az import sikeresen, de figyelmeztetéssel fejeződött be."
Ez azt jelenti, hogy amit tudott importált és az adatbázis adatai felkerültek? Ha igen, hol tudom rendesen böngészni ezeket? Én valami hasonlóra számítottam, mint az SQL Serverben, de eddig nem sikerült olyasmit elérnem.
Most meg már rá sem tudok csatlakozni a saját adatbázisomra (gépemre?), mert hiába írom be az eddig megfelelőnek bizonyult felh.nevet/jelszót, ezt kapom:
"ORA-12500: TNS: a figyelőnek nem sikerült elindítania a dedikált kiszolgálóprocesszt."
Ha valakinek van esetleg valamilyen tippje, őszintén hálás lennék, ha megosztaná velem!
>Nekem egy egyszeru kerdesem lenne, vissza lehet teriteni egy FUNCTION-ban egy egesz tablat, vagy tobb sort??
Hogyne, A kulturált módja -> ref-cursor; egy hátránya van, oracle-instance-ok _között_ nem müxik, eléggé el nem ítélhető módon. http://www.programmersheaven.com/mb/oracle/186193/186223/ReadMessage.aspx?S=B20000
A kevésbé kulturált módja (bár feldolgozásra amúgy melegen ajánlható) -> bulk collect into ... array http://www.dba-oracle.com/oracle_tips_rittman_bulk%20binds_FORALL.htm
Igen, Enterprise Editiont, de az SQL PLUS-t még nem sikerült próbálnom ma, mert felhasználót/jelszót kér, és szerintem a tnsnames.ora fájlomban valami nem helyesen van benne.
De holnap még szöszölök rajta, meg elvileg a serveren tegnap csináltam ilyet (csak azt most behalt, úgyhogy nem tudok rendesen felmenni rá).
De, valóban segített, csak nehezen találtam meg, hogy hol is lehet.
Gondoltam rá én is, de csak egy másik fórumon látott füles segítségével sikerült kiderítenem, hogy az Admin tools-ban lehet leállítani.
Viszont sajna a telepítés nem hozta meg azt a megoldást, amit szerettem volna tőle, ugyanis van egy szerverünk, amire fel kéne tenni egy adatbázist, viszont az importálás végén ez jelenik meg:
"IMP-00003: 439 sorszámú ORACLE hiba fordult el ORA-00439: a szolgáltatás nincs engedélyezve: Partitioning"
Pedig a telepítésnél külön kiválasztottam, hogy ez is legyen benne, viszont nem tudom, hogy miként lehet engedélyezni?