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

Oracle11g 在oracle表的所有字段中搜索特定值,oracle11g,Oracle11g,我想在表中搜索一些关键字,但我不知道它属于哪一列。我对此有一个疑问,如下所示: 变量val varchar2(10) 执行官:val:=“国王” PL/SQL过程已成功完成 选择不同的子字符串(:val,1,11)“Searchword” 按“表格”排序 Searchword表列 国王埃纳姆 但我没有得到适当的输出。我只得到以下输出: PL/SQL过程已成功完成。我试过了,但没有得到满意的答案。有人能帮忙吗?我能为此类范围编写的最简单查询如下: SELECT * FROM <table&

我想在表中搜索一些关键字,但我不知道它属于哪一列。我对此有一个疑问,如下所示:

变量val varchar2(10) 执行官:val:=“国王”

PL/SQL过程已成功完成

选择不同的子字符串(:val,1,11)“Searchword”

按“表格”排序

Searchword表列


国王埃纳姆

但我没有得到适当的输出。我只得到以下输出:
PL/SQL过程已成功完成。我试过了,但没有得到满意的答案。有人能帮忙吗?

我能为此类范围编写的最简单查询如下:

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 || '%');
此查询的结果是要执行的查询。请注意,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个字符的字符串。

您所说的任何方法都是正确的,但我使用的表有290列340列150列等。因此,很难在每个查询中指定列数,因为每个表的列数会有所不同。因此..我修改了答:谢谢你的帮助,朋友,但它不工作,我得到的错误是:ORA-01489:字符串连接的结果太长01489。00000-“字符串连接结果太长”*原因:字符串连接结果超过最大大小*操作:确保结果小于最大大小。再次更新答案。我希望这个能满足你的需要
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>'
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;