Announcement

Collapse
No announcement yet.

nach 30 Dateien ORA-29283: invalid file operation

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

  • nach 30 Dateien ORA-29283: invalid file operation

    Ich habe mir eine Prozedur erstellt, die im jeweiligen Datenbankschema Objekte ausliest und mir deren DDL in eine .sql-Datei speichert.
    Solange ich Häppchen verwende, die klein genug sind, klappt das wunderbar. Aber bei 20-30 Dateien bekomme ich plötzlich eine Exception bei jeder weiteren Datei!

    Zuerst ein Auszug aus der Ausgabe:
    create_table_protokoll.sql
    create_table_reklamationen.sql
    create_table_rueckmelde_codes.sql
    create_table_rueckmeldestufen.sql
    -29283ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 536
    ORA-29283: invalid file operation
    create_table_scanner.sql
    -29283ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 536
    ORA-29283: invalid file operation
    Mein PLSQL-Code ist wie folgt:
    Code:
    CREATE OR REPLACE PROCEDURE SICHERUNG_ERSTELLEN AS 
    
    vFHandle UTL_FILE.FILE_TYPE;
    vDatei varchar2(1024);
    vInhalt CLOB;
      c_amount         CONSTANT BINARY_INTEGER := 32767;
      l_buffer         VARCHAR2(32767);
      l_chr10          PLS_INTEGER;
      l_clobLen        PLS_INTEGER;
      l_pos            PLS_INTEGER    := 1;
    
    
    CURSOR curData IS
      SELECT owner, object_type, object_name, last_ddl_time, status
      FROM   all_objects
      WHERE owner='VERSAND' AND
      object_type = 'TABLE' -- IN ('TABLE', 'VIEW', 'PACKAGE', 'FUNCTION', 'PROCEDURE', 'TRIGGER')
      ORDER BY object_name ASC;
      
    BEGIN
        
      FOR cur_rec IN curData LOOP
      BEGIN
        --Datei erstellen 
        vDatei := lower('create_' || cur_rec.object_type || '_' || cur_rec.object_name || '.sql');
        dbms_output.put_line(vDatei);
        vFHandle := UTL_FILE.FOPEN('dpump_prod', vDatei, 'W');
        
        --DDL anfordern
        SELECT DBMS_METADATA.GET_DDL(cur_rec.object_type,cur_rec.object_name) INTO vInhalt FROM dual;
        
        l_clobLen  := DBMS_LOB.GETLENGTH(vInhalt);
        l_pos := 1;
        vFHandle := UTL_FILE.FOPEN('dpump_prod', vDatei, 'W', c_amount);
        
        --DDL-Text durchlaufen und zeilenweise speichern    
        WHILE l_pos < l_clobLen LOOP
          BEGIN
          l_buffer := DBMS_LOB.SUBSTR(vInhalt, c_amount, l_pos);
          l_chr10  := INSTR(l_buffer,CHR(10),-1);
          IF l_chr10 != 0 THEN
            l_buffer := SUBSTR(l_buffer,1,l_chr10-1);
          END IF;
          UTL_FILE.PUT_LINE(vFHandle, l_buffer, TRUE);
          l_pos := l_pos + LEAST(LENGTH(l_buffer)+1,c_amount);
          EXCEPTION
          WHEN OTHERS THEN
            dbms_output.put_line(sqlcode || sqlerrm);
           END; 
        END LOOP;
      
        EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(sqlcode || sqlerrm);  
        END;  
      END LOOP;
      UTL_FILE.FCLOSE(vFHandle);
    
    END SICHERUNG_ERSTELLEN;
    Kann sich jemand dieses Verhalten erklären? Normalerweise zeigt diese Fehlermeldung Rechteprobleme. Aber das kann in diesem Fall wohl kaum der Grund sein.

    Aufgefallen ist mir ansonsten nur die "Logging-Seite", die mehrfach die Meldung "Exception while updating observer[6]: oracle.jdeveloper.java.provider.ProjectFileProvide r$ProjectObserver@1afb94af" bringt - ob es damit zusammenhängt weiß ich nicht. Die Anzahl der Fehlermeldungen aus dem Ausführungsfenster stimmen damit nämlich nicht überein.

  • #2
    Warum steht das UTL_FILE.FCLOSE(vFHandle) außerhalb der Schleife ?
    Du öffnest Datei um Datei ohne sie wieder zu schließen, das reicht dem BS irgendwann

    Comment


    • #3
      Danke! Da habe ich wohl den Wald vor Bäumen nicht gesehen. Danach hat es wunderbar geklappt!
      Dass ich erst so spät reagiere liegt daran, dass ich mal wieder mein Passwort verlegt hatte...

      Comment

      Working...
      X