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

SQL Oracle Discussion :

Rownum - sélection de la Mième à la Nième valeur


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut Rownum - sélection de la Mième à la Nième valeur
    Bonjour à tous,

    J'ai un soucis de requête SQL avec Oracle dans une application J2EE (utilise Hibernate). Je souhaite retourner les éléments d'une table de la 10ème à la 20ème valeur. Après de nombreuses tentatives, je suis tombé sur la méthode de SheikYerbouti (Rédacteur/Modérateur) sur un forum. J'ai appliqué cette méthode à mon cas mais le caractère "*" n'est pas reconnu! Au lancement de l'appli, Hibernate crache :

    Erreur d'hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    org.hibernate.hql.ast.QuerySyntaxException
    unexpected token: *
    Requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select * from (Select o, rownum r from " + MonEJB.class.getName() + " As o) Where r between 9 and 21";
    L'utilisation d'un EJB (MonEJB) peut-il être la cause du problème? C'est pas bizarre qu'Hibernate ne reconnaisse pas un "*"?

    Aidez moi svp

    Merci

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Avez-vous essayé un query plus simple de type :
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'ai essayé et le lancement de l'appli crache la même erreur (org.hibernate.hql.ast.QuerySyntaxException).

    Avant cette évolution, la query simple suivante fonctionnait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select o from " + MonEJB.class.getName() + " As o";
    L'utilisation d'un EJB comme table complique les choses. D'ailleurs, si j'en suis là c'est que je n'en ai pas comprit le fonctionnement. Pour obtenir les n premières valeurs, la query suivante marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select o from " + MonEJB.class.getName() + " As o Where rownum < n";
    C'est pour obtenir les valeurs du Mième au Nième rang que ça pose problème et la query "naive" suivante plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select o from " + MonEJB.class.getName() + " As o Where rownum between m and n";

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Voici une syntaxe bien optimisée pour ce type de requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ( select subreq.*, rownum r from ( select * from EMP ) subreq where rownum <= num_fin) where r >= num_deb ;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Même la requête simple ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select * from " + MonEJB.class.getName();
    De ce fait, y a-t-il une chance pour que la requête optimisée que tu viens de me donner marche?

    Avez-vous utilisé des EJB avec Oracle? En fait, je suis parti avec des requêtes générées par NetBeans qui utilise des "As" pour remplacer les "*".

    Ce qui est bizarre c'est que la requête count(*) passe sans problème. Je n'y comprends rien, aidez moi...

    Requête count(*) qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "Select count(*) from " + MonEJB.class.getName();

  6. #6
    Invité
    Invité(e)
    Par défaut
    si tu nommes explicitement les colonnes de ta requête, est-ce que ça fonctionne ?
    cad, passer de : select * from table ==> select col1, col2 from Table

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Oué cette requête marche mais ça me fait un ClassCastException plus loin, normal vu que je n'ai pas rapatrié toutes les colonnes.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    SheikYerbouti, en plus, je n'est pas la possibilité de faire des requêtes imbriquées puisque j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    org.hibernate.hql.ast.QuerySyntaxException
      unexpected token: ( near line 1, column 15 [Select o from (Select o from monpackage.MonEJB o) Where rownum between 0 and 11]
    Pour la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select o from (Select o from monpackage.MonEJB o) Where rownum between 0 and 11

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Et bien, il est très limité votre hibernate
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

Discussions similaires

  1. Récuperer la nième valeur d'un nombre
    Par SonnyFab dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/08/2010, 15h14
  2. Réponses: 4
    Dernier message: 29/06/2010, 13h46
  3. [Toutes versions] Sélection sur une partie de la valeur avec InputBox
    Par lenul78570 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/03/2010, 11h54
  4. Sélection de lignes qui ont des valeurs maximales
    Par sicnarf dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/10/2008, 15h42
  5. [SQL] Sélection selon un paramètre contenant plusieurs valeurs
    Par rainbow14 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 21/05/2007, 16h15

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