【发布时间】:2020-01-20 07:13:02
【问题描述】:
有什么方法可以让我使用存储过程和游标遍历 OracleDB 中的所有表,并假设它们是整数类型,并检索每个表的每个主键值的最大值并将它们显示在一行或一列中?
【问题讨论】:
-
你实际上不需要存储过程或游标
有什么方法可以让我使用存储过程和游标遍历 OracleDB 中的所有表,并假设它们是整数类型,并检索每个表的每个主键值的最大值并将它们显示在一行或一列中?
【问题讨论】:
如果你加入
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>
【讨论】: