Kraft Oracle Drop Globale Temporäre Tabelle

In unserem Projekt ich erstellen, eine Globale temporäre Tabelle wird wie diese:

CREATE GLOBAL TEMPORARY TABLE v2dtemp (
  id           NUMBER,
  GOOD_TYPE_GROUP       VARCHAR2(250 BYTE),
  GOOD_CODE             VARCHAR2(50 BYTE),
  GOOD_TITLE            VARCHAR2(250 BYTE)
)
ON COMMIT PRESERVE ROWS;

aber das problem kommt, wenn ich möchte, dass diese drop-Tabelle.
Oracle wird nicht lassen Sie mich löschen Sie die Tabelle, und er sagt:

ORA-14452: attempt to create, alter or drop an index on temporary table already in use

Habe ich diese Tabelle in einigen Verfahren, aber es kann geändert werden, angewiesen auf andere Berichte. Also sollte ich immer die Tabelle löschen dann sollte ich es neu mit meine benötigten Felder.

Ich habe dies für ein Geschäft Gründen, so ist es nicht möglich für mich zu verwenden, - Tabellen oder andere Dinge. Ich kann nur temp-Tabellen.
Ich habe versucht on commit delete rows, aber wenn ich Anrufe, mein Verfahren zu verwenden, die Daten in dieser Tabelle gibt es keine weiteren Zeilen mehr in der Tabelle und Sie wurden gelöscht.

Jedem hilft, wird sehr geschätzt,
vielen Dank im Voraus

///EDIT

public void saveJSONBatchOpenJobs(final JSONArray array, MtdReport report) {
    dropAndCreateTable();
    String sql = "INSERT INTO v2d_temp " +
            "(ID, KARPARDAZ, GOOD_TYPE_GROUP, GOOD_CODE, GOOD_TITLE, COUNT, "
            + "FACTOR_COUNT, GHABZ_COUNT, DEAL_NO, DEAL_DATE, REQUEST_NO, REQUEST_DATE, "
            + "REQUEST_CLIENT, STATUS, TYPE, MTDREPORT_ID, GEN_SECURITY_DATA_ID) " +
            "VALUES (MTD_KARPARDAZ_OPEN_JOBS_SEQ.nextval,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {

        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            JSONArray values = array.getJSONArray(i);
            if(!values.get(0).equals("null"))
                ps.setString(1, values.get(0).toString());
            else
                ps.setNull(1, Types.VARCHAR);
            if(!values.get(1).equals("null"))
                ps.setString(2, values.get(1).toString());
            else
                ps.setNull(2, Types.VARCHAR);
            if(!values.get(2).equals("null"))
                ps.setString(3, values.get(2).toString());
            else
                ps.setNull(3, Types.VARCHAR);
            if(!values.get(3).equals("null"))
                ps.setString(4, values.get(3).toString());
            else
                ps.setNull(4, Types.VARCHAR);
            if(!values.get(4).equals("null"))
                ps.setBigDecimal(5, new BigDecimal(values.get(4).toString()));
            else
                ps.setNull(5, Types.NUMERIC);
            if(!values.get(5).equals("null"))
                ps.setBigDecimal(6, new BigDecimal(values.get(5).toString()));
            else
                ps.setNull(6, Types.NUMERIC);
            if(!values.get(6).equals("null"))
                ps.setBigDecimal(7, new BigDecimal(values.get(6).toString()));
            else
                ps.setNull(7, Types.NUMERIC);
            if(!values.get(7).equals("null"))
                ps.setString(8, values.get(7).toString());
            else
                ps.setNull(8, Types.VARCHAR);
            if(!values.get(8).equals("null"))
                ps.setDate(9, new Date(new Timestamp(values.getLong(8)).getDateTime()));
            else
                ps.setNull(9, Types.DATE);
            if(!values.get(9).equals("null"))
                ps.setString(10, values.get(9).toString());
            else
                ps.setNull(10, Types.VARCHAR);
            if(!values.get(10).equals("null"))
                ps.setDate(11, new Date(new Timestamp(values.getLong(8)).getDateTime()));
            else
                ps.setNull(11, Types.DATE);
            if(!values.get(11).equals("null"))
                ps.setString(12, values.get(11).toString());
            else
                ps.setNull(12, Types.VARCHAR);
            if(!values.get(12).equals("null"))
                ps.setString(13, values.get(12).toString());
            else
                ps.setNull(13, Types.VARCHAR);
            if(!values.get(13).equals("null"))
                ps.setString(14, values.get(13).toString());
            else
                ps.setNull(14, Types.VARCHAR);
            if(!values.get(14).equals("null"))
                ps.setLong(15, new Long(values.get(14).toString()));
            else
                ps.setNull(15, Types.NUMERIC);
            if(!values.get(15).equals("null"))
                ps.setLong(16, new Long(values.get(15).toString()));
            else
                ps.setNull(16, Types.NUMERIC);
        }

        @Override
        public int getBatchSize() {
            return array.size();
        }
    });

    String bulkInsert = "declare "
            + "type array is table of d2v_temp%rowtype;"
            + "t1 array;"
            + "begin "
            + "select * bulk collect into t1 from d2v_temp;"
            + "forall i in t1.first..t1.last "
            + "insert into vertical_design values t1(i);"
            + "end;";
    executeSQL(bulkInsert);
}

private void dropAndCreateTable() {
    String dropSql = "declare c int;"
            + "begin "
            + "select count(*) into c from user_tables where table_name = upper('v2d_temp');"
            + "if c = 1 then "
            + "truncate table v2d_temp"
            + "drop table v2d_temp;"
            + " end if;"
            + "end;";
    executeSQL(dropSql);

    String createSql = "CREATE GLOBAL TEMPORARY TABLE v2d_temp (\n"
            + "DEAL_ID               NUMBER,\n"
            + "id           NUMBER,\n"
            + "karpardaz  VARCHAR2(350),\n"
            + "GOOD_TYPE_GROUP       VARCHAR2(250 BYTE),\n"
            + "GOOD_CODE             VARCHAR2(50 BYTE),\n"
            + "GOOD_TITLE            VARCHAR2(250 BYTE),\n"
            + "COUNT                 NUMBER,\n"
            + "FACTOR_COUNT          NUMBER,\n"
            + "GHABZ_COUNT           NUMBER,\n"
            + "DEAL_NO               VARCHAR2(50 BYTE),\n"
            + "DEAL_DATE             DATE,\n"
            + "REQUEST_NO            VARCHAR2(50 BYTE),\n"
            + "REQUEST_DATE          DATE,\n"
            + "REQUEST_CLIENT        VARCHAR2(250 BYTE),\n"
            + "STATUS                VARCHAR2(250 BYTE),\n"
            + "TYPE                  VARCHAR2(250 BYTE),\n"
            + "GEN_SECURITY_DATA_ID  NUMBER(10),\n"
            + "MTDREPORT_ID          NUMBER\n"
            + ")\n"
            + "ON COMMIT PRESERVE ROWS";
    executeSQL(createSql);
}

private void executeSQL(String sql) {
    Connection con = null;
    try {
        con = getConnection();
        Statement st = con.createStatement();
        st.execute(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Globale temporäre Tabellen sollen nicht so genutzt werden. Sie sollten definiert werden als ein Teil des Schemas und Ihre Strukturen sollten nicht ändern, die mit jeder Verwendung/Ausführung des Programms. Wenn Sie mehrere Programme mit temporären Speicher definieren Sie Globale temporäre Tabelle für jede Daten-Struktur, die Sie brauchen. Sie können auch verwenden subquery factoring in Ihrer Abfrage können die temporäre Tabelle in der bacground oder Kraft, die es (mit einigen Einschränkungen) die Verwendung von /*+ materialize */ hint.
Mein Chef besteht darauf, mich mit diesem Weg, temp Tabellen und etc. also ich habe keine andere Wahl. Es ist der zweite Tag ich bin auf der Suche nach anderen Möglichkeiten, die Verwendung von temp-Tabellen und die Verwendung der Daten in anderen Abschnitten, können Sie mich zu einigen anderen Arten?
Dann wird Ihr Chef nicht verstehen, wie Oracle funktioniert.
Einen anderen job suchen. Sie werden nicht lernen, etwas von Wert gibt.
vielleicht hast du Recht, aber jetzt, in diesem moment muss ich einen Weg finden, um dieses problem zu lösen, er wird fortbestehen, dass es einen Weg gibt, um dies zu tun, und wenn ich erklären mehr detail, dass es keine Möglichkeit gibt, dies zu tun durch die temp-Tabellen, die ich ihm mehr wütend und er denkt, dass ich nicht weiß, mit was oracle jetzt! Ich erklärte, mehr details in der ersten Antwort die Kommentare, wenn Sie eine Idee haben über, wie kann ich erzwingen, oracle, legen Sie einige temp-Tabelle ohne Berücksichtigung der anderen session-Daten, ich werde so dankbar, wenn Sie teilen es mit mir.

InformationsquelleAutor Naeem Baghi | 2015-09-06

Schreibe einen Kommentar