2010-03-02 6 views
4

Je base de données Oracle 10gR2 avec table IOT dans le secteur:Impossible de mettre à jour la table Oracle IOT avec la méthode JBDC updateRow

create table countries (
id number primary key, 
name varchar2(30) not null enable 
) organization index; 

J'essaie de mettre à jour les valeurs de la table avec ce code Java (version 1.6):

Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
        ResultSet.CONCUR_UPDATABLE); 

ResultSet src = stmt.executeQuery("select id, name from countries"); 

src.next(); 

src.updateString("name", "__test__"); 
src.updateRow(); 

Mais updateRow lève SQLException (ORA-01410: ROWID non valide). Si j'essaye de mettre à jour une table de tas (ordinaire) - tout fonctionne.

J'ai utiliser ce code avec différentes versions de pilotes Oracle (d'ici http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html)

Après quelques recherches, j'ai détecté que IOT et table HEAP ont format différent de rowids:

IOT exemple * BAJzKgwCwRb +

exemple HEAP AAAbgVAAJAAMyr8AAA

Mais je ne sais pas encore comment résoudre ce problème. Avez-vous des idées?

Répondre

1

Pouvez-vous obtenir les résultats d'une trace SQL étendue de votre requête pour voir ce que fait JDBC sous les couvertures? Je pense qu'il est tentant de faire

UPDATE COUNTRIES SET NAME = '__TEST__' WHERE ROWID = :rowid_fetched

et signifie ROWID quelque chose de totalement différent dans Oracle IOT; ce n'est pas l'adresse immuable d'une rangée, mais une estimation quant au chemin vers la rangée. Ma recommandation sur la façon de procéder consiste à propager un champ d'horodatage généré par le système sur toutes vos tables, et à l'utiliser pour le contrôle des accès concurrents plutôt que de déclarer un jeu d'enregistrements pouvant être mis à jour. dans le jeu d'enregistrements.

Ensuite, votre application chercher l'ensemble de lignes comme d'habitude, mais les déclarations d'émission comme:

UPDATE COUNTRIES SET NAME = '__TEST__' WHERE MOD_TS = :mod_ts_fetched

pour donner le verrouillage optimiste sans état.

+0

Trace est une excellente idée! Merci! A propos de votre idée de contournement: merci, mais je n'ai pas besoin de solution de contournement, je veux comprendre pourquoi ce n'est pas le travail. Est-ce un bug ou une restriction de mise en œuvre ou juste mon erreur. – glebreutov

1

On dirait que votre table n'a pas vraiment besoin d'être IOT. Je suggère que vous le recréer comme une table normale et ajouter l'index sur l'identification et le nom. Même performance, même logique, aucun problème ROWID.

+0

Merci pour la solution de contournement mais je veux comprendre pourquoi ce n'est pas le travail. Est-ce un bug ou une restriction de mise en œuvre ou juste mon erreur. – glebreutov

+0

Je n'ai pas travaillé avec Java mais il y a probablement un paramètre qui permute entre "UPDATE BY ROWID" et "UPDATE BY PRIMARY KEY" ou quelque chose comme ça. – jva

Questions connexes