如果是oracle9i版本,可以考慮如下兩步實(shí)現(xiàn):
站在用戶的角度思考問題,與客戶深入溝通,找到茂南網(wǎng)站設(shè)計(jì)與茂南網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋茂南地區(qū)。
(10g直接執(zhí)行第二步就可以了)
統(tǒng)計(jì)一個(gè)用戶下所有表的行數(shù):
1.exec
dbms_stats.gather_schema_stats(owner='用戶名');
2.select
sum(num_rows)
from
user_tables;
統(tǒng)計(jì)全庫所有表的行數(shù):
1.exec
dbms_stats.gather_database_stats(estimate_percent='30');
2.select
sum(num_rows)
from
dba_tables;
生產(chǎn)環(huán)境中需謹(jǐn)慎考慮收集新的統(tǒng)計(jì)信息后對應(yīng)用產(chǎn)生的影響。
在oracle10g中統(tǒng)計(jì)所有表的數(shù)據(jù)量可以使用如下語句:
select sum(NUM_ROWS) from dba_tables where owner like 'SCHEMA';
說明一下,以上語句必須用dba賬戶登錄才可以使用,其中的SCHEMA參數(shù)就是當(dāng)前用戶名。
chema為數(shù)據(jù)庫對象的集合,為了區(qū)分各個(gè)集合,我們需要給這個(gè)集合起個(gè)名字,這些名字就是我們在企業(yè)管理器的方案下看到的許多類似用戶名的節(jié)點(diǎn),這些類似用戶名的節(jié)點(diǎn)其實(shí)就是一個(gè)schema,schema里面包含了各種對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個(gè)用戶一般對應(yīng)一個(gè)schema,該用戶的schema名等于用戶名,并作為該用戶缺省schema。這也就是我們在企業(yè)管理器的方案下看到schema名都為數(shù)據(jù)庫用戶名的原因。
最簡單的理解:以你計(jì)算機(jī)的用戶為例,如果你的計(jì)算機(jī)有3個(gè)用戶,那么每個(gè)用戶登錄系統(tǒng)看到的(使用的)功能是可以不相同的!
如何在oracle中查詢每個(gè)表的記錄條數(shù)
可用兩種方法,一種是在oracle的系統(tǒng)表中統(tǒng)計(jì),另一種需要寫存儲過程統(tǒng)計(jì),方法分別如下。
1、系統(tǒng)表中統(tǒng)計(jì):
1
SELECT sum(num_rows) FROM user_tables;
結(jié)果:
2、存儲過程統(tǒng)計(jì),代碼如下:
declare
v_tName varchar(50);
v_sqlanalyze varchar(500);
v_num number;
v_sql varchar(500);
cursor c1
is
select table_name from user_tables;
begin
open c1;
loop
fetch c1 into v_tName;
if c1%found then
v_sqlanalyze :='analyze table '||v_tName||' estimate statistics';
execute immediate v_sqlanalyze;
v_sql := 'select NUM_ROWS from user_tables where table_name =upper('''||v_tName||''')';
execute immediate v_sql into v_num;
dbms_output.put_line('表名: '||v_tName||' 行數(shù): '||v_num);
else
exit;
end if;
end loop;
end;
1、創(chuàng)建測試表;
create table test_type_num(type varchar2(20),cardNo varchar2(20),orgName varchar2(20));
2、插入測試數(shù)據(jù);
insert into test_type_num values('1','201103','日本');
insert into test_type_num values('1','201104','中國');
insert into test_type_num values('2','201105','中國');
insert into test_type_num values('2','201106','中國');
insert into test_type_num values('2','201107','日本');
commit;
3、查詢表中全量數(shù)據(jù);select t.*, rowid from test_type_num t;
4、編寫語句,統(tǒng)計(jì)同一類型的記錄的條數(shù);
select t.*, count(1) over(partition by type, orgname) cnt from test_type_num t ;
1、如果用到報(bào)表工具,上面的報(bào)表可以很好的展示出來。
2、如果未用到報(bào)表工具,只能寫SQL了,思想如下:把查詢到結(jié)果放到二維數(shù)組里面,然后通過頁面循環(huán)輸出。該方法,效率低。
推薦你用一些開源的報(bào)表工具。
主要目的動態(tài)拼出如下sql
select tb.time,
max(case
when tb.id = 1 then
user1
end) as a001,
max(case
when tb.id = 2 then
user1
end) as a002,
max(case
when tb.id = 3 then
user1
end) as a003
from tb
group by tb.time;
--以下為測試部分
create table ta (id int,name varchar2(20));
create table tb (id1 int,time varchar2(20),user1 varchar2(20),id int);
insert into ta values(1,'a001');
insert into ta values(2,'a002');
insert into ta values(3,'a003');
insert into tb values(1,'2011-01-01','u001',1);
insert into tb values(2,'2011-01-01','u002',2);
insert into tb values(3,'2011-01-01','u003',3);
insert into tb values(4,'2011-01-02','u004',1);
insert into tb values(5,'2011-01-02','u001',2);
insert into tb values(6,'2011-01-02','u001',3);
create or replace procedure test_p
as
sql_str varchar2(10000);
begin
for rec in ( select * from ta ) loop
sql_str := sql_str||'max(case when tb.id = '||rec.id||' then user1 end) as '|| rec.name ||',' ;
end loop;
sql_str := 'select tb.time, '||rtrim(sql_str,',')||' from tb group by tb.time';
--dbms_output.put_line(sql_str);
execute immediate sql_str;
end;
最后執(zhí)行test_p 就能達(dá)到你想要的效果了。