【发布时间】:2021-06-25 14:42:23
【问题描述】:
我需要获取所有包含类似“AIDA”的值的表名。我不是新手,我不知道我该怎么做。有人能帮我吗?
【问题讨论】:
-
我不希望列名,但我想要表的名称,其中有一个包含值“AIDA”的列
我需要获取所有包含类似“AIDA”的值的表名。我不是新手,我不知道我该怎么做。有人能帮我吗?
【问题讨论】:
此查询为您提供列名包含“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
【讨论】:
当您正在寻找一个字符串(显然是“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>
结果表明有两个表:EMP 和 TEST 在其%CHAR% 某处包含至少 1 行 AIDA(因此,CHAR、VARCHAR、VARCHAR2)数据类型列. EMP 有 8 行,TEST 只有 1 行。
如你所愿
我需要获取所有包含类似“AIDA”的值的表名。
我想就是这样。或多或少。
【讨论】: