选择在过去10分钟内创建数据的所有表

时间:2017-08-07 21:09:10

标签: sql oracle

在Oracle中,我可以使用

获取最近10分钟内创建的数据
SELECT * FROM MY_TABLE WHERE  created_dt > sysdate - interval '10' minute and created_dt < sysdate;

但是,我需要查找过去10分钟内创建数据的所有表。

3 个答案:

答案 0 :(得分:0)

好的,根据我的理解,您需要在过去10分钟内添加/创建数据的所有表的列表。

这是我的方法:

  1. 首先获取包含此列“created_Dt”的所有表的列表。

  2. 遍历所有这些表,并检查过去10分钟内是否添加了数据。

  3. &安培;然后显示添加到每个表中的行数。

    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