Announcement

Collapse
No announcement yet.

Oracle-Objekte nach Import kaputt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle-Objekte nach Import kaputt

    Hallo,

    ich habe schön des öfteren festgestellt, dass nach dem Import eines Oracle-Kundendumps/Exports mit dem Programm "imp.exe" einige Oracle-Objekte (VIEWS, PROCEDURES, TRIGGER, ...) nicht erstellt werden konnten. Dies wurde dann auch als Warnung von imp.exe angezeigt. Gehe ich dann mit dem Tool "Toad" von Quest Software auf die Objekte und compiliere sie problemlos manuell und alles ist wieder gut. Der Import erfolgte immer von einer älteren Oracle-Version (9i) auf eine aktuelle (10g R3). Das die Objekte bereits in der Kundendatenbank kaputt waren, kann ich so gut wie ausschließen.

    Woran kann es liegen, dass Oracle die besagten Objekte nicht gleich compiliert? Was kann man dagegen tun?

    Grüße,
    Patrick

  • #2
    Das liegt daran das sich diese Objekte auf andere Objekte beziehen welche während des Importes noch nicht das sind. Ist völlig normal. Wenn wenn View X sich auf View Y bezieht, welche ja noch nicht importiert wurde weil sie der Reihe nach erst danach vorkommt ist das nunmal so. Da hilft folgendes:

    Procedure anlegen in dem Schema welches es betrifft:

    CREATE OR REPLACE PROCEDURE PR_RECOMPILE_ALL
    IS
    BEGIN
    -- Message when error, DBMS_OUTPUT.ENABLE
    DECLARE
    -- all objects from User:
    CURSOR c_obj IS
    SELECT object_name, object_type
    FROM user_objects
    WHERE STATUS='INVALID'
    ORDER BY object_type, object_name;
    r_obj c_obj%ROWTYPE;

    cur INTEGER;
    status INTEGER;
    stmt VARCHAR2(256);
    cnt_work number := 0;
    cnt_err number := 0;
    BEGIN
    DBMS_OUTPUT.ENABLE(200000);
    OPEN c_obj;
    LOOP
    FETCH c_obj INTO r_obj;
    IF c_obj%FOUND THEN
    cnt_work := cnt_work + 1;
    IF r_obj.object_type = 'PACKAGE BODY' THEN
    BEGIN
    stmt := 'ALTER PACKAGE '||r_obj.object_name||' COMPILE BODY';
    cur := DBMS_SQL.open_cursor;
    DBMS_SQL.parse(cur, stmt, DBMS_SQL.native);
    status := DBMS_SQL.execute(cur);
    DBMS_SQL.close_cursor(cur);
    dbms_output.put_line(r_obj.object_name||' successfully recompiled');
    EXCEPTION
    WHEN OTHERS THEN
    IF DBMS_SQL.is_open(cur) THEN
    DBMS_SQL.close_cursor(cur);
    END IF;
    cnt_err := cnt_err + 1;
    dbms_output.put_line('Error during compilation of: '||
    r_obj.object_name);
    END;
    ELSE
    BEGIN
    stmt := 'ALTER '||r_obj.object_type||' '||
    r_obj.object_name||' COMPILE';
    cur := DBMS_SQL.open_cursor;
    DBMS_SQL.parse(cur, stmt, DBMS_SQL.native);
    status := DBMS_SQL.execute(cur);
    DBMS_SQL.close_cursor(cur);
    dbms_output.put_line(r_obj.object_name||' successfully recompiled');
    EXCEPTION
    WHEN OTHERS THEN
    IF DBMS_SQL.is_open(cur) THEN
    DBMS_SQL.close_cursor(cur);
    END IF;
    cnt_err := cnt_err + 1;
    dbms_output.put_line('Error during compilation of: '||
    r_obj.object_name);
    END;
    END IF;
    ELSE
    EXIT;
    END IF;
    END LOOP;
    CLOSE c_obj;
    dbms_output.put_line(cnt_work||' objects with '||cnt_err||' errors.');
    EXCEPTION
    WHEN OTHERS THEN
    IF c_obj%ISOPEN THEN
    CLOSE c_obj;
    END IF;
    IF DBMS_SQL.is_open(cur) THEN
    DBMS_SQL.close_cursor(cur);
    END IF;
    dbms_output.put_line('Abbruch: '||sqlerrm);
    END;
    END PR_RECOMPILE_ALL;
    /

    und nach dem Import einfach aufrufen mit
    exec pr_recompile_all

    Grüsse Steve

    Comment


    • #3
      Vielen Dank! <br>

      Nur wie muss ich das "exec pr_recompile_all" genau aufrufen (also ohne Toad)

      Comment


      • #4
        sqlplus auf,

        exec pr_recompile_all

        :-)

        Grüsse
        Steve

        Comment


        • #5
          klappt :-)

          Hatte mich mit dem falschen Benutzer angemeldet und der hatte die Procedure noch nicht im Bauch :-)

          Vielen Dank

          Comment


          • #6
            gern geschehen.

            Grüsse
            Steve

            Comment

            Working...
            X