Force Oracle Baisse Globale De La Table Temporaire

Dans notre projet, j'ai créer une certaine mondial de la table temporaire qui sera comme celles-ci:

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;

mais le problème vient quand je veux supprimer ce tableau.
Oracle ne sera pas me laisser tomber de la table, et il dit:

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

- Je utiliser cette table dans une procédure, mais il peut être changé dépendants à d'autres rapports. Donc je doit toujours tomber de la table puis je doit le recréer avec mon champs nécessaires.

- Je utiliser pour des raisons d'affaires de sorte qu'il n'est pas possible pour moi d'utiliser des tableaux ou d'autres choses. Je peux juste utiliser des tables temporaires.
J'ai essayé de commettre supprimer des lignes, mais quand je l'appelle ma procédure à suivre pour utiliser les données de ce tableau il n'y a plus de lignes dans la table et ils ont été supprimés.

Toute aide sera grandement appréciée,
merci d'avance

///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();
}
}
}
}
Les tables temporaires globales ne sont pas censés être utilisés de cette manière. Ils devraient être définie comme une partie de schéma et de leurs structures ne devrait pas changer à chaque utilisation/l'exécution du programme. Si vous avez plusieurs programmes à l'aide de stockage temporaire de définir la table temporaire globale pour chaque structure de données dont vous avez besoin. Vous pouvez également utiliser une sous-requête de l'affacturage dans votre requête, ce qui peut créer une table temporaire dans le bacground ou de force (avec certaines limitations) à l'aide de /*+ matérialiser */ hint.
Mon patron insiste pour que je l'utilise de cette façon, tables temporaires et etc. donc je n'ai pas d'autres choix. C'est le deuxième jour, je suis à la recherche d'une autre façon qu'à l'aide de tables temporaires et d'utiliser les données dans d'autres sections, pouvez-vous me guider pour certains d'autres moyens?
Alors que votre patron ne comprends pas comment Oracle fonctionne.
Chercher un autre emploi. Vous n'apprendrez rien de valeur.
peut-être que vous avez raison, mais maintenant, en ce moment, je dois trouver un moyen de résoudre ce problème, il est persistant qu'il y a une manière de le faire, et quand je l'ai expliquer plus en détail qu'il n'y a aucun moyen de le faire par le biais de tables temporaires, je lui fais encore plus en colère, et il est à penser que je ne sais rien à propos de l'oracle! J'ai expliqué plus en détails dans la première réponse de commentaires, si vous avez la moindre idée sur comment puis-je forcer oracle de perdre du temp table sans tenir compte d'autres de la session de données, je serai très reconnaissante si vous le partager avec moi.

OriginalL'auteur Naeem Baghi | 2015-09-06