Pourquoi un ORA-12054 erreur se produit lors de la création de cette simple vue matérialisée exemple?
ALTER TABLE RECORDINGS ADD PRIMARY KEY (ID);
CREATE MATERIALIZED VIEW LOG ON RECORDINGS TABLESPACE USERS NOLOGGING;
DROP MATERIALIZED VIEW REC_SEARCH_TEST;
CREATE MATERIALIZED VIEW REC_SEARCH_TEST
REFRESH COMPLETE ON COMMIT
AS (
SELECT DISTINCT ID, TITLE FROM RECORDINGS
);
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
Ne peut pas comprendre ce qui est mal, je sais que si je sors la clause DISTINCT, il fonctionne, mais pourquoi ne puis-je pas utiliser "DISTINCTS" si je précise "ACTUALISER COMPLÈTE SUR COMMIT' qui est nécessaire.
Si j'utilise DISTINCTES et de les ACTUALISER sur demande, il n'y a pas de problème, mais ce ne sont pas les exigences.
- Vous avez un index unique. Il n'y a pas besoin de l'distinctes pourquoi s'embêter avec ça?
- Peut-être l'exemple n'est pas le meilleur, parce que je veux élargir la vue d'une plus compliqué requête qui va exiger un mot clé distinct, pour l'instant, je suis juste essayer de le faire fonctionner sur un niveau de base.
- Le
DISTINCT
n'a aucun sens du tout. LeID
colonne dans la sélection sera la cause de toutes les lignes distinctes toujours.
Vous devez vous connecter pour publier un commentaire.
Semble que, avec l'ajout de l'DISTINCTS, vous avez fait votre point de vue sous-jacent de SQL inadmissible pour un rafraîchissement rapide, et donc pas la possibilité d'être utilisé avec SUR VALIDER (même quand vous spécifiez l'actualisation complète au lieu de rafraîchissement rapide). De Oracle docs:
Tableau 8-4 Actualisation Des Modes De
LORS DE LA VALIDATION
SUR DEMANDE
Le même document lien a une liste de restrictions pour le rafraîchissement rapide ainsi.
DISTINCTES est la cause de l'ORA-12054.
Pourquoi ne pas commencer avec un quelque chose qui fonctionne? Supprimer l'DISTINCTES. Obtenez votre MView de travail. Le compliquer plus tard, lorsque cela devient nécessaire.
Bien que, comme vous le savez déjà, vous ne pouvez pas utiliser un DISTINCTES, vous devrez revoir votre requête de la logique ou de votre actualisation de la stratégie.
La chose importante à noter à propos de la question est qu'il est pas à propos de rafraîchissement rapide, mais complet de rafraîchissement. Ainsi, il n'y a aucune raison logique pour que les restrictions habituelles pour un rafraîchissement rapide lors de la validation doit s'appliquer, à l'exception de celui que tous les objets référencés doit être local.
Le "refresh complet sur la validation est un élément relativement nouveau, de sorte que la meilleure réponse au "pourquoi" est sans doute "Oracle n'a pas encore mis en œuvre ce programme complet, veuillez consulter les futures versions de Base de données Oracle". Pas très utile, mais c'est vrai...