Однажды передо мной встала задача определить, в какую таблицу БД попадают определённые данные с веб-формы. Вызвано это, например, может быть тем, что у нас есть доступ к БД, но нет исходников приложения. А таблицы кто-то называл в стиле TABLE_1, TABLE_2, OT_1 и так далее.
К счастью, БД была Oracle, поэтому можно использовать тёмные стороны PL/SQL.
Думаю, смысл действа понятен, поэтому сразу к коду:
Вкратце о том, что же происходит:
Буду рад комментариям, как можно было сделать иначе, не изобретая велосипедов.
К счастью, БД была Oracle, поэтому можно использовать тёмные стороны PL/SQL.
Думаю, смысл действа понятен, поэтому сразу к коду:
create or replace procedure whereIsValue(valueParam varchar2) AS TYPE VALCUR IS REF CURSOR; cursor tabl is select table_name from user_tables; cursor col (tablename varchar2) is select column_name from user_tab_columns where table_name like tableName; valueCursor VALCUR; tableName varchar2(50); columnName varchar2(50); columnValue varchar2(500); qq number(3); begin open tabl; LOOP fetch tabl into tableName; EXIT WHEN tabl%NOTFOUND; OPEN col(tableName); LOOP fetch col into columnName; EXIT WHEN col%NOTFOUND; OPEN valueCursor for 'select ' || columnName || ' from ' || tableName; LOOP BEGIN fetch valueCursor into columnValue; EXIT WHEN valueCursor%NOTFOUND; if (columnValue like valueParam) then dbms_output.put_line(tableName); exit; end if; EXCEPTION WHEN OTHERS then qq := 4; END; END LOOP; CLOSE valueCursor; END LOOP; CLOSE col; END LOOP; end;
Вкратце о том, что же происходит:
- проходим по всем таблицам схемы;
- для каждой таблицы проходим по всем её колонкам;
- для каждой колонки забираем список значений и сравниваем с тем, что передано в параметре процедуры;
- если совпало, то печатаем имя таблицы в DBMS_OUTPUT;
Буду рад комментариям, как можно было сделать иначе, не изобретая велосипедов.