首页 > 解决方案 > 循环遍历 Oracle db 中的所有表并检索每个表的主键的最高值

问题描述

有什么方法可以让我使用存储过程和游标遍历 OracleDB 中的所有表,并假设它们是整数类型,并检索每个表的每个主键值的最大值并将它们显示在一行或一列中?

标签: sqloracleplsql

解决方案


如果你加入

  • user_constraints,因为它包含有关哪些约束是主键的信息 ( P)
  • user_cons_columns,因为它包含有关这些约束中涉及的列的信息,并允许您选择该列在约束中的位置,如果它是复合键(为简单起见,我使用了 position 1)并且它用于另一个连接
  • user_tab_columns因为它包含列数据类型

并使用一点动态 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>

推荐阅读