簡體   English   中英

通過Java寫入Oracle數據庫導致ORA-00604和ORA-01000

[英]Writing into Oracle database via Java leading to ORA-00604 and ORA-01000

我在嘗試將數據寫入oracle表時遇到問題。 因此,我想做的是從TMDB(tmdb.org)接收數據並將其寫入Oracle表中。

這是我的課堂,所有的魔術正在發生:

public class Movies3 {

    public void execute_to_db() throws SQLException, ClassNotFoundException, RuntimeException {

        final String url = "jdbc:oracle:thin:@192.168.XXX.XXX:XXX:XXX";
        final String user = "TEST2";
        final String password = "XXX";
        final String table = "TMDB_TEST";

        DatabaseConnect db = new DatabaseConnect();
        QueryCreateTable_Movies createtable = new QueryCreateTable_Movies();

        try {
            db.connect(user, password, url);

            ResultSet tablelike = db.processQuery(
                    "SELECT COUNT(table_name) " + "FROM all_tables " + "WHERE table_name = '" + table + "' ");

            PreparedStatement insert_ps = db.prepareStatement("INSERT INTO " + table + " "
                    + "(TMDB_ID, IMDB_ID, ORIGINAL_TITLE, TITLE_DE, BUDGET, REVENUE, RELEASE_DATE) "
                    + "VALUES (?,?,?,?,?,?,?)");

            int tablelike_int = 0;
            while (tablelike.next())
                tablelike_int = tablelike.getInt(1);

            if (tablelike_int == 0)
                db.processInsert(createtable.create);

            else {


                TmdbMovies movies = new TmdbApi("XXX").getMovies();


                MovieDb latest_movie = movies.getLatestMovie();
                int tmdb_max_id = latest_movie.getId();

                try {



                    int id_exist = 0;


                    for (int i = 1; i < tmdb_max_id; i++) {

                        ResultSet id_existq = db
                                .processQuery("SELECT (tmdb_id) FROM " + table + " WHERE tmdb_id = " + i);
                        while (id_existq.next())
                            id_exist = id_existq.getInt(1);

                        if (id_exist == 0) {

                            try {

                                MovieDb movie_name_en = movies.getMovie(i, "en");
                                MovieDb movie_name_de = movies.getMovie(i, "de");
                                String original_title = movie_name_en.getOriginalTitle();
                                String title_de = movie_name_de.getTitle();
                                String imdb_id = movie_name_en.getImdbID();
                                int budget_en = (int) movie_name_en.getBudget();
                                int revenue_en = (int) movie_name_en.getRevenue();
                                String release_date_en = movie_name_en.getReleaseDate();

                                insert_ps.setInt(1, i);
                                insert_ps.setString(2, imdb_id);
                                insert_ps.setString(3, original_title);
                                insert_ps.setString(4, title_de);
                                insert_ps.setInt(5, budget_en);
                                insert_ps.setInt(6, revenue_en);
                                insert_ps.setString(7, release_date_en);

                                insert_ps.executeUpdate();

                                /** Start Output **/

                                double percent = (i * 100) / tmdb_max_id;

                                StringBuilder string = new StringBuilder(140);
                                int percent_int = (int) percent;
                                long total = (long) tmdb_max_id;
                                long current = (long) i;
                                string.append('\r').append(String.join("",
                                        Collections.nCopies(percent_int == 0 ? 2 : 2 - (int) (Math.log10(percent_int)),
                                                " ")))
                                        .append(String.format(" %d%% [", percent_int))
                                        .append(String.join("", Collections.nCopies((percent_int / 2), "=")))
                                        .append('>')
                                        .append(String.join("",
                                                Collections.nCopies((100 / 2) - (percent_int / 2), " ")))
                                        .append(']')
                                        .append(String.join("",
                                                Collections.nCopies(
                                                        (int) (Math.log10(total)) - (int) (Math.log10(current)), " ")))
                                        .append(String.format(" %d/%d | TMDB_ID: %d | Movie: %s", current, total, i,
                                                original_title));

                                System.out.flush();
                                System.out.print(string);

                                /** End Output **/

                                i++;

                                tmdb_max_id = latest_movie.getId();

                            } catch (RuntimeException e) {

                                continue;
                            } catch (SQLException sqle) {
                                System.err.println(sqle + " SQL ERROR at movie with ID" + i);
                                throw sqle;
                            } finally {
                                id_existq.close();
                                insert_ps.close();
                                tablelike.close();
                            }

                        } else
                            i++;

                    }

                } catch (SQLException sqle2) {
                    throw sqle2;
                } catch (RuntimeException e2) {
                    throw e2;
                } finally {

                    insert_ps.close();
                    tablelike.close();
                }
            }

            db.disconnect();
        } catch (SQLException sqle_con) {
            throw sqle_con;

        }

        catch (ClassNotFoundException clnf) {
            throw clnf;

        } finally {


        }
    }

}

執行時,我收到ORA-00604和ORA-01000。

Exception in thread "main" java.sql.SQLException: ORA-00604: Fehler auf rekursiver SQL-Ebene 1
ORA-01000: Maximale Anzahl offener Cursor überschritten
ORA-00604: Fehler auf rekursiver SQL-Ebene 1
ORA-01000: Maximale Anzahl offener Cursor überschritten
ORA-01000: Maximale Anzahl offener Cursor überschritten

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:195)
    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:876)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1498)
    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406)
    at database.DatabaseConnect.processQuery(DatabaseConnect.java:31)
    at tmdb_api_to_db.Movies3.execute_to_db(Movies3.java:75)
    at tmdb_api_to_db.Main.main(Main.java:22)

我非常確定,出現問題是因為我對那些try-catch-finally結構(尤其是在關閉我的語句時)產生了謬誤,但是找不到我的錯誤,我只是感覺就像是一條狗在追尾巴...

我正在Java 8和Oracle 11g上使用Eclipse Neon2。 如果需要進一步的信息,我很樂意提供。 如果我的問題讓您感到不適,請考慮一下我不是很有經驗,因此可以原諒... :)

錯誤消息翻譯成英文說

Maximum number of open cursors exceeded

問題在於您正在泄漏游標。 一種可能發生這種情況的地方是內部for循環。

當身體

if (id_exist == 0) {

如果未執行,則永遠不會執行try / finally應該關閉ResultSet位置。 那會泄漏游標。 最終,Oracle不會再讓您打開...

我建議您閱讀從Java 7開始支持Java構造的“嘗試資源”。

它使您可以編寫更易於閱讀且不易出錯的資源清理代碼。


另外,如果您發現有一種方法,其中大多數代碼的縮進深度為9級。 這應該向您發出信號,表明您需要對其進行重構。 說真的,你不需要做所有這一切在一個單一的整體方法。 首先,重構代碼將使您(以及其他所有人)更容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM