【问题标题】:Looping through all tables in Oracle db and retrieve highest value of primary key for each table遍历Oracle db中的所有表并检索每个表的主键的最高值
【发布时间】:2020-01-20 07:13:02
【问题描述】:

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

【问题讨论】:

  • 你实际上不需要存储过程或游标

标签: sql oracle plsql


【解决方案1】:

如果你加入

  • user_constraints,因为它包含有关哪些约束是主键的信息 (P)
  • user_cons_columns,因为它包含有关这些约束中涉及的列的信息,并允许您选择该列在约束中的位置,如果它是复合键(为简单起见,我使用位置 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>

【讨论】:

  • 感谢您提供详尽的代码和解释。我真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多