Есть ли способ найти всю таблицу в базе данных, которая имеет столбец с указанными значениями c, например. EMP_NAME = AB C? - PullRequest
0 голосов
/ 08 апреля 2020
select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');

Этот запрос дает около 150 имен таблиц. Я хочу найти все таблицы со столбцом "EMP_NAME" = AB C и удалить его. Как получить все таблицы, которые имеют значение в столбце "EMP_NAME" = ABC?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Например: я создам emp_temp таблицу и изменю одну из ее строк так, чтобы ее столбец 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>

Видимо, я был удален. Отменено. Но я вернусь.

0 голосов
/ 08 апреля 2020

Вы можете l oop по всем таблицам, возвращаемым из запроса (используя курсор):

select table_name
from user_tab_columns
where column_name IN ('EMP_NAME');

и использовать немедленное выполнение для выполнения удаления:

  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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...