Hi, Since I do not believe that my computer suddenly has lost the ability to compare numbers correctly, I suppose there must be some mistake in my following code. To cut a long story short, the below sub 1. connects to a db, 2. gets the number of datafiles used by this db, 3. gets the names of these datafiles, 4. gets the number of datafiles for this db from the filesystem, 5. checks whether all the db's datafiles' pathes are within the $dbdir (from another function) 6. and finally compares whether the numbers of datafiles in the db and on the filesystem equal. And this is exactly the point: They equal for one database that I run a test against, but the logic says they differ!
CODE: sub checkDatafiles { my $fnc = ( caller 0 )[$CALLER_ID]; ### 1 ### # DB-Connect my $DBI; my $dbh = DBI->connect('dbi:Oracle:', '', '', {ora_session_mode=>2, RaiseError=>1, AutoCommit=>1}); # Connect zur DB if ( ! $dbh ) { # Error, wenn Connect nicht funktioniert LOGWARN("$fnc - Verbindung zu Datenbank $db fehlgeschlagen: $DBI::errstr\n"); $rcs { "$fnc" } = (1); } ### 2 ### # Anzahl der Datafiles in der DB (View DBA_DATA_FILES) my $sql = "select count(*) from dba_data_files"; # SQL-Statement my $sth = $dbh->prepare($sql); # Ausführung vorbereiten my $anz_dbf_db = $dbh->selectcol_arrayref($sth); # holt alle Inhalte der 1. Spalte in eine Array-REFERNZ!!! $sth->finish(); if ( ! @$anz_dbf_db ) { # Array-REFERENZ!!!, Error, wenn DB nicht gelesen werden kann LOGWARN("$fnc - Datenbank konnte nicht gelesen werden: $DBI::errstr\n"); $rcs { "$fnc" } = (1); } DEBUG("$fnc - Anzahl Datafiles aus DB: @$anz_dbf_db\n"); ### 3 ### # Namen der Datafiles in der DB (View DBA_DATA_FILES) my $sql2 = "select FILE_NAME from dba_data_files"; # SQL-Statement my $sth2 = $dbh->prepare($sql2); # Ausführung vorbereiten my $names_dbf_db = $dbh->selectcol_arrayref($sth2); # holt alle Datafilenamen in eine Array-REFERENZ!!! if ( ! @$names_dbf_db ) { # Array-REFERENZ!!!, Error, wenn DB nicht gelesen werden kann LOGWARN("$fnc - Datenbank konnte nicht gelesen werden: $DBI::errstr\n"); $rcs { "$fnc" } = (1); } DEBUG("$fnc - Namen der Datafiles lt. DB: @$names_dbf_db\n"); $sth2->finish(); $dbh->disconnect(); ### 4 ### # Anzahl der Datafiles im Filesystem my @dbfs_fs; foreach ( glob "$dbdir/*.dbf" ) { # alle Datafiles im Filesystem # DEBUG("$fnc - Datafile im FS: $_\n"); if ( $_ ne "$dbdir/temp01.dbf" ) { push @dbfs_fs, $_; } } DEBUG("$fnc - Namen aller Datafiles im FS: @dbfs_fs\n"); my $anz_dbf_fs = @dbfs_fs; # Anzahl der Datafiles im Filesystem INFO("$fnc - Anzahl Datafiles im Filesystem: $anz_dbf_fs\n"); ### 5 ### # Pfade der Datafiles lt. DB prüfen - müssen alle in $dbdir liegen my @dbf_pfad_falsch; foreach my $dbf_db ( @$names_dbf_db ) { # DEBUG("$fnc - Datafile in DB: $dbf_db\n"); if ( $dbf_db !~ /$dbdir/ ) { # DEBUG("$fnc - falscher Pfad: $dbf_db matcht nicht mit $dbdir\n"); push @dbf_pfad_falsch, $dbf_db; } else { # DEBUG("$fnc - richtiger Pfad: $dbf_db matcht mit $dbdir\n"); } } if ( @dbf_pfad_falsch ) { LOGDIE("ACHTUNG! Datafile(s) @dbf_pfad_falsch nicht im DB-Verzeichnis $dbdir!\n"); } ### 6 ### if ( @$anz_dbf_db != $anz_dbf_fs ) { # wenn Anzahl der Datafiles ungleich <-- ERROR HERE! DEBUG("$fnc - vgl. @$anz_dbf_db != $anz_dbf_fs\n"); my @dbfs_diff; if ( @$anz_dbf_db > $anz_dbf_fs ) { # mehr Datafiles in der DB als im FS LOGWARN("$fnc - ACHTUNG! Mehr Datafiles in der Datenbank (@$anz_dbf_db) als im Filesystem ($anz_dbf_fs)!\n"); @dbfs_diff = grep 'MISSING', @$names_dbf_db; } elsif ( @$anz_dbf_db < $anz_dbf_fs ) { # mehr Datafiles im FS als in der DB DEBUG("$fnc - vgl. @$anz_dbf_db < $anz_dbf_fs\n"); LOGWARN("$fnc - ACHTUNG! Mehr Datafiles im Filesystem ($anz_dbf_fs) als in der Datenbank (@$anz_dbf_db)!\n"); foreach my $dbf_fs ( @dbfs_fs ) { if ( ! grep /$dbf_fs/, @$names_dbf_db ) { DEBUG("$fnc - DBF $dbf_fs matcht nicht mit DB.\n"); push @dbfs_diff, $dbf_fs; } } } else { INFO("$fnc - Anzahl Datafiles in Datenbank und Filesystem ident.\n"); } if ( @dbfs_diff ) { LOGWARN("$fnc - Fehlende(s) Datafile(s): @dbfs_diff\n"); } $rcs { "$fnc" } = (1); } } OUTPUT: 2010/10/27 12:29:15 main::checkDatafiles - Anzahl Datafiles aus DB: 141 2010/10/27 12:29:15 main::checkDatafiles - Anzahl Datafiles im Filesystem: 141 2010/10/27 12:29:15 main::checkDatafiles - vgl. 141 != 141 2010/10/27 12:29:15 main::checkDatafiles - vgl. 141 < 141 2010/10/27 12:29:15 main::checkDatafiles - ACHTUNG! Mehr Datafiles im Filesystem (141) als in der Datenbank (141)! I hope that the sense of my output can be understood, even if it is not in English... Any help appreciated :-) Kind regards, Nora