Циклический просмотр всех таблиц в Oracle дБ и получение наибольшего значения первичного ключа для каждой таблицы - PullRequest
0 голосов
/ 20 января 2020

Есть ли способ, которым я могу l oop пройти по всем таблицам в OracleDB, используя хранимую процедуру и курсор, и получить наибольшее значение каждого значения первичного ключа каждой таблицы, предполагая, что они имеют целочисленный тип, и отобразить их в строке или столбец?

1 Ответ

1 голос
/ 20 января 2020

Если вы присоединитесь к

  • user_constraints, поскольку оно содержит информацию о том, какие ограничения являются первичными ключами (P)
  • user_cons_columns, поскольку оно содержит информацию о столбцах участвует в этих ограничениях и позволяет вам выбрать, какую позицию этот столбец занимает в ограничении, если это составной ключ (для простоты я использовал положение 1) и он используется для другого соединения с
  • user_tab_columns поскольку он содержит тип данных столбца

и использует немного динамичности c SQL, вы получите что-то вроде этого:

SQL> set serveroutput on
SQL> declare
  2    l_max number;
  3  begin
  4    for cur_r in
  5      (select cc.table_name, cc.column_name
  6       from user_constraints uc join user_cons_columns cc on uc.constraint_name = cc.constraint_name
  7       join user_tab_columns c on c.table_name = cc.table_name
  8                              and c.column_name = cc.column_name
  9       where uc.constraint_type = 'P'
 10         and cc.position = 1
 11         and c.data_type = 'NUMBER'
 12      )
 13    loop
 14      execute immediate 'select max(' || cur_r.column_name ||') from ' ||
 15                         cur_r.table_name into l_max;
 16      dbms_output.put_line(cur_r.table_name ||'.'|| cur_r.column_name ||' -> max value = '|| l_max);
 17    end loop;
 18  end;
 19  /
DEPT.DEPTNO -> max value = 40
STUDENT.RNO -> max value =
EMPLOY.ID -> max value =
DEPARTMENT.DEPT_ID -> max value =
CARS.ID -> max value =
MOVIE.MOV_ID -> max value = 2
ACCOUNTS.ACCOUNT_ID -> max value = 3
EMPLOYEES.EMPLOYEE_ID -> max value =
INF_AUSBAUPLAENE.AUSB_ID -> max value =
EMPLOYEE_NOTES.EMPLOYEE_NOTES_ID -> max value =

PL/SQL procedure successfully completed.

SQL>
...