Blz ? Então, antes de tar a sua resposta, uma Obs : tenha ** certeza ** que a 
lógica implementada nesse tal script aí está correta principalmente no tocante 
à tablespace de UNDO e tablespace TEMP - como Acredito que vc deve saber, o 
espaço usado REAL na tablespace de UNDO vc deve consultar na V$TRANSACTION e o 
espaço REAL em uso na temp tablespace vc consulta na 
V$SORT_USAGE/V$SORT_SEGMENT.... Outra coisa é CUIDADO ao calcular %used e %free 
em datafiles auto-extensíveis : como vc sabe, o valor máximo de extensão é um 
limite FUTURO, a ser imposto AO SISTEMA OPERACIONAL não agora mas apenas QUANDO 
a tablespace crescer.. Assim, então em tese vc deveria SOMAR os autoextensíveis 
todos, verificar quanto vc tem livre em disco no sistema operacional e o espaço 
livre ** REAL ** seria a diferença desses dois...

 Muito bem, aviso dado vamos à resposta : primeiro vamos executar a tua query 
sem alterações :
 
SYSTEM:@O11GR2SE:SQL>get t.sql
  1 SELECT t.tablespace_name, t.mb  "TotalMB" 
  2     ,        t.mb - nvl(f.mb,0) "UsedMB" 
  3     ,               nvl(f.mb,0) "FreeMB" 
  4     ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% Used" 
  5     ,                                                        t.ext "Ext" 
  6     , 
'|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' 
')||'|' "Used" 
  7  FROM 
  8     ( 
  9       select tablespace_name, trunc(sum(bytes)/1048576) MB 
 10         from dba_free_space 
 11        group by tablespace_name 
 12       union all 
 13       select tablespace_name, trunc(sum(bytes_free)/1048576) MB 
 14         from v$temp_space_header 
 15        group by tablespace_name 
 16      ) f, 
 17     (select tablespace_name, trunc(sum(bytes)/1048576) MB, 
max(autoextensible) ext 
 18        from dba_data_files 
 19       group by tablespace_name 
 20      union all 
 21      select tablespace_name, trunc(sum(bytes)/1048576) MB, 
max(autoextensible) ext 
 22        from dba_temp_files 
 23       group by tablespace_name 
 24      ) t 
 25 WHERE t.tablespace_name = f.tablespace_name (+) 
 26   AND t.tablespace_name not in (select tablespace_name from dba_tablespaces 
where contents in ('TEMPORARY','UNDO')) 
 27 ORDER BY t.tablespace_name; 

 SYSTEM:@O11GR2SE:SQL>@t

TABLESPACE_NAME                   TotalMB     UsedMB     FreeMB % Used Ext Used
------------------------------ ---------- ---------- ---------- ------ --- 
----------------------
EXAMPLE                               313         39        274    13% YES |### 
                |
STATSPACK                             372        355         17    96% YES 
|####################|
SYSAUX                                580        537         43    93% YES 
|################### |
SYSTEM                               1760       1721         39    98% YES 
|####################|
TS_TESTE                              363        346         17    96% YES 
|####################|
USERS                                1297       1235         62    96% YES 
|####################|

6 linhas selecionadas.

==> Okdoc... Bem, pelo que entendi a tua dúvida decorre primeiro do fato de a 
coluna "% Used" ser o resultado de uma expressão, o que o Oracle não deixa usar 
em GROUP BY, em WHERE.... A solução para isso é simplesmente ter um query 
EXTERNA, que use na cláusula de FROM a query original, assim 'materializando' 
as expressões.... O segundo ponto que imagino te  pegou foi o FATO de que essa 
coluna é uma CONTA/expressão numérica CONCATENADA com um caracter '%' : 
necessariamente se vc concatena uma string com uma conta o resultado é string, 
pra vc poder restringir com >= vc TEM que converter de volta pra número, assim :

SYSTEM:@O11GR2SE:SQL>get t.sql
  1  select *
  2  from
  3     (
  4     SELECT t.tablespace_name, t.mb  "TotalMB"
  5         ,        t.mb - nvl(f.mb,0) "UsedMB"
  6         ,               nvl(f.mb,0) "FreeMB"
  7         ,lpad(ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*100)||'%', 6) "% 
Used"
  8         ,                                                        t.ext "Ext"
  9         , 
'|'||rpad(lpad('#',ceil((1-nvl(f.mb,0)/decode(t.mb,0,1,t.mb))*20),'#'),20,' 
')||'|' "Used"
 10      FROM
 11         (
 12           select tablespace_name, trunc(sum(bytes)/1048576) MB
 13             from dba_free_space
 14            group by tablespace_name
 15           union all
 16           select tablespace_name, trunc(sum(bytes_free)/1048576) MB
 17             from v$temp_space_header
 18            group by tablespace_name
 19          ) f,
 20         (select tablespace_name, trunc(sum(bytes)/1048576) MB, 
max(autoextensible) ext
 21            from dba_data_files
 22           group by tablespace_name
 23          union all
 24          select tablespace_name, trunc(sum(bytes)/1048576) MB, 
max(autoextensible) ext
 25            from dba_temp_files
 26           group by tablespace_name
 27          ) t
 28     WHERE t.tablespace_name = f.tablespace_name (+)
 29       AND t.tablespace_name not in (select tablespace_name from 
dba_tablespaces where contents in ('TEMPORARY','UNDO'))
 30     ORDER BY t.tablespace_name
 31     )
 32*  where TO_NUMBER(ltrim(rtrim(replace("% Used", '%')))) >= 90; -- <<== veja 
como ficou o filtro, que está na query EXTERNA !!
 
SYSTEM:@O11GR2SE:SQL>@t

TABLESPACE_NAME                   TotalMB     UsedMB     FreeMB % Used Ext Used
------------------------------ ---------- ---------- ---------- ------ --- 
----------------------
STATSPACK                             372        355         17    96% YES 
|####################|
SYSAUX                                580        537         43    93% YES 
|################### |
SYSTEM                               1760       1721         39    98% YES 
|####################|
TS_TESTE                              363        346         17    96% YES 
|####################|
USERS                                1297       1235         62    96% YES 
|####################|

SYSTEM:@O11GR2SE:SQL>

[]s

  Chiappa

Responder a