Quelle est la signification de «sélectionner * parmi relationnel (propriétaire.table)»?


8

Nous avons récemment obtenu quelques erreurs dans notre journal d'alertes du formulaire

301598: Tue Jul 16 03:58:29 2013
301599: ORA-01555 caused by SQL statement below 
301600: SELECT * FROM RELATIONAL(<owner>.<table>)

Je sais comment gérer les erreurs ORA-01555, mais je n'ai jamais rencontré quelque chose comme SELECT * FROM RELATIONAL. J'ai regardé DBA_OBJECTSdedans, mais il n'y a pas une telle fonction / opérateur / quoi que ce soit.

La recherche de «SELECT * FROM RELATIONAL» sur Google n'a renvoyé que des questions liées à ORA-01555.

Donc, ma question est: Quelle est la signification du mot-clé RELATION ici?


2
Il semble que ce soit quelque chose de profondément interne. Parce que support.oracle.com n'affiche également que les mêmes informations que vous avez déjà googlé.
Mindaugas Riauba

2
Je suis certain à 99% que c'est pour interroger le type de données XMLTYPE, mais je ne trouve pas la référence car il relationalest évident que c'est un mot très difficile à rechercher dans la documentation DB.
Gaius

1
@Gaius Je ne pense pas que cela soit lié à XMLTYPE (le tableau ne contient pas de colonne XMLTYPE).
Frank Schmitt


changez votre paramètre undo_retention
user3556458

Réponses:


1

Il semble être inerte. J'ai testé cela sur XE 11 et j'ai constaté que cela ne faisait rien.

CREATE TABLE dbausers AS SELECT * FROM dba_users;

-- Function doesn't affect result set.
SELECT * FROM dbausers
MINUS
SELECT * FROM RELATIONAL(dbausers);

SELECT * FROM RELATIONAL(dbausers)
MINUS
SELECT * FROM dbausers;

0

Je crois que c'était un alias obsolète de la fonction TABLE d'aujourd'hui pour les fonctions en pipeline, mais maintenant je ne trouve pas ma référence qui le dit.


0

Selon cet article de blog, l'indication spécifique RELATIONALdemande à l'Optimiseur de requête de

... convertir l'objet en une table relationnelle, similaire à la fonction RELATIONNELLE ...

Un deuxième article dans la communauté Oracle déclare que

L'astuce RELATIONAL amène Oracle à délier les données d'objet et à insérer les données d'attribut elles-mêmes plutôt que l'objet. Les conseils utilisés ne peuvent être utilisés que par Oracle - c'est pourquoi ils ne sont pas documentés ...

Je pense que c'est juste un problème de requête longue, qui est exposée par l'erreur ORA-01555 lors de l'utilisation en interne d'un indice de requête, qui n'est pas documenté.


Les conseils de requête sont imbriqués dans les blocs de commentaires / * * /. Cela semble être autre chose.
durette

0

Comme l'a démontré durette, ce casting est inutile. La plupart des tableaux sont RELATIONNELS, et c'est la valeur par défaut. Cependant, Oracle prend également en charge les tables OBJECT (voir la syntaxe dans les documents CREATE TABLE d'Oracle ), ce qui explique la raison de la syntaxe interne. Il n'y a aucune raison d'utiliser RELATIONAL dans une requête, mais il n'y a également aucune raison pour qu'elle échoue. Vous devez vous concentrer sur les correctifs généraux pour ORA-01555. ORA-01555 signifie généralement que vos segments UNDO ne sont pas suffisants pour gérer le taux de changement dans votre base de données.

Pouvez-vous reproduire cette erreur sur demande? Comment le journal s'exécute-t-il avant l'échec? Ou est votre vraie question, "Comment puis-je retrouver le SQL qui a provoqué cette erreur?"

De plus, vous n'avez pas spécifié votre version Oracle et votre niveau de correctif.


2
Vous vous rendez compte, bien sûr, que la question a presque six ans.
mustaccio

Je n'étais pas intéressé à réparer l'ORA-01555 (je sais comment faire, comme je l'ai mentionné dans ma question). Je m'intéressais juste à l'étrange appel / syntaxe de la fonction RELATIONNELLE, mais ma curiosité s'est affaiblie au fil des ans :-)
Frank Schmitt

1
Si vous ne souhaitez plus de commentaires sur cette question, vous pouvez la supprimer ou accepter une réponse. Tant que l'échange de pile considère cette question sans réponse, il continuera à inciter les gens à aider.
Gordon Hopper

-3

La ligne ci-dessous "ORA-01555 provoqué par l'instruction SQL ci-dessous" est l'instruction SQL provoquant l'échange de l'annulation.

Donc RELATIONNEL n'est pas une chose Oracle, c'est un objet créé par un utilisateur. C'est une fonction avec le paramètre owner.table.


2
S'il s'agissait d'une fonction créée par un utilisateur, ne devrait-elle pas être présente dans DBA_OBJECTS?
Frank Schmitt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.