J'ai une table avec EDIT: P>
Clarification: la table est configurée correctement. L'interrogation que je fais est une interrogation manuelle lorsque je suivez quelques données incorrectes. La table a été optimisée pour être la plus rapide pour les requêtes automatisées qui représentent les em> vastes em> forts> majorités des requêtes exécutées. (Et avec plus de 95 millions de lignes, chaque optimisation est importante) p>
Je me rends compte que ma question demande à faire quelque chose que SQL n'était pas destiné à faire. J'espère juste qu'il y a du truc pour obtenir ce que je veux. P>
Modifier pour la postérité: P>
Dans notre système, nous avons de nombreux comptes d'utilisateurs différents. Un compte est celui que nous utilisons pour toutes les requêtes en lecture seule (c'est celui que j'utilise la plupart du temps). Il ne possède pas les tables en question, alors quand j'adapais la réponse à ma situation, je devais faire le changement suivant: p>
user_tab_columns code> devait devenir
all_tab_columns Code> et je devais ajouter
propriétaire = '[propriétaire]' p> à la requête. P>
3 Réponses :
On dirait que votre base de données n'est pas correctement normalisée. Cela dit, vous pouvez probablement utiliser la commande impucheuse dans une sous-requête pour faire ce que vous essayez de faire. P>
Souhaitez-vous plus de détails sur l'impulsion? Plus précisément, intact l'impuche à Oracle?
@David Oneill: impulsion code> (et
pivot code> est uniquement pris en charge par Oracle 11G +. N'importe quoi plus tôt que cela ne nécessite d'utiliser code> ou
Decode CODE> Décodements - Vérifiez les étiquettes SQL, pivot et / ou classement à ce sujet.
Ce n'est pas une pièce normale de fonctionnalité de base de données. Cependant, vous n'êtes pas la première personne qui a demandé cela, ou quelque chose comme ça.
La solution nécessite deux choses. Le premier est le dictionnaire de données; La base de données Oracle ne supporte pas la réflexion, mais elle vient avec un ensemble de vues qui nous donnent des métadonnées sur nos objets de base de données. Dans ce cas, nous avons besoin Le code suivant est une preuve de concept. Il faut quatre paramètres: p> Il est rude'n'rédéty afin que vous puissiez le modifier pour ranger la sortie ou pour rendre le programme plus flexible. P> user_tab_columns code>, qui nous donnera les colonnes pour une table donnée. La deuxième chose est dynamique SQL; C'est la possibilité d'assembler une requête SQL au moment de l'exécution, puis de l'exécuter. Il y a quelques façons de faire cela, mais les curseurs REF sont généralement suffisants. P>
SQL> set serveroutput on size unlimited
SQL> exec search_cols('T23', 'ID', 111, 10)
T23::10 found in ,COL_B,COL_C,
PL/SQL procedure successfully completed.
SQL> exec search_cols('T23', 'ID', 222, 10)
T23::10 found in COL_A,,,
PL/SQL procedure successfully completed.
SQL>
Oui, c'était le genre de chose que je savais devait être dehors. Merci!
Ma solution utiliserait des tables de dictionnaire (user_tab_columns) pour aller chercher de manière dynamique le nom de toutes les colonnes numériques de votre table et Dynamic SQL, car ici, je ne vois pas comment on pourrait l'éviter.
DECLARE CURSOR cur_columns IS select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME='<MY_TABLE>' and DATA_TYPE='NUMBER'; query_text VARCHAR2(1000); result_value NUMBER; BEGIN -- Iterate through each NUMBER column of the table FOR rec_col IN cur_columns LOOP -- In my line of primary key <MY_ID>, check if the current column has -- the wanted value. query_text := 'SELECT count(1) FROM <MY_TABLE> WHERE <TABLE_ID> = <MY_ID> AND ' || rec_col.COLUMN_NAME || ' = <MY_VALUE>'; -- < the "magic" is here EXECUTE IMMEDIATE query_text INTO result_value; IF result_value > 0 THEN DBMS_OUTPUT.PUT_LINE('Got a match for column ' || rec_col.COLUMN_NAME || '.'); END IF; END LOOP; END;
Oui, c'était le genre de chose que je savais devait être dehors. Merci!