在Oracle中,我可以使用
获取最近10分钟内创建的数据SELECT * FROM MY_TABLE WHERE created_dt > sysdate - interval '10' minute and created_dt < sysdate;
但是,我需要查找过去10分钟内创建数据的所有表。
答案 0 :(得分:0)
好的,根据我的理解,您需要在过去10分钟内添加/创建数据的所有表的列表。
这是我的方法:
首先获取包含此列“created_Dt”的所有表的列表。
遍历所有这些表,并检查过去10分钟内是否添加了数据。
&安培;然后显示添加到每个表中的行数。
SET SERVEROUTPUT ON;
DECLARE
CURSOR ALL_TABLES_NAME IS
SELECT * FROM ALL_TABLES "ALL"
WHERE EXISTS(SELECT 1 FROM all_cons_columns WHERE table_name = "ALL".TABLE_NAME AND COLUMN_NAME=UPPER('created_dt'));
ALL_TABLES_NAME_REC ALL_TABLES_NAME%rowtype;
row_count number;
BEGIN
OPEN ALL_TABLES_NAME;
LOOP
FETCH ALL_TABLES_NAME INTO ALL_TABLES_NAME_REC;
EXIT WHEN ALL_TABLES_NAME%notfound;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || ALL_TABLES_NAME_REC.TABLE_NAME || ' WHERE created_dt > (SYSDATE-10/24/60)' INTO row_count;
DBMS_OUTPUT.PUT_LINE('Table '|| ALL_TABLES_NAME_REC.table_name || ' has been updated with '|| row_count || ' new rows');
END LOOP;
CLOSE ALL_TABLES_NAME;
END;
/
答案 1 :(得分:-1)
一种方法是启用闪回,然后你可以这样做:
SELECT * FROM table1
MINUS
SELECT * FROM table1 AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '10' MINUTE;
您可以查询数据字典以查找所有表的列表,并为每个表构建动态查询,并使用EXECUTE IMMEDIATE
遍历所有表。
如果您没有启用闪回,那么您需要在每个表上都有created_dt
列(或等效的)。
答案 2 :(得分:-1)
如果您的表有MONITORING
,一种方法是使用数据字典查看表修改。如果已启用MONITORING
,则以下方法可让您查看在给定时间段内哪些表格已收到INSERT
s(或UPDATE
s或DELETE
s,如果需要) 。
以下方法的缺点是,在检查已创建的内容之前,必须实际等待10分钟,但不要求表具有任何特定列。
更新:根据Ikrom的评论,原来的答案仅通过检查数据字典一次就有缺陷。此答案已更新为检查两次以检测更改。
此方法将记录基线表修改计数,然后在10分钟后检查是否有任何更改。它使用两个工作表,一个用于参考ALL_TAB_MODIFICATIONS_REF
,另一个用于在10分钟ALL_TAB_MODIFICATIONS_COMPARE
后查看修改后的表:
CREATE GLOBAL TEMPORARY TABLE
ALL_TAB_MODIFICATIONS_REF
ON COMMIT PRESERVE ROWS
AS SELECT * FROM ALL_TAB_MODIFICATIONS WHERE ROWNUM < 0;
CREATE GLOBAL TEMPORARY TABLE
ALL_TAB_MODIFICATIONS_COMPARE
ON COMMIT PRESERVE ROWS
AS SELECT * FROM ALL_TAB_MODIFICATIONS WHERE ROWNUM < 0;
Table created.
Table created.
创建这些工作表后,可以通过获取初始状态并在10分钟后比较最终状态来检测任何更改。运行以下块后,可以查询ALL_TAB_MODIFICATIONS_COMPARE
以查看已INSERT
编辑的表格。
BEGIN
--Flush monitoring info, to get a baseline.
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
--Capture the initial state.
INSERT INTO ALL_TAB_MODIFICATIONS_REF
SELECT * FROM ALL_TAB_MODIFICATIONS;
COMMIT;
-- Wait ten minutes.
DBMS_LOCK.SLEEP(600);
--Flush monitoring info, to get a snapshot for comparison.
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
-- Capture the final state.
INSERT INTO ALL_TAB_MODIFICATIONS_COMPARE
SELECT * FROM ALL_TAB_MODIFICATIONS
WHERE NOT EXISTS(SELECT 1 FROM ALL_TAB_MODIFICATIONS_REF
WHERE ALL_TAB_MODIFICATIONS_REF.TABLE_OWNER = ALL_TAB_MODIFICATIONS.TABLE_OWNER
AND ALL_TAB_MODIFICATIONS_REF.TABLE_NAME = ALL_TAB_MODIFICATIONS.TABLE_NAME
AND ALL_TAB_MODIFICATIONS_REF.INSERTS >= ALL_TAB_MODIFICATIONS.INSERTS);
COMMIT;
END;
/
运行块后,检查表INSERT
s:
SELECT TABLE_NAME FROM ALL_TAB_MODIFICATIONS_COMPARE;
以下是一个示例,用于检测超过10分钟的一个表的更改,但排除另一个表,因为它距离上一个INSERT
已超过10分钟:
创建测试表:
CREATE TABLE RECENT_DML (THE_DATA NUMBER, DML_TIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL);
CREATE TABLE NO_RECENT_DML (THE_DATA NUMBER, DML_TIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL);
Table created.
Table created.
并在两个表中添加一些初始测试数据。
INSERT INTO RECENT_DML (THE_DATA) VALUES (1);
INSERT INTO NO_RECENT_DML (THE_DATA) VALUES (1);
COMMIT;
1 row inserted.
1 row inserted.
Commit complete.
然后在上面的一个会话中运行上面的监视块以检测10分钟后的更改。
当块在第一个会话中运行时,在第二个会话中将更多数据添加到RECENT_DML
。
INSERT INTO RECENT_DML (THE_DATA) VALUES (1);
COMMIT;
1 row inserted.
Commit complete.
在第一个会话中完成块后,查询已修改的表:
SELECT TABLE_NAME FROM ALL_TAB_MODIFICATIONS_COMPARE;
TABLE_NAME
RECENT_DML