, vous voulez faire une recherche de texte libre de type Google sur votre base de données. Cela peut être fait mais la performance sera Teh Suck! Google est rapide car il possède des index sur ses index, duplique les magasins de données et optimise généralement tout pour précisément ce type de recherche.
Quoi qu'il en soit, voici une preuve de concept utilisant SQL dynamique et le dictionnaire de données Oracle. Notez que je limiter les colonnes au type de données que je veux rechercher, c'est-à-dire les chaînes.
SQL> set serveroutput on size unlimited
SQL> declare
2 dummy varchar2(1);
3 begin
4 for r in (select table_name, column_name from user_tab_cols
5 where data_type in ('VARCHAR2', 'CHAR', 'CLOB'))
6 loop
7 begin
8 execute immediate 'select null from '||r.table_name
9 ||' where '||r.column_name||' like ''%&search_value%'' '
10 ||' and rownum = 1'
11 into dummy;
12 dbms_output.put_line('Found it in >>>'
13 ||r.table_name||'.'||r.column_name);
14 exception
15 when others then
16 -- bad practice ahoy!
17 null;
18 end;
19 end loop;
20 end;
21/
Enter value for search_value: MAISIE
old 9: ||' where '||r.column_name||' like ''%&search_value%'' '
new 9: ||' where '||r.column_name||' like ''%MAISIE%'' '
Found it in >>>T23.NAME
PL/SQL procedure successfully completed.
SQL>
Une implémentation plus robuste pourrait avoir besoin pour traiter les cas, des mots entiers, etc. Si vous êtes sur 10g ou plus alors des expressions régulières pourraient être utiles, mais la combinaison regex et SQL dynamique est un, euh, intéressant prospect.
Je répète que la performance va être Teh Suck! sur un grand ensemble de données. Il est pratiquement impossible de l'ajuster, car nous ne pouvons pas indexer chaque colonne, et certainement pas de prendre en charge LIKE ou des correspondances floues similaires. Une approche alternative consisterait à utiliser XQuery pour générer une représentation XML de vos données, puis utiliser Text pour l'indexer. Maintenir un tel référentiel serait une surcharge, mais l'effort serait un bon investissement si vous avez besoin de cette fonctionnalité de façon régulière, en particulier dans un environnement de production.
Juste un commentaire: Essayez d'éviter cela. SQL ne le permet pas directement (n'a pas de syntaxe spécifique pour cela) et même s'il existe des solutions de contournement avec SQL dynamique, les applications db robustes doivent rester simples et stupides, et le SQL dynamique cache la complexité qui se traduit tôt ou tard par des problèmes. termes de fonctionnalité inattendue, problèmes de performance et/ou problèmes de sécurité). – Unreason
Vous souhaitez effectuer l'une des opérations les plus fondamentales dans un SGBD (c'est-à-dire appliquer une condition de recherche pour renvoyer un jeu de résultats), mais votre schéma vous en empêche. Je voudrais conclure que vous avez mal interprété le schéma ou le schéma est fatalement défectueux. – onedaywhen
je vous remercie pour les réponses, je veux juste ajouter, que telle expression select je ne vais pas utiliser dans l'application, il me faut pour définir le mappage suivant: enregistrement à partir du fichier (entrée ASCII) -> colonne de DB existant – sergionni