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