1
votes

Ceci n'est pas un groupe par expression

Donc, tout d'abord, j'utilise ORM pour me connecter et obtenir des données d'Oracle DB.

Quand j'appelle ma procédure stockée à partir d'un outil de gestion de base de données, tout fonctionne bien.

Le problème commence quand je veux exécuter ceci à partir de mon ORM. Cela donne une erreur:

ORA-00979: ce n'est pas un groupe par expression .

Normalement, cela se produit lorsque les données ne sont pas agrégées ou constantes, n'apparaissent pas dans un groupe par clausule.

La requête est incluse dans la procédure stockée, donc c'est la même chose chaque fois que j'essaie de l'exécuter, et elle contient tout le nécessaire dans un groupe par clausule.

Je me connecte même au même utilisateur oracle. J'ai aussi fait quelques traces, mais il n'y avait rien d'étrange.

La requête ressemble à:

for rec in (
    select t1.field1,
          t1.field2,
          t1.field3,
          t1.field4,
          t1.field5,
          t1.version,
          sum(nvl(t1.liczba2,0)) as left_to_dispatch
        from table_1 t1 
        group by
          t1.field1,
          t1.field2,
          t1.field3,
          t1.field4,
          t1.field5,
          t1.version)
      loop 
        null; 
      end_loop;

La question est: y a-t-il des paramètres que ORM peut définir dans la base de données (plutôt en session), cela peut entraîner une telle erreur?

Btw. j'ai essayé de remplacer le décodage en cas: j'ai eu la même erreur.

J'ai essayé de remplacer le décodage en NVL, j'ai eu la même erreur.

Mais les erreurs provenaient uniquement de cet outil ORM, quand j'ai essayé de l'exécuter à partir de PLSQL Developer, tout fonctionnait bien.

Des idées?

PS. Lorsque je change de requête en une requête comme celle-ci, ORM fonctionne correctement:

 for rec in (
select t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      decode(parameter,'T',nvl(t1.version, '-'),t1.version),
      sum(nvl(t1.liczba2,0)) as left_to_dispatch
    from table_1 t1 
    group by
      t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      decode(parameter,'T',nvl(t1.version, '-'),t1.version)) 
  loop 
    null; 
  end_loop;


2 commentaires

Quel est votre outil ORM? Nous devons probablement le savoir. Veuillez également inclure le code correspondant à l'endroit où vous appelez cette requête.


fait quelques modifications.


3 Réponses :


-1
votes

peut-être avez-vous oublié la virgule après decode (paramètre, 'T', nvl (t1.version, '-'), t1.version)

decode (paramètre, 'T', nvl (t1.version, '-'), t1.version), sum (nvl (t1.liczba2,0)) comme left_to_dispatch


1 commentaires

s'il vous plaît lire le centre d'aide pour une bonne réponse ... stackoverflow.com/help



1
votes

decode () est une ancienne fonction Oracle, que votre ORM a peut-être du mal à interpréter. Pourquoi ne pas utiliser à la place case ? C'est du SQL standard et peut donc être plus facile à gérer pour l'ORM.

select t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end,
      sum(nvl(t1.liczba2,0)) as left_to_dispatch
    from table_1 t1 
    group by
      t1.field1,
      t1.field2,
      t1.field3,
      t1.field4,
      t1.field5,
      case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end

Notez que j'ai également remplacé nvl () par la fonction SQL standard coalesce () . Il n'y a rien de mal à utiliser les anciennes fonctions d'Oracle: Oracle les prend toujours en charge. Cependant, ils datent d'une époque où Oracle innovait SQL plus rapidement que le comité ANSI ne pouvait suivre. En règle générale, les outils tiers «indépendants de la base de données» fonctionnent mieux avec le SQL standard qu'avec le SQL spécifique au produit.


2 commentaires

essayé +/- exactement ce que vous avez fait ici, et le cas ne fonctionne pas aussi. Cela ressemble à un bug ... J'ai juste essayé exactement ce que vous avez fait, et encore une fois la même situation: erreur dans ORM, pas d'erreur dans PLSQL Developer.


J'ai également voté pour votre réponse, car en effet ORM a des problèmes pour interpréter quoi que ce soit au-dessus du champ normal dans groupe par clausule. Je vous remercie pour vos efforts.



1
votes

Je soupçonne que vos deux instructions decode () ne sont pas exactement les mêmes. Ma recommandation est que vous utilisiez une sous-requête et que vous n'ayez pas à répéter l'expression.

Je préfère également case et coalesce () (constructions SQL standard) , donc:

select t1.field1, t1.field2, t1.field3, t1.field4, t1.field5, new_version,
       sum(coalesce(t1.liczba2, 0)) as left_to_dispatch
from (select t1.*
             (case when parameter = 'T' then coalesce(t1.version, '-') else t1.version end) as new_version
      from table_1 t1 
     ) t1
group by t1.field1, t1.field2, t1.field3, t1.field4, t1.field5, new_version;


2 commentaires

hmm, peut-être que d'une manière ou d'une autre, ORM voit ces décodages d'une autre manière que mes yeux et d'autres outils. Vous m'avez donné une bonne idée, je vérifie ça.


Eh bien, comme il n'y a aucun doute sur le fait qu'il y a quelque chose qui ne va pas avec l'ORM, et je suppose qu'il est inutile de deviner ce qui pourrait ne pas fonctionner sans connaître le code interne, je marque votre réponse comme une réponse qui résout le problème. Désormais, les requêtes retournent les mêmes résultats qu'auparavant et fonctionnent dans les deux outils. Merci pour l'aide!