Probleme de tri sql

Probleme de tri sql - SQL/NoSQL - Programmation

Marsh Posté le 21-01-2006 à 20:21:13    

Salut a tous!
 
J'utilise un p'tit script que j'ai trouve sur le net.
J'ai fait quelque modifs d'ordre esthetique.
 

Code :
  1. action(){
  2. sqlplus '/ as sysdba'<<!
  3. SET ECHO OFF
  4. ALTER SESSION
  5.    SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';
  6.    Set lines 80
  7.         SET FEEDBACK OFF
  8.         SET TRIMSPOOL ON
  9. col NOM format a21 heading "Nom"
  10. col TOTAL format a15 heading "Total"
  11. col FREE format a15 heading "Espace libre"
  12. col PERCENT_FREE format a20 heading "Pourcentage libre"
  13. select a.tablespace_name as nom,
  14.   lpad(substr(round(a.bytes / (1024*1024),1),1,10)||' M',10) as total,
  15.   lpad(substr(round(b.bytes / (1024*1024),1),1,10)||' M',10) as free ,
  16.   lpad(substr(round(100* b.bytes / a.bytes,1),1,8)||' %',12) as percent_free
  17. from
  18. (select tablespace_name, sum(bytes) bytes from dba_data_files
  19.    group by tablespace_name) a,
  20. (select tablespace_name, sum(bytes) bytes from dba_free_space
  21.    group by tablespace_name) b
  22. where a.tablespace_name = b.tablespace_name
  23. order by percent_free;
  24. !
  25. }
  26. action| awk '/^SQL> /, /^SQL> D/' | grep -v "SQL>"|grep -v "Session altered"


 
Ce script sert a voir l'espace libre des tablespace oracle.
Comme vous pouvez le voir je veux que les resultats soit trié par % d'espace libre.
Voici le resultat
 

Code :
  1. Nom                   Total           Espace libre    Pourcentage libre
  2. --------------------- --------------- --------------- --------------------
  3. ATXCC08UT_0211              2402 M          1250 M              52 %
  4. ATXCCC03UI                   500 M           290 M              58 %
  5. ATXCC10UT_0305              3903 M            25 M              ,6 %
  6. ATXCC10UI_0510               101 M           100 M              99 %
  7. ATXCC08UI_0601               101 M           100 M              99 %
  8. ATXCC10UT_0209              3603 M            50 M             1,4 %
  9. ATXCC17UT_0212              3503 M            50 M             1,4 %
  10. ATXCC08UI_0508               201 M           200 M            99,5 %
  11. ATXCC24UT                    501 M           500 M            99,8 %
  12. ATXCCH06AT                   151 M         150,6 M            99,8 %


 
Le probleme, c'est que des que le nombre n'est plus un entier, le tri est faux (voir ci dessus)
J'ai pas trouver de solution via le tri SQL.... :pfff:  
Enfin,je doit avouer que je suis pas une fleche en SQL  :lol:  
 
Donc si vous avez des idées, n'hesitez pas!!
 
Merci :jap:


---------------
War is Peace,Freedom is Slavery,Ignorance is Strength.
Reply

Marsh Posté le 21-01-2006 à 20:21:13   

Reply

Marsh Posté le 22-01-2006 à 14:55:20    

Code :
  1. (...)
  2. ORDER BY percent_free * 100;


 
à essayer :)

Reply

Marsh Posté le 22-01-2006 à 20:25:49    

salut!
 
J'ai essaye... il me sort ca:
 

Code :
  1. *
  2. ERREUR à la ligne 4 :
  3. ORA-01722: Nombre non valide


 
En gros le tri ne veut pas melanger les nombres qui ont des "," avec les nombres entiers....
 
Peut etre doit on changer qqch dans le "select" ....
 
Franchement, je voit pas le debut d'une reponse.... :cry:  


---------------
War is Peace,Freedom is Slavery,Ignorance is Strength.
Reply

Marsh Posté le 22-01-2006 à 20:59:32    

arf...j'ai parle trop vite  :pt1cable:  
 
il suffit de lui dire ici  

Code :
  1. lpad(substr(round(100* b.bytes / a.bytes,1),1,10)||' %',12) as percent_free


qu'on ne veut QUE des entiers...

Code :
  1. lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) as percent_free


Bon, comme ca m'interesse que moyen de savoir que le tablespace ait 0,3% exactement d'espace libre,je me contente de 1%  
 
Maintenant, y'a un truc que j'arrive pas a faire:
Je veux qu'il me montre SEULEMENT les TS dans le pourcentage d'espace libre est inferieur a 10.
J'ecris ca

Code :
  1. where a.tablespace_name = b.tablespace_name and percent_free between 0 and 10


mais il me dit

Code :
  1. SQL> select a.tablespace_name as nom,
  2.   2    lpad(substr(round(a.bytes / (1024*1024),1),1,10)||' M',10) as total,
  3.   3    lpad(substr(round(b.bytes / (1024*1024),1),1,10)||' M',10) as free ,
  4.   4    lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) as percent_free
  5.   5  from
  6.   6   (select tablespace_name, sum(bytes) bytes from dba_data_files
  7.   7     group by tablespace_name) a,
  8.   8   (select tablespace_name, sum(bytes) bytes from dba_free_space
  9.   9     group by tablespace_name) b
  10. 10  where a.tablespace_name = b.tablespace_name
  11. 11  and percent_free between 0 and 10 
  12. 12  order by percent_free desc;
  13. and percent_free between 0 and 10
  14.     *
  15. ERREUR à la ligne 11 :
  16. ORA-00904: "PERCENT_FREE" : identificateur non valide


hmm,et la , je voit pas trop comment faire....
 
merci  :jap:


---------------
War is Peace,Freedom is Slavery,Ignorance is Strength.
Reply

Marsh Posté le 22-01-2006 à 22:58:22    

Code :
  1. SQL> select a.tablespace_name as nom,
  2.   2    lpad(substr(round(a.bytes / (1024*1024),1),1,10)||' M',10) as total,
  3.   3    lpad(substr(round(b.bytes / (1024*1024),1),1,10)||' M',10) as free ,
  4.   4    lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) as percent_free
  5.   5  from
  6.   6   (select tablespace_name, sum(bytes) bytes from dba_data_files
  7.   7     group by tablespace_name) a,
  8.   8   (select tablespace_name, sum(bytes) bytes from dba_free_space
  9.   9     group by tablespace_name) b
  10. 10  where a.tablespace_name = b.tablespace_name
  11. 11  and lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) between 0 and 10 
  12. 12  order by lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) desc;
  13. and percent_free between 0 and 10;


 
edit : il doit y avoir des moyens bien plus simples, mais bon, je verrai demain si j'ai le temps, et une base Oracle sous la main :D


Message édité par Beegee le 22-01-2006 à 23:01:18
Reply

Marsh Posté le 22-01-2006 à 23:11:19    

order by (b.bytes / a.bytes)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-02-2006 à 21:25:16    

Merci a tous ceux qui m'ont aidé  :jap:  
 
Ci dessous mon script qui montre tous les TS ORACLE dont l'espace libre est inferieur ou egal a 10%
 
 

Code :
  1. action(){
  2. sqlplus '/ as sysdba'<<!
  3. SET ECHO OFF
  4. ALTER SESSION
  5.         SET lines 80
  6.         SET FEEDBACK OFF
  7.         SET TRIMSPOOL ON
  8. col NOM format a21 heading "Nom"
  9. col TOTAL format a15 heading "Total"
  10. col FREE format a15 heading "Espace libre"
  11. col PERCENT_FREE format a20 heading "Pourcentage libre"
  12. select a.tablespace_name as nom,
  13.   lpad(substr(round(a.bytes / (1024*1024),1),1,10)||' M',10) as total,
  14.   lpad(substr(round(b.bytes / (1024*1024),1),1,10)||' M',10) as free ,
  15.   lpad(substr(round(100* b.bytes / a.bytes,0),1,10)||' %',12) as percent_free
  16. from
  17. (select tablespace_name, sum(bytes) bytes from dba_data_files
  18.    group by tablespace_name) a,
  19. (select tablespace_name, sum(bytes) bytes from dba_free_space
  20.    group by tablespace_name) b
  21. where a.tablespace_name = b.tablespace_name
  22. and (100* b.bytes / a.bytes) between 0 and 10
  23. order by (b.bytes / a.bytes) desc;
  24. !
  25. }
  26. action| awk '/^SQL> /, /^SQL> D/' | grep -v "SQL>"|grep -v "Session altered"


---------------
War is Peace,Freedom is Slavery,Ignorance is Strength.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed