查询schema下所有表的记录数

本文介绍了一种通过创建自定义函数来查询特定schema下所有表的记录数的方法,并提供了具体的PL/SQL代码实现。该方法适用于需要快速了解多个表数据规模的场景。
3. 查询schema下所有表的记录数
-- 创建计算表记录数的函数[@more@]3. 查询schema下所有表的记录数
-- 创建计算表记录数的函数
CREATE OR REPLACE FUNCTION sf_tab_count(iv_table_name IN VARCHAR2)
RETURN NUMBER IS
v_cursor_handle INTEGER; -- 句柄
v_count INTEGER; -- 计数器
v_text VARCHAR2(4000); -- 运算PL/SQL串
r_num NUMBER;
BEGIN
v_text := v_text || 'DECLARE v_num NUMBER; BEGIN SELECT COUNT(*) INTO :v_num FROM '||iv_table_name||'; END;';
IF DBMS_SQL.IS_OPEN(v_cursor_handle) THEN
DBMS_SQL.CLOSE_CURSOR(v_cursor_handle);
END IF;
v_cursor_handle := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_cursor_handle, v_text, DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(v_cursor_handle, 'v_num', r_num);
v_count := DBMS_SQL.EXECUTE(v_cursor_handle);
DBMS_SQL.VARIABLE_VALUE(v_cursor_handle, 'v_num', r_num);
DBMS_SQL.CLOSE_CURSOR(v_cursor_handle);
RETURN r_num;
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_cursor_handle);
RETURN NULL;
END sf_tab_count;
-- 查询schema下表的记录数
SELECT owner "用户", table_name "表名", sf_tab_count(owner||'.'||table_name) "记录数" FROM DBA_TABLES
WHERE owner IN ('HR', 'SCOTT')
ORDER BY owner, table_name;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/54593/viewspace-1017239/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/54593/viewspace-1017239/

为了统计某个数据库 schema 下,昨天所有中被更新的行数,可以通过以下几种方式实现: 1. **使用数据库的日志或审计功能**:许多现代数据库系统(如 Oracle、PostgreSQL)支持记录数据变更的功能。例如,在 Oracle 中可以启用精细审计(Fine-Grained Auditing),而在 PostgreSQL 中可以使用逻辑解码(Logical Decoding)来捕获特定时间段内的更改记录。通过解析这些日志信息,可以统计出在指定时间范围内(如昨天)所有中被更新的行数 [^2]。 2. **维护历史记录**:可以在数据库 schema 中创建一个专门用于记录更新操作的历史。每当有更新操作发生时,触发器会将相关信息(如更新时间、受影响的名、受影响的行 ID 等)插入到该历史记录中。这样,就可以通过查询历史记录来统计昨天所有中被更新的行数。 3. **结合增量快照和比较机制**:定期对数据库中的进行快照,并保存每个的状态。然后,通过比较当前快照与前一天快照之间的差异,可以计算出哪些行被更新。这种方法适用于数据量较小且对性能要求不高的场景。 4. **利用数据库内置的统计视图或系统**:某些数据库提供了内置的统计视图或系统,可以用来监控的更新情况。例如,在 MySQL 中,可以通过 `INFORMATION_SCHEMA` 中的 `TABLES` 查看的最后更新时间,但这种方式无法精确统计具体更新了多少行 [^1]。 5. **ETL 工具集成**:如果数据库是通过 ETL 工具(如 Kettle)进行数据管理的,则可以利用工具提供的功能来跟踪和记录更新操作。例如,在 Kettle 的“输出”步骤中,可以设置提交记录数量并启用日志记录功能,从而追踪每次插入或更新操作 [^4]。 ### 示例代码 以下是一个基于 PostgreSQL 的示例,假设有一个名为 `audit_log` 的用于记录所有更新操作: ```sql -- 创建审计日志 CREATE TABLE audit_log ( id SERIAL PRIMARY KEY, table_name TEXT NOT NULL, row_id INT NOT NULL, action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建触发器函数 CREATE OR REPLACE FUNCTION log_update() RETURNS TRIGGER AS $$ BEGIN INSERT INTO audit_log (table_name, row_id) VALUES (TG_TABLE_NAME, OLD.id); RETURN NEW; END; $$ LANGUAGE plpgsql; -- 为需要监控的添加触发器 CREATE TRIGGER update_trigger AFTER UPDATE ON your_table FOR EACH ROW EXECUTE FUNCTION log_update(); -- 查询昨天所有中被更新的行数 SELECT table_name, COUNT(*) AS updated_rows FROM audit_log WHERE action_time >= NOW() - INTERVAL '1 day' GROUP BY table_name; ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值