我的每个表都有一个“id”字段。鉴于表格列表可能会发生变化,我需要能够在所有这些内容中找到最高的ID。
有没有办法获取oracle数据库中的表列表,聚合它们的行(只有id),然后得到max()
?
P.S。这是为了更新已经失败的序列。
答案 0 :(得分:11)
这是一些简单的动态SQL驱动数据字典:
SQL> set serveroutput on
SQL> declare
2 l_id pls_integer;
3 max_id pls_integer;
4 max_tab_name varchar2(30);
5 begin
6 max_id := 0;
7 for r in ( select table_name
8 from user_tab_columns
9 where column_name = 'ID' )
10 loop
11 execute immediate 'select max(id) from '||r.table_name
12 into l_id;
13 if l_id > max_id
14 then
15 max_id := l_id;
16 max_tab_name := r.table_name;
17 end if;
18 end loop;
19 dbms_output.put_line('Highest score = '||max_id||' table='||max_tab_name);
20 end;
21 /
Highest score = 2010070705 table=SESSIONS
PL/SQL procedure successfully completed.
SQL>
如果序列服务表跨多个模式,则需要驱逐ALL_TAB_COLUMNS并在查询中包含OWNER。
答案 1 :(得分:1)
这个怎么样?
SELECT MAX(ID)
FROM
(
SELECT MAX(ID) AS ID FROM CUSTOMER
UNION ALL
SELECT MAX(ID) AS ID FROM EMPLOYEE
UNION ALL
SELECT MAX(ID) AS ID FROM MANAGER
);
对需要搜索的所有表重复UNION ALL。
答案 2 :(得分:-1)
如何查询驱动CURRVAL的id的序列......
如果你还需要查找id所在的表,那么构建一个新表来集中跟踪id并添加触发器以填充插入。