2 votes

Pourquoi ORA_ROWSCN peut être utilisé dans une clause SELECT mais pas dans une clause GROUP BY ?

Aujourd'hui j'ai trouvé un sql pour vérifier la modification d'une table, cela ressemble à ce qui suit :

SELECT MODEL_ID, STATUS_ID, COUNT(*) as QUANTITY, ORA_ROWSCN as CHANGE_NUM
FROM DEVICE 
GROUP BY MODEL_ID, STATUS_ID

Lorsque j'ai ajouté un enregistrement à la table DEVICE, la QUANTITÉ du résultat a augmenté mais CHANGE_NUM n'a pas changé.

J'ai ensuite été surpris de constater que ORA_ROWSCN ne faisait pas partie de la clause GROUP BY. Est-ce parce que ORA_ROWSCN est une pseudo-colonne ?

Lorsque j'ai changé ORA_ROWSCN a MAX(ORA_ROWSCN) le CHANGE_NUM a augmenté comme prévu.

Quel est donc l'ORA_ROWSCN que nous avons obtenu dans le premier sql ? Le premier numéro de changement d'un groupe ? Et quelle est la signification de cette utilisation ?

PS : J'utilise Oracle Database 11g

2voto

APC Points 69630

"J'ai été surpris de constater que ORA_ROWSCN ne faisait pas partie de la clause GROUP BY. est-ce parce que ORA_ROWSCN est une pseudo-colonne ?"

Oui, vous pouvez remplacer ORA_ROWSCN par une autre pseudo-colonne comme SYSDATE et votre requête fonctionnera toujours.

"Lorsque j'ai ajouté un enregistrement à la table DEVICE, la QUANTITÉ du résultat a augmenté. a augmenté mais CHANGE_NUM n'a pas changé"

Selon le la documentation , "Oracle suit les SCN par transaction engagé pour l'îlot dans lequel se trouve la rangée". (souligné par moi). Donc, si vous ne suivez pas le SCN avec ROWDEPENDENCIES (et c'est le cas par défaut), la valeur que vous verrez pour ORA_ROWSCN est le SCN de la dernière transaction validée. Le CHANGE_NUM ne changera pas jusqu'à ce que quelqu'un (pas nécessairement vous) émette un COMMIT.

Notez que si vous aviez utilisé une table avec des ROWDEPENDENCIES, la fonction ORA_ROWSCN aurait renvoyé un résultat nul, jusqu'à ce que vous émettiez un commit.

Dans les deux cas, lorsque vous exécutez une requête agrégée, la valeur de ORA_ROWSCN est le maximum pour le bloc (ou la table - je pense - lorsque vous utilisez ROWDEPENDENCIES).

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X