2016-05-09 37 views
-1

テーブル内のキーワードを検索したいが、どのカラムに属しているのかわからない。次のように私はそのためのクエリのいずれかを持っている:oracleテーブルのすべてのフィールドで特定の値を検索

変数ヴァルVARCHAR2(10) のexec:ヴァル:= 'KING'

PL/SQLプロシージャが正常に完了しました。 "表"

Searchword表の列


KING EMP ENAME

BY、

SUBSTR (table_name, 1, 14) "Table", 
SUBSTR (column_name, 1, 14) "Column" FROM cols, 
TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select ' 
|| column_name 
|| ' from ' 
|| table_name 
|| ' where upper(' 
|| column_name 
|| ') like upper(''%' 
|| :val 
|| '%'')').extract ('ROWSET/ROW/*'))) t 

ORDER "をSearchword":(ヴァル、1、11)

DISTINCT SUBSTRを選択

しかし、適切な出力が得られません。出力は次のようになっています。 PL/SQLプロシージャが正常に完了しました。私は試しましたが、満足のいく回答は得られませんでした。誰も助けてください..?私は、このような範囲のために書くことができます

答えて

0

最も簡単なクエリがある何かのように:私は少なくとも1つの列が含まれている場合ので、使用してOR条件テーブルのすべての列に値:valを検索このクエリで

SELECT * 
FROM <table> 
WHERE UPPER(column1) LIKE UPPER('%' || :val || '%') 
    OR UPPER(column2) LIKE UPPER('%' || :val || '%') 
    OR UPPER(column3) LIKE UPPER('%' || :val || '%') 
    OR UPPER(column4) LIKE UPPER('%' || :val || '%'); 

あなたは多くの列を持っている場合は、次のように、あなたのための最終的なクエリを構築するクエリを書くことができます

値は、行がフェッチさ:

SELECT 'SELECT * FROM <table> WHERE ' || LISTAGG(column_name || ' LIKE ''%' || :val || '%''', ' OR ') WITHIN GROUP (ORDER BY column_name) 
FROM dba_tab_columns 
WHERE table_name = '<table>' 

このクエリの結果は、実行するクエリです。 Oracleでは、問合せに組み込まれた文字列フィールドには4000文字の制限があることに注意してください。 where条件が大きすぎる場合、クエリは失敗します。

CREATE OR REPLACE FUNCTION build_query(in_table_name IN VARCHAR2, in_search IN VARCHAR2) RETURN `CLOB` IS 

    lc_query CLOB := 'SELECT * FROM ' || in_table_name || ' WHERE 1=0'; 

BEGIN 

    FOR c IN (
     SELECT * 
     FROM user_tab_columns 
     WHERE table_name = in_table_name 
     ORDER BY column_name 
    ) LOOP 
     lc_query := lc_query || ' OR ' || c.column_name || ' LIKE ''%' || in_search || '%'''; 
    END LOOP; 

    RETURN lc_query; 

END; 

この関数はなり作品や4000よりも長い文字列を生成します。この場合、

、唯一の選択肢は、クエリを構築し、CLOB変数にそれを返し、ここでの例のストアドプロシージャを記述することです文字。

+0

あなたが言ったことは正しいアプローチですが、私は290列340列150列などを持つテーブルで作業していますので、数値列はテーブルごとに異なるため、各クエリに列数を指定するのは難しいでしょう。 .so .. – Aniket

+0

答えを – Carlo

+0

助けてくれてありがとうございます。うまくいかず、エラーが発生しています: ORA-01489:文字列連結の結果が長すぎます 01489. 00000 - "文字列連結の結果もありますlong " *原因:文字列連結結果が最大サイズを超えています。 *処置:結果が最大サイズ未満であることを確認してください。 – Aniket

関連する問題