7
votes

Un moyen rapide de déterminer si un champ existe dans une table Oracle

Je cherche une phrase SQL rapide pour déterminer quand il existe un champ ou non dans une table.

En réalité, j'utilise cette phrase xxx

Je pense qu'il y pense Doit être un moyen le plus rapide de déterminer si une colonne existe ou non dans Oracle.

update

J'épuise un système de logiciels plus grand qui fait plusieurs appels qui apportent plusieurs appels à cette requête, je ne peux pas modifier le code source; (, seulement je peux modifier la requête qui est stockée dans un fichier externe.

La table All_Tab_Columns a plus d'un million d'enregistrements. < / p>


2 commentaires

Si la performance est un problème sur cette requête, cela ressemble à quelque chose de mal avec votre modèle de données. Pouvez-vous expliquer pourquoi vous avez besoin de cela?


Pourquoi avez-vous besoin d'une requête rapide pour cela? Quel est le problème avec la lecture de la table décrire la sortie? Ou pourquoi ne pouvez-vous pas lire le DDL qui a créé le modèle?


6 Réponses :


9
votes

La clé principale de all_tab_columns est propriétaire, name_name, colonne_name SO suite pour un propriétaire particulier sera plus rapide (ou utilisez user_tab_columns ).


1 commentaires

+1 pour ajouter le propriétaire. Sans un propriétaire de table, le résultat sera assez inutile. Étant donné que je verrais que l'effet de la remplacer par un Select 1 de Dual serait. Si vous souhaitez une réponse utile, cela peut payer pour vérifier d'abord user_tab_columns, puis tous les_synonymes de synonyme spécifique ou synonyme public, puis allez à all_tab_columns avec le propriétaire de la table. Remarque: Vous pouvez avoir des synonymes pointant sur Synonymes, etc., une réponse correcte sera donc plus lente.



1
votes

Querifier le dictionnaire de données Oracle - comme vous le fait, c'est probablement le moyen le plus rapide.

Le dictionnaire de données est mis en cache en mémoire et devrait être capable de satisfaire la requête assez rapidement. Vous pourrez peut-être obtenir des résultats légèrement plus rapides si vous connaissez le propriétaire du schéma réel de la table - de sorte que vous n'abumiez pas le coût de la recherche contre tous les schémas.


0 commentaires

2
votes

Je suggère de lire cet article Asktom. Il explique que le moyen le plus rapide de vérifier n'est pas de vérifier du tout.

http: // asktom.oracle.com/pls/asktom/f?p=100:11:0:0:::::111:0:0::698008000346356376


0 commentaires

1
votes

Cette requête est suffisante:

select null
from sys.col$ c
   , sys.obj$ o
   , sys.obj$ ot
where o.name = 'MYTABLE'
  and c.name = 'MYCOLUMN'
  and o.obj# = c.obj#
  and o.owner# = userenv('SCHEMAID')
  and ot.type#(+) = 13
  and (o.type# in (3, 4)                                    
       or
       (o.type# = 2 
        and
        not exists (select null
                      from sys.tab$ t
                     where t.obj# = o.obj#
                       and (bitand(t.property, 512) = 512 or
                            bitand(t.property, 8192) = 8192))))


0 commentaires

0
votes

Cette requête SQL donnera le nom de tout le tableau avec la colonne 'Navigation_ID' pour l'utilisateur 'DSGIDEV'

Sélectionnez * à partir d'all_tab_cols où column_name = 'Navigation_ID' et propriétaire = 'dsgidev'

Ainsi, modifiez le nom de la colonne avec la colonne que vous souhaitez rechercher et propriétaire avec le nom d'identification de votre propriétaire.


0 commentaires

0
votes

ez, le moyen le plus rapide est simplement créer une fonction comme ceci: xxx


0 commentaires