Страницы

Поиск по вопросам

воскресенье, 9 июня 2019 г.

Использовать содержание столбца таблицы в качестве имен таблиц для формирования запроса

В столбце таблицы содержатся имена других таблиц:
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.

Комментариев нет:

Отправить комментарий