В столбце таблицы содержатся имена других таблиц:
name
=======
table_1
table_pineapple
table_3
Нужно через цикл удалить все строки из этих таблиц:
delete from table_N;
Не понятно, как использовать поле типа varchar2 в качестве имени для обращения к таблице.
Ответ
Тут поможет динамический SQL - Native Dynamic SQL
Тест данные:
create table tables as
select level id, 'table_'||level name
from dual connect by level <= 4;
select
'drop table '||name||';'||chr (10)||
'create table '||name||' as select '||id||' id '||
'from dual connect by level<='||(id*10)||';'
from tables
where id < 4;
Выполните результат последнего запроса методом копи+паста, и затем следующее:
declare
rows number;
function deleteTableIfExists (name varchar2) return number is
tableNotExist exception;
pragma exception_init (tableNotExist, -942);
begin
execute immediate 'delete from '||name;
return sql%rowcount;
exception when tableNotExist then return -1;
end deleteTableIfExists;
begin
for r in (select * from tables) loop
rows := deleteTableIfExists (r.name);
if rows >= 0
then dbms_output.put_line (r.name||' '||rows|| ' rows deleted');
else dbms_output.put_line (r.name||' does not exists');
end if;
end loop;
end;
/
table_1 10 rows deleted
table_2 20 rows deleted
table_3 30 rows deleted
table_4 does not exists
PL/SQL procedure successfully completed.
Обычно подобные функциии собираются в несколько пакетов по категориям один раз для всего проекта, например - dmlUtils и ddlUtils.
Комментариев нет:
Отправить комментарий