【问题标题】:how get all table name that contains a value如何获取包含值的所有表名
【发布时间】:2021-06-25 14:42:23
【问题描述】:

我需要获取所有包含类似“AIDA”的值的表名。我不是新手,我不知道我该怎么做。有人能帮我吗?

【问题讨论】:

标签: sql database oracle


【解决方案1】:

此查询为您提供列名包含“AIDA”的所有表:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name like '%AIDA%';

要在列内搜索数据会更复杂一些,您可以使用以下过程:

create or replace procedure search_schema( p_string in varchar2 )
authid current_user
as
l_cols long;
l_where long;
l_cursor sys_refcursor;
l_cname varchar2(4000);
begin
dbms_application_info.set_client_info( '%' || p_string || '%' );
for x in ( select table_name from user_tables )
loop
l_cols := 'case when 1=0 then ''x'' ';
l_where := ' where ( 1=0 ';
for y in ( select '"' || column_name || '"' column_name
from user_tab_columns
where table_name = upper(x.table_name)
and (data_type in ( 'CHAR', 'DATE', 'FLOAT', 'NCHAR', 'NUMBER', 'NVARCHAR2', 'VARCHAR2' )
or data_type like 'INTERVAL%' or data_type like 'TIMESTAMP%' )
)
loop
l_cols := l_cols || ' when ' || y.column_name ||
' like sys_context(''userenv'',''client_info'') then ' ||
' ''' || y.column_name || '''';
l_where := l_where || ' or ' || y.column_name || ' like sys_context(''userenv'',''client_info'') ';
end loop;
open l_cursor for 'select ' || l_cols || 'else null end cname from ' ||
x.table_name || l_where || ') and rownum=1';
fetch l_cursor into l_cname;
if ( l_cursor%found )
then
dbms_output.put_line( x.table_name || ' ' || l_cname );
end if;
close l_cursor;
end loop;
end;
/

并像这样使用它:

SQL> set serveroutput on size 1000000
SQL> exec search_schema( 'AIDA' )

来源:AskTom

【讨论】:

  • 这为您提供了名称匹配的列的表;不是 value 匹配的任何列中具有任何值的表?
  • 你说得对,我误解了评论,我会更新我的答案。
【解决方案2】:

当您正在寻找一个字符串(显然是“AIDA”)时,请查看以下简单过程。

首先,让我们准备 Playground:我的 Scott 架构相对较差,它包含一些表,我很确定它们在任何列中都没有包含 AIDA。

SQL> INSERT INTO test (dname) values ('AIDA');

1 row created.
    
SQL> UPDATE emp SET ename = CASE WHEN deptno = 10 THEN 'SERAIDAS'   -- contains AIDA as a SUBSTRING
  2                              WHEN deptno = 20 THEN 'SAIDA'      -- also contains AIDA as a substring
  3                              ELSE ename
  4                         END;

14 rows updated.


SQL>

让我们测试一下:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    l_str VARCHAR2(500);
  3    l_cnt NUMBER := 0;
  4  BEGIN
  5    FOR cur_r IN (SELECT u.table_name, u.column_name
  6                  FROM user_tab_columns u
  7                  WHERE data_type like '%CHAR%'
  8                 )
  9    LOOP
 10      l_str := 'SELECT COUNT(*) FROM ' || cur_r.table_name ||
 11                ' WHERE ' || cur_r.column_name || ' like (''%AIDA%'')';
 12
 13      EXECUTE IMMEDIATE (l_str) INTO l_cnt;
 14
 15      IF l_cnt > 0 THEN
 16        dbms_output.put_line(l_cnt ||' : ' || cur_r.table_name);
 17      END IF;
 18    END LOOP;
 19  END;
 20  /
8 : EMP
1 : TEST

PL/SQL procedure successfully completed.

SQL>

结果表明有两个表:EMPTEST 在其%CHAR% 某处包含至少 1 行 AIDA(因此,CHARVARCHARVARCHAR2)数据类型列. EMP 有 8 行,TEST 只有 1 行。

如你所愿

我需要获取所有包含类似“AIDA”的值的表名。

我想就是这样。或多或少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多