IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Suppression de CLOB Oracle avec les objets FilteredRowSet


Sujet :

JDBC Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut Suppression de CLOB Oracle avec les objets FilteredRowSet
    Bonjour,

    En utilisant le code ci dessous qui fonctionne,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FilteredRowSet rs = rsFactory.createFilteredRowSet();
    rs.setUrl(reader.getUrl());
    rs.setUsername(reader.getUser());
    rs.setPassword(reader.getPassword());
     
    rs.setCommand("SELECT * FROM table WHERE id= 10");
    rs.execute();
     
    ...
     
    rs.deleteRow();
    rs.setFilter(null);
    rs.acceptChanges();
    lorsque dans ma table Oracle 11 je rajoute un champ de type CLOB, j'obtiens une exception de type SyncProviderException

    Y'a t'il une spécificité pour gérer la suppression des rowsset contenant des types CLOB ?

    Merci

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Je ne sais pas pour l'utilisation des RowSet (d'ailleurs, tu es le premier que je vois à utiliser l'API rowset pour manipuler des données, donc déjà, bravo !)

    Par contre, ce que je sais, c'est que j'ai déjà eu le soucis dans l'utilisation de CLOB/BLOB quand on voulait faire des insertions/suppression.
    La technique qu'on avait trouvé pour corriger le problème était le suivant :

    - Pour l'insertion : insérer les valeurs avec le CLOB vide, puis faire un update
    - Pour la suppression : faire un update pour passer le CLOB à null, puis faire un delete


    Sinon, ce que tu peux faire, c'est voir dans ton SynchProviderException l'objet SyncResolver associé qui permet de voir/résoudre le problème
    Y'a un exemple de code dans l'API : http://docs.oracle.com/javase/7/docs...cResolver.html
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Merci pour la réponse, effectivement

    - en positionnant les données du CLOB à NULL (rs.updateNull),
    - en validant le rowset (rs.acceptChanges())
    - en réexecutant le rowset ( rs.execute() )
    - en supprimant tout ce qui est null rs.deleteRow();
    - en validant à nouveau le rowset (rs.acceptChanges())
    cela fonctionne... bon ca fait une execution de requete en plus

    c'est trop récent pour utiliser les RowSet ? Je suis en Java 8 update 45 car c'est un nouveau développement.

    J'ai essayé de gérer les erreurs de conflits mais je comprends rien pour le moment.

    J'ai également une autre anomalie avec un champ DATE Oracle qui est autorisé à la valeur NULL mais je suis obligé de mettre une valeur pour que la validation des changements du RowSet fonctionne !

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par MrEddy Voir le message
    cela fonctionne... bon ca fait une execution de requete en plus
    Si tu trouves une autre solution, je suis preneur, je te jure qu'on s'y est mis à plusieurs à chercher une autre solution (même si une fois qu'on en a trouvé une qui marche on a eu tendance à ne plus trop chercher plus loin)
    Une requête de plus, tant que ça passe par un index, ça va vite. C'est pas ça qui va te pourrir tes perf !

    c'est trop récent pour utiliser les RowSet ? Je suis en Java 8 update 45 car c'est un nouveau développement.
    Ca date de Java 1.4 les rowset, mais à l'époque, les frameworks comme hibernate étaient déjà bien développés et on avait tendance à préférer les ORM plutôt que l'API JDBC. D'où un faible intérêt et une faible connaissance des développeurs sur les possibilités du rowset !
    Donc non, pas trop récent, bien au contraire !


    J'ai également une autre anomalie avec un champ DATE Oracle qui est autorisé à la valeur NULL mais je suis obligé de mettre une valeur pour que la validation des changements du RowSet fonctionne !
    Essayes avec la méthode setNull (parce que je suppose que tu fais un setDate(null), ce qui ressemble à ce que tu veux faire, mais qui derrière n'a pas le même effet : toutes les bases de données ne gèrent pas les champs null de la même façon !)
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    La méthode setNull me génére une exception de type SQLFeatureNotSupportedException.

    Si tu es sous Oracle, est ce que tu as essayé d'utiliser la classe oracle.jdbc.rowset.OracleXXXXXXXRowSet avec le driver ojdbc6.jar ? Pour moi cela me corrige les anomalies avec les suppressions de Clob et la mise à null des champs Date.

    Bon par contre ca me rajoute d'autres anomalies...

  6. #6
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Normalement, tu es pas censé utiliser directement les implémentations de rowset propres à ton driver.... Mais bon, si ça marche..

    Ensuite, j'ai pas de quoi tester sous la main (je ne suis plus sur le projet où on avait le soucis), donc je ne peux pas te dire si ça corrige le problème pour moi ^^

    C'est quoi les autres problèmes que ça génère?
    Je ne suis pas mort, j'ai du travail !

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Oui ca marche plutot bien, excepté un problème lors de l'appel de la méthode next() et de l'utilisation d'un predicate pour filtrer les données du rowset.

    Le predicate est appelé même si next() retourne false, c'est à dire même lorsque le rowset est positionné aprés la derniere ligne. Donc cela génère une exception dans mon code que je n'ai pas avec les FilteredRowSet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Override
    public boolean evaluate(RowSet rs)
    {
    		try
    		{
    			//System.out.println("Eval 1");
    			return rs.getInt(champFiltre) == idFiltre;
    		}
    		catch (SQLException e)
    		{
    			// TODO, avec l'utilisation de OracleFilteredRowSet, Exception générée lors de l'appel du dernier next...
    			//e.printStackTrace();
    			return false;
    		}
    }
    Ce n'est peut être pas propre mais dans les exemples trouvés sur internet il faut catcher l'exception et retourner false.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/05/2010, 08h44
  2. Dupliquer un TList avec les objets associés
    Par declencher dans le forum Delphi
    Réponses: 5
    Dernier message: 08/11/2006, 12h34
  3. Connection a DB Oracle avec les drivers natif
    Par Psykotik dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 07/09/2006, 12h30
  4. Réponses: 1
    Dernier message: 21/10/2005, 14h08
  5. Pb avec les objets???
    Par bliml dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/04/2005, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo