楼主: grassbell

[Tips] 关于使用SHOW_SPACE()

[复制链接]
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
21#
 楼主| 发表于 2004-7-28 12:04 | 只看该作者
最初由 selina33 发布
[B]grant execute on dbms_space.xxxx to username [/B]


这样不可以。

但是我也纳闷他为什么会报这个错误。

他也确定已经作了如下操作:

conn sys/admin as sysdba

grant execute on dbms_space to public;
grant execute on show_space to public;

甚至
grant analyze any to scott;

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2005-07-25 00:36:29授权会员
日期:2005-10-31 19:50:58会员2006贡献徽章
日期:2006-04-17 13:46:34奥运会纪念徽章:花样游泳
日期:2012-09-03 19:20:10
22#
发表于 2004-7-28 12:10 | 只看该作者
最初由 selina33 发布
[B]grant execute on dbms_space.xxxx to username [/B]



SQL> grant execute on dbms_space.free_blocks to scott;
grant execute on dbms_space.free_blocks to scott
                            *
ERROR at line 1:
ORA-04042: procedure, function, package, or package body does not exist


SQL>

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
23#
发表于 2004-7-28 13:41 | 只看该作者
最初由 xzh2001 发布
[B]19:21:03 SQL> exec show_space('AAA');
BEGIN show_space('AAA'); END;

*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_SPACE", line 74
ORA-06512: at "SYS.SHOW_SPACE", line 22
ORA-06512: at line 1 [/B]


好象得有dba权限。

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
24#
发表于 2004-7-30 14:48 | 只看该作者
应当用Oracle 9i的Pipelined函数做一个超级9i版本的。

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
25#
发表于 2004-7-30 15:27 | 只看该作者
[quota]
CREATE OR REPLACE PACKAGE SHOWSPACE AS
    TYPE DBOBJECT_TYPE IS RECORD
    (
            SEGMENT_NAME VARCHAR2(30),
            SEGMENT_TYPE VARCHAR2(30),
            PARTITION_NAME VARCHAR2(30),
            TOTAL_BLOCKS NUMBER,
            TOTAL_BYTES  NUMBER,
            UNUSED_BLOCKS NUMBER,
            UNUSED_BYTES  NUMBER,
            EXT_FILE_ID   NUMBER,
            EXT_BLOCK_ID  NUMBER,
            LST_BLOCK_ID  NUMBER
    );
    TYPE DBOBJECT_LIST_TYPE IS TABLE OF DBOBJECT_TYPE;
    FUNCTION UNUSED_SPACE(O_OWNER IN VARCHAR2) RETURN DBOBJECT_LIST_TYPE PIPELINED;
END;
/

CREATE OR REPLACE PACKAGE BODY SHOWSPACE AS
    FUNCTION UNUSED_SPACE(O_OWNER in VARCHAR2) RETURN DBOBJECT_LIST_TYPE PIPELINED AS
       TEMP_REC DBOBJECT_TYPE;
    BEGIN
       FOR OBJREC IN (SELECT
           SEGMENT_NAME,SEGMENT_TYPE,PARTITION_NAME
           FROM DBA_SEGMENTS
           WHERE OWNER = UPPER(O_OWNER)) LOOP
                  TEMP_REC.SEGMENT_NAME := OBJREC.SEGMENT_NAME;
                  TEMP_REC.SEGMENT_TYPE := OBJREC.SEGMENT_TYPE;
                  TEMP_REC.PARTITION_NAME := OBJREC.PARTITION_NAME;
                  SYS.DBMS_SPACE.UNUSED_SPACE(
                          SEGMENT_OWNER=>UPPER(O_OWNER),
                          SEGMENT_NAME=>TEMP_REC.SEGMENT_NAME,
                          SEGMENT_TYPE=>TEMP_REC.SEGMENT_TYPE,
                          PARTITION_NAME=>TEMP_REC.PARTITION_NAME,
                          TOTAL_BLOCKS=>TEMP_REC.TOTAL_BLOCKS,
                          TOTAL_BYTES=>TEMP_REC.TOTAL_BYTES,
                          UNUSED_BLOCKS=>TEMP_REC.UNUSED_BLOCKS,
                          UNUSED_BYTES=>TEMP_REC.UNUSED_BYTES,
                          LAST_USED_EXTENT_FILE_ID=>TEMP_REC.EXT_FILE_ID,
                          LAST_USED_EXTENT_BLOCK_ID=>TEMP_REC.EXT_BLOCK_ID,
                          LAST_USED_BLOCK=>TEMP_REC.LST_BLOCK_ID);
                  PIPE ROW (TEMP_REC);
       END LOOP;
       RETURN;
    END;
END;
/
[/quota]

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
26#
发表于 2004-7-30 15:28 | 只看该作者

执行结果

SQL> select * from table(showspace.unused_space('test'));

SEGMENT_NAME        SEGMENT_TYPE PARTITION_NAME TOTAL_BLOCKS TOTAL_BYTES UNUSED_BLOCKS UNUSED_BYTES EXT_FILE_ID EXT_BLOCK_ID LST_BLOCK_ID
------------------- ------------ -------------- ------------ ----------- ------------- ------------ ----------- ------------ ------------
PLAN_TABLE          TABLE                                  8       65536             6        49152           3         6505            2
TAB_LOGIN_STATS     TABLE                                 32      262144             3        24576           3         5145            5
TAB_CPU_STATS       TABLE                                256     2097152           118       966656           3         2441           10
TAB_MEM_STATS       TABLE                                 32      262144             3        24576           3         5169            5
TAB_SWAP_STATS      TABLE                                 32      262144             3        24576           3         5705            5
TAB_KERNEL_STATS    TABLE                                 48      393216             3        24576           3         2817            5
TAB_DISK_STATS      TABLE                               2048    16777216            68       557056           3         4873           60
TAB_PROCESS_STATS   TABLE                                 24      196608             3        24576           3         5681            5
TAB_MOUNT_STATS     TABLE                                512     4194304            48       393216           3         5897           80
TAB_TS_STATS        TABLE                                  8       65536             7        57344           3         2409            1
TEST                TABLE                                 32      262144             4        32768           3         2713            4
IND_TAB_DISK_STATS  INDEX                                512     4194304           118       966656           3         6921           10
IND_TAB_MOUNT_STATS INDEX                                128     1048576             3        24576           3         6089            5
IND_TAB_TS_STATS    INDEX                                  8       65536             6        49152           3         2433            2
14  条记录被返回.
SQL>

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2005-10-30 17:05:33奥运会纪念徽章:跳水
日期:2008-05-26 09:14:52奥运会纪念徽章:曲棍球
日期:2008-06-13 13:35:53奥运会纪念徽章:铁人三项
日期:2008-08-28 09:18:09生肖徽章2007版:马
日期:2009-09-08 11:21:202010年世界杯参赛球队:塞尔维亚
日期:2010-03-11 19:05:042011新春纪念徽章
日期:2011-02-18 11:43:33迷宫蛋
日期:2013-01-15 09:40:02
27#
发表于 2004-8-11 11:07 | 只看该作者
dbca你的脚本执行起来有问题啊
LINE/COL ERROR
-------- ------------------------------------------------------
7/6      PL/SQL: ORA-00942: table or view does not exist
5/15     PL/SQL: SQL Statement ignored
9/26     PLS-00364: loop index variable 'OBJREC' use is invalid
9/1      PL/SQL: Statement ignored
10/26    PLS-00364: loop index variable 'OBJREC' use is invalid
10/1     PL/SQL: Statement ignored
11/28    PLS-00364: loop index variable 'OBJREC' use is invalid
11/1     PL/SQL: Statement ignored

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
28#
发表于 2004-9-17 18:03 | 只看该作者
Hehe,其实 p_space可以直接从dba_tablespace中获取
顺手改了一下。

最初由 grassbell 发布
[B]xzh2000 提供的最终混合超级完全无敌版:

create or replace procedure show_space
( p_segname_1 in varchar2,
p_type_1 in varchar2 default 'TABLE' ,
p_analyzed in varchar2 default 'N',
p_owner_1 in varchar2 default user)
as
p_segname varchar2(100);
p_type varchar2(10);
p_owner varchar2(30);
p_space varchar2(10);

l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number;
l_fs1_bytes number;
l_fs2_blocks number;
l_fs2_bytes number;
l_fs3_blocks number;
l_fs3_bytes number;
l_fs4_blocks number;
l_fs4_bytes number;
l_full_blocks number;
l_full_bytes number;

l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;

procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin


p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
p_type := p_type_1;

if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
end if;

if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
end if;

if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
p_type := 'CLUSTER';
end if;

select t.segment_space_management into p_space
from dba_tablespaces t , dba_segments s
where s.tablespace_name = t.tablespace_name
and segment_name = p_segname
and s.owner = p_owner
and s.segment_type = p_type ; -- RollingPig change it.
-- if you compile with error,you may login with sys and grant select on dba_tablespace,dba_segments to current_user

dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );

if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks );

p( 'Free Blocks', l_free_blks );
end if;

p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );


/*IF the segment is analyzed */
if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner ,
segment_name => p_segname ,
segment_type => p_type ,
unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
p( '0% -- 25% free space blocks', l_fs1_blocks);
p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
p( '50% -- 75% free space bytes', l_fs3_bytes);
p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);

end if;

end;

[/B]

使用道具 举报

回复
论坛徽章:
0
29#
发表于 2004-12-1 23:06 | 只看该作者
SQL> create table test(name varchar2(20) not null);
table create.
SQL> insert into test values('paul');

1 row create.

SQL> exec show_space('TEST')

PL/SQL procedure successfully completed.

请问一下为什么没有执行结果呢?

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
30#
 楼主| 发表于 2004-12-2 09:15 | 只看该作者
最初由 paulljw 发布
[B]SQL> create table test(name varchar2(20) not null);
table create.
SQL> insert into test values('paul');

1 row create.

SQL> exec show_space('TEST')

PL/SQL procedure successfully completed.

请问一下为什么没有执行结果呢? [/B]


SQL> set serveroutput on

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表