Maximale Anzahl offener Cursor überschritten--beim schreiben einer textdatei + oracle

Hallo,

ich versuche mit unterstehenden Code aus einer Oracle DB mit 20000 Einträgen eine SQL Datei zu schreiben.

Ich lese mit SQL die ID´s der einzelenen Zeilen aus und schreibe dann eine .SQL Datei (ein UpdateSkript)

allerdings bekomme ich nach kurzer Laufzeit einen:

PM schreiben.UpdateSQLSkriptSQLPlus writeSQL
SEVERE: null
java.sql.SQLException: ORA-01000: Maximale Anzahl offener Cursor überschritten

Connection geschlossen!


private static void writeSQL() {
try {
// get maxRownum Start
String maxRownum = “select count(*) from EXPORT”;
Statement stmt = null;
ResultSet rs = null;
stmt = datenbank._DB_Connection.conn.createStatement();
rs = stmt.executeQuery(maxRownum);
// get the number of rows from the result set
rs.next();
System.out.println("Anzahl der Zeilen in der EXPORT Tabelle: " + rs.getInt(1));
// get maxRownum END
// int count = 0;
count = rs.getInt(1);
System.out.println("Count: " + count);

        now = new Date();
        SimpleDateFormat format =
                new SimpleDateFormat("yyyyMMdd");
        
        String angemeldeterWindowsUser = System.getProperty("user.name");

                 // SQL Datei schreiben

        file = new File("L:\\Export" + format.format(now) + "_" + angemeldeterWindowsUser + "_" + ".sql");
        FileWriter fw = new FileWriter(file);

        fw.write("-- 

“);
fw.write(”–
“);
fw.write(”–
");
fw.write("set pagesize 1024
");
fw.write("set linesize 1024
");
fw.write("set echo on
");
fw.write(“spool C:\TEMP\DeltaExport_” + format.format(now) + ".log
“);
fw.write(”
“);
fw.write(”–
");
fw.write("execute LTT_USER.SETCONFIGURATION (‘xxx’);
“);
fw.write(”
");
fw.write("grant shorttermtransactions to xxx;
“);
fw.write(”
“);
fw.write(”–
“);
fw.write(”
");

        /* Updates
         * 
         */
        // wenn die Zwischentabelle leer ist soll keine Erfolgsmeldung kommen! 
        // String leereTabelle wird dafür oben deklariert und im Profilkontroller benutzt...
        if (count == 0) {
            leereTabelle = 0;
            System.out.println(leereTabelle);
            System.out.println("Tabelle ist leer");
        } else {
            leereTabelle = 1;




// ##################################################################################

            Statement stmtfid = null;
            ResultSet rsfid = null;
               
            while (count != 0) {
             //   fw = new FileWriter(file);
                stmtfid = datenbank._DB_Connection.conn.createStatement();
                rsfid = stmtfid.executeQuery("Select G3E_FID FROM EXPORT where ID = " + count);
                rsfid.next();
           
                int fid = rsfid.getInt(1);
                //System.out.println("fid = " + fid);
                // die Werte aus der DB auslesen
                String PW1Value = "(select PW1   from EXPORT where g3e_fid = " + fid + ")";
                String ct9Value = "(select PW1   from EXPORT where g3e_fid = " + fid + ")"; // PW1 = ct9 -> andere Tabelle!!
                String PW3Value = "(select PW3   from EXPORT where g3e_fid = " + fid + ")";
                String ct8Value = "(select PW3   from EXPORT where g3e_fid = " + fid + ")"; // PW3 = ct8 -> andere Tabelle!!
                String profilesValue = "(select PROFILES from EXPORT where g3e_fid = " + fid + ")";

                //System.out.println("PW1Value = " + PW1Value);
                // Die fertigen Updateskripte erzeugen und in einen String schreiben
                String set_PW1 = "update B$B_CONOBJ_N set PW1     = " + PW1Value.toString() + " where g3e_fid = " + fid;
                String CT9 = "update B$E_NE_ELE_N set ct9 = " + ct9Value + " where g3e_fid = " + fid;
                String set_PW3 = "update B$B_CONOBJ_N set PW3     = " + PW3Value + " where g3e_fid = " + fid;
                String CT8 = "update B$E_NE_ELE_N set ct8 = " + ct8Value + " where g3e_fid = " + fid;
                String PROFI = "update B$B_CONOBJ_N set PROFILES   = " + profilesValue + " where g3e_fid = " + fid;

                
                // die Updates in die .sql Datei schreiben
                fw.write(set_PW1 + ";

");
fw.write(CT9 + ";
");
fw.write(set_PW3 + ";
");
fw.write(CT8 + ";
");
fw.write(PROFI + ";
“);
fw.write(”
");

                System.out.println(set_PW1);

                // count um 1 erniedrigen um in der While Schleife weiter zu kommen und alle Fi´s abarbeiten
                
                //fw.close();
               // rsfid.close();
               // stmtfid.close();
                count = count - 1;
            }//fw.close();
             
             fw.close();
             stmtfid.close();
             rsfid.close();
        
        } // end while loop

Verstehe ich dass richtig, dass Du die Updates dann per Java in die DB punpst und dabei den Fehler bekommst?

Dann könnstest Du alle 180 Updates ein commit einfügen (**open cursor limit ** ist standardmäßig auf 200)

besser wäre aber die Updates mit PreparedStatement und addBatch()/executeBatch() umzusetzen.

bye
TT

Der Fehler kommt irgendwo in der while Bedingung…

wärend dem Schreiben der SQL Datei. Hier passiert noch kein schreiben in die DB.
Ich lese nur die ID´s aus damit ich alle Zeilen nacheinander lese und entsprechend eine Update SQL Datei erstellen kann.

stmtfid.close();

muss in der while-Schleife am Ende ausgeführt werden

Hi, danke

das mit stmtfid.close(); hatte ich schon probiert… dann macht er aber gar nichts mehr…

ich habe jetzt das stmtfid = datenbank._DB_Connection.conn.createStatement(); vor die While geschrieben, und jetzt schaut es so aus als ob es durchläuft.