是否有任何方法可以在数据库中找到具有特定值的列的所有 table,例如。 EMP_NAME = 字母表?
Is there any method to find all the table in database that has column with specific values eg. EMP_NAME = ABC?
select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');
这个查询给出了大约 150 个 table 个名字。我想找到所有具有列 "EMP_NAME" = ABC 的 table 并将其删除。如何获取在列 "EMP_NAME" = ABC
上具有值的所有 table?
您可以遍历查询返回的所有表(使用游标):
select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');
并使用execute immediate执行删除:
execute immediate 'DELETE from ' || table_name || ' where EMP_NAME='''ABC'''
完整示例:
for i in (
select distinct table_name
from user_tab_columns
where column_name IN ('EMP_NAME')
) LOOP
execute immediate 'DELETE from ' || i.table_name || ' where EMP_NAME='''ABC''';
END LOOP;
例如:我将创建 emp_temp
table 并修改其中一行,以便其 ENAME
列包含 LITTLEFOOT
- 这就是我要删除的内容.
SQL> create table emp_temp as select * from emp;
Table created.
SQL> update emp_temp set ename = 'LITTLEFOOT' where ename = 'KING';
1 row updated.
让我们开始吧:
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, user_tables t
7 where u.table_name = t.table_name
8 and u.column_name = 'ENAME'
9 )
10 loop
11 l_str := 'SELECT COUNT(*) FROM ' || cur_r.table_name ||
12 ' WHERE ' || cur_r.column_name || ' = ''LITTLEFOOT''';
13
14 execute immediate (l_str) into l_cnt;
15
16 if l_cnt > 0 then
17 dbms_output.put_line(l_cnt ||' : ' || cur_r.table_name);
18 execute immediate 'delete from ' || cur_r.table_name ||
19 ' where ' ||cur_r.column_name || ' = ''LITTLEFOOT''';
20 end if;
21 end loop;
22 end;
23 /
1 : EMP_TEMP
PL/SQL procedure successfully completed.
SQL> select * From emp_temp where ename = 'LITTLEFOOT';
no rows selected
SQL>
看来,我被删除了。终止。但我会回来的。
select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');
这个查询给出了大约 150 个 table 个名字。我想找到所有具有列 "EMP_NAME" = ABC 的 table 并将其删除。如何获取在列 "EMP_NAME" = ABC
上具有值的所有 table?
您可以遍历查询返回的所有表(使用游标):
select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');
并使用execute immediate执行删除:
execute immediate 'DELETE from ' || table_name || ' where EMP_NAME='''ABC'''
完整示例:
for i in (
select distinct table_name
from user_tab_columns
where column_name IN ('EMP_NAME')
) LOOP
execute immediate 'DELETE from ' || i.table_name || ' where EMP_NAME='''ABC''';
END LOOP;
例如:我将创建 emp_temp
table 并修改其中一行,以便其 ENAME
列包含 LITTLEFOOT
- 这就是我要删除的内容.
SQL> create table emp_temp as select * from emp;
Table created.
SQL> update emp_temp set ename = 'LITTLEFOOT' where ename = 'KING';
1 row updated.
让我们开始吧:
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, user_tables t
7 where u.table_name = t.table_name
8 and u.column_name = 'ENAME'
9 )
10 loop
11 l_str := 'SELECT COUNT(*) FROM ' || cur_r.table_name ||
12 ' WHERE ' || cur_r.column_name || ' = ''LITTLEFOOT''';
13
14 execute immediate (l_str) into l_cnt;
15
16 if l_cnt > 0 then
17 dbms_output.put_line(l_cnt ||' : ' || cur_r.table_name);
18 execute immediate 'delete from ' || cur_r.table_name ||
19 ' where ' ||cur_r.column_name || ' = ''LITTLEFOOT''';
20 end if;
21 end loop;
22 end;
23 /
1 : EMP_TEMP
PL/SQL procedure successfully completed.
SQL> select * From emp_temp where ename = 'LITTLEFOOT';
no rows selected
SQL>
看来,我被删除了。终止。但我会回来的。