题目:已知all_tables记录数据库中所有表的信息,
①现要求将数据库中所有以CUX开头命名的表的相关信息如该表数据量,所有者,表名,表空间按照固定格式出力到后台
②数据量不可直接取该表的NUM_ROWS字段,需逐一对表另行查询统计数据量
③在查询数据量时,如果报错,需捕捉异常,并出力相关信息,如:A表不存在
固定格式参考:RPAD,LPAD函数.最终效果如下图
答:
DECLARE lv_data_count NUMBER; lv_sql VARCHAR2(255); sql_ymx VARCHAR2(255); lv_num NUMBER; CURSOR cur_table_info IS SELECT owner, table_name, tablespace_name FROM all_tables WHERE table_name LIKE 'CUX%'; CURSOR cur_table_ymx IS SELECT * FROM CUX_table_info_ymx; BEGIN
--判断临时表是否存在 SELECT count(1) INTO lv_num FROM all_tables; IF lv_num = 0 THEN sql_ymx := 'create table CUX_table_info_ymx ( data_count NUMBER, owner VARCHAR2(255), table_name VARCHAR2(255), tablespace_name VARCHAR2(255) )'; EXECUTE IMMEDIATE sql_ymx; ELSE DELETE FROM CUX_table_info_ymx; END IF;
--打印表头 DBMS_OUTPUT.PUT_LINE(RPAD('data_count', 20, '-') || RPAD('owner', 10, '-') || RPAD('table_name', 30, '-') || 'tablespace');
FOR rec_table_info IN cur_table_info LOOP BEGIN
--获取具体表的数据量 lv_sql := 'select count(1) from ' || rec_table_info.table_name; EXECUTE IMMEDIATE lv_sql INTO lv_data_count;
--把检索到的数据插入CUX_table_info_ymx INSERT INTO CUX_table_info_ymx VALUES (lv_data_count, rec_table_info.owner, rec_table_info.table_name, rec_table_info.tablespace_name);
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(rec_table_info.table_name || ' IS NOT EXIST'); END; END LOOP;
--一行一行地打印CUX_table_info_ymx的内容 FOR rec_table_ymx IN cur_table_ymx LOOP DBMS_OUTPUT.PUT_LINE(RPAD(rec_table_ymx.data_count, 20) || RPAD(rec_table_ymx.owner, 10) || RPAD(rec_table_ymx.table_name, 30) || rec_table_ymx.tablespace_name); END LOOP;
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('err:' || SQLERRM); END; |