在oracle表中的所有字段中搜索特定值

时间:2016-05-09 13:07:28

标签: oracle11g

我想在表格中搜索某些关键字,但我不知道它属于哪个列。我有一个查询,如下:

变量val varchar2(10)  exec:val:=' KING'

PL / SQL程序已成功完成。

SELECT DISTINCT SUBSTR(:val,1,11)" Searchword",

 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 BY"表"

Searchword Table Column

KING EMP ENAME

但我没有得到合适的输出。我只得到输出: PL / SQL过程成功完成。我尝试过,但没有得到满意的答案。请有人帮忙..?

1 个答案:

答案 0 :(得分:0)

我可以为这样的范围编写的最简单的查询类似于:

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 || '%');

在此查询中,我使用OR条件在表的所有列中搜索值: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条件太大,查询将失败。

在这种情况下,唯一的选择是编写一个构建查询的存储过程并将其返回到CLOB变量中,这是一个例子:

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个字符的字符串。