我想在表格中搜索某些关键字,但我不知道它属于哪个列。我有一个查询,如下:
变量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过程成功完成。我尝试过,但没有得到满意的答案。请有人帮忙..?
答案 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个字符的字符串。