2016-08-01 7 views
0

Ich brauche ein Skript, das die Summe der space_limit aus der v$recovery_file_dest aus verschiedenen Datenbanken macht: Ich habe eine Liste von 5 DBs und ich brauche es zu verbinden, speichern dieser Wert (space_limit) im Speicher und am Ende geben Sie mir die Summe aller 5 WerteScript SQL, die Werte von Tabellen aus verschiedenen DBs summiert

Ist es möglich?

undefine user 
accept user char prompt 'User : ' 
undefine pswuser 
accept pswuser char prompt 'Password : ' HIDE 

set trimout off 
set verify off 
set markup html on 

spool Z:\....\...\FRA_report_&data._&ora..html 

Prompt ##################################################### 
Prompt DATABASE 1 
Prompt ##################################################### 
connect &user/&[email protected] 
select name, 
round(space_limit/1024/ 1024), 
to_char(round(space_used/1048576),'999g999g990','NLS_NUMERIC_CHARACTERS=,.'), 
round(((space_used/1048576)/(space_limit/1048576)*100),2)||'%' 
from v$recovery_file_dest 
/

/.....And so auf 5-mal für jeden DB .....: die Summe zeigen

Das ist, was ich in den Boden so weit, ich erhielt es brauchen/

Prompt ##################################################### 
Prompt TOTAL FRA 
Prompt ##################################################### 

spool off 
set markup html off 
disc 

UPDATE: habe ich versucht, für jede DB dieser Zugabe

begin 
:total := total + v$recovery_file_dest.space_limit; 
end; 
/

Aber es gibt mir diese Fehler

FEHLER in Zeile 2: ORA-06550: Zeile 2, Spalte 32: PLS-00357: Tabelle, Ansicht oder Sequenz Referenz 'V $ RECOVERY_FILE_DEST.SPACE_LIMIT' in diesem Zusammenhang nicht erlaubt ORA-06550: Zeile 2, Spalte 2: PL/SQL: Statement ignoriert

+1

Connect an jeden von wo aus - innerhalb einer einzigen Client-Sitzung? Aus einem Shell/Batch-Skript? Gibt es Datenbank-Links von einem Ihrer DBs zu den anderen? –

+0

Ich verbinde von SQLPlus und nicht alle DBs haben Verbindungen zueinander! – gmaster

+0

Es ist nicht wirklich klar, wo Sie die aktualisierte Zeile im Skript hinzugefügt haben, bitte bearbeiten Sie sie, damit wir sehen können, wo sie sich im Skript befindet. –

Antwort

1

Sie sind nicht so weit weg mit dem Versuch, eine laufende Summe zu halten, aber Sie müssen die bind-Variable und die Tabelle kombinieren Wert in einem SQL-Kontext:

begin 
    select nvl(:total,0) + sum(space_limit) into :total from v$recovery_file_dest; 
end; 
/

Sie können dann entweder print die Summe, oder um Ihre HTML-Formatierung abzufragen es von dual. Also Ihr Skript könnte aussehen wie am Ende:

variable total number; 

undefine user 
accept user char prompt 'User : ' 
undefine pswuser 
accept pswuser char prompt 'Password : ' HIDE 

set trimout off 
set verify off 
set markup html on 
set numformat 999999999999 

spool Z:\....\...\FRA_report_&data._&ora..html 

Prompt ##################################################### 
Prompt DATABASE 1 
Prompt ##################################################### 
connect &user/&[email protected] 
set feedback off 

select name, 
round(space_limit/1024/ 1024), 
to_char(round(space_used/1048576),'999g999g990','NLS_NUMERIC_CHARACTERS=,.'), 
round(((space_used/1048576)/(space_limit/1048576)*100),2)||'%' 
from v$recovery_file_dest 
/

exec select nvl(:total,0) + sum(space_limit) into :total from v$recovery_file_dest; 

-- repeat for other databases 

Prompt ##################################################### 
Prompt TOTAL FRA 
Prompt ##################################################### 

select :total as total_fra, :total/(1024*1024) as total_fra_mb from dual; 

spool off 
set markup html off 
disc 

Ich habe auch die Variablendeklaration hinzugefügt, und das Zahlenformat festgelegt, damit es nicht in der wissenschaftliche Schreibweise geht nicht für große Werte. Sie können natürlich den Wert :total manipulieren, um ihn in MB oder GB oder was auch immer Sie bevorzugen anzuzeigen - Ich habe den Rohwert und den MB-Wert angezeigt, um den einzelnen Datenbankwerten zu entsprechen.

Ich habe auch hinzugefügt set feedback off, die nach jeder connect wiederholt werden muss - einige Einstellungen werden zurückgesetzt, wenn Sie wieder verbinden.

Dieser Code Ausgabe wie folgt erzeugt, wenn sie mit zwei Datenbanken laufen aufgeführt:

##################################################### 
 
<br> 
 
DATABASE 1 
 
<br> 
 
##################################################### 
 
<br> 
 
<p> 
 
<table border='1' width='90%' align='center' summary='Script output'> 
 
<tr> 
 
<th scope="col"> 
 
NAME 
 
</th> 
 
<th scope="col"> 
 
ROUND(SPACE_LIMIT/1024/1024) 
 
</th> 
 
<th scope="col"> 
 
TO_CHAR(ROUN 
 
</th> 
 
<th scope="col"> 
 
ROUND(((SPACE_USED/1048576)/(SPACE_LIMIT/ 
 
</th> 
 
</tr> 
 
<tr> 
 
<td> 
 
+FRA 
 
</td> 
 
<td align="right"> 
 
     30720 
 
</td> 
 
<td> 
 
     24.570 
 
</td> 
 
<td> 
 
79.98% 
 
</td> 
 
</tr> 
 
</table> 
 
<p> 
 
##################################################### 
 
<br> 
 
DATABASE 2 
 
<br> 
 
##################################################### 
 
<br> 
 
<p> 
 
<table border='1' width='90%' align='center' summary='Script output'> 
 
<tr> 
 
<th scope="col"> 
 
NAME 
 
</th> 
 
<th scope="col"> 
 
ROUND(SPACE_LIMIT/1024/1024) 
 
</th> 
 
<th scope="col"> 
 
TO_CHAR(ROUN 
 
</th> 
 
<th scope="col"> 
 
ROUND(((SPACE_USED/1048576)/(SPACE_LIMIT/ 
 
</th> 
 
</tr> 
 
<tr> 
 
<td> 
 
+FRA 
 
</td> 
 
<td align="right"> 
 
     24576 
 
</td> 
 
<td> 
 
     12.698 
 
</td> 
 
<td> 
 
51.67% 
 
</td> 
 
</tr> 
 
</table> 
 
<p> 
 
##################################################### 
 
<br> 
 
TOTAL FRA 
 
<br> 
 
##################################################### 
 
<br> 
 
<p> 
 
<table border='1' width='90%' align='center' summary='Script output'> 
 
<tr> 
 
<th scope="col"> 
 
TOTAL_FRA 
 
</th> 
 
<th scope="col"> 
 
TOTAL_FRA_MB 
 
</th> 
 
</tr> 
 
<tr> 
 
<td align="right"> 
 
    57982058496 
 
</td> 
 
<td align="right"> 
 
     55296 
 
</td> 
 
</tr> 
 
</table> 
 
<p>

+0

Perfekt, genau das, was ich brauchte, danke! – gmaster