2009-07-22 6 views
1

Voyant un comportement étrange, en se connectant à la base de données Oracle, puis en appelant la fonction externe, la valeur de $? est toujours -1.
La machine à problèmes fonctionne sous AIX5.3 standard, avec DBD :: Oracle 1.20 et DBI 1.602.DBD :: Oracle entraînant une corruption des appels système?

#!/usr/bin/perl -w 
use DBI; 

CORE::system "pwd"; 
print "Before connect: $?\n"; 
DBI->connect('dbi:Oracle:', 'pwd', 'pwd'); 
print "Before system: $?\n"; 
CORE::system "pwd"; 
print "After system: $?\n"; 
CORE::system "pwd"; 
print "After system: $?\n"; 

Before connect: 0 
Before system: 0 
/usr/local/bin 
After system: -1 
/usr/local/bin 
After system: -1 

Ce sont les résultats d'une autre machine à AIX 5.3, la seule différence que je vois est qu'il est en cours d'exécution DBD: Oracle 1,22 et 1,607 DBI. Cependant en regardant les journaux de changement pour ces modules, je ne vois rien qui puisse se rapporter à cela. Toutes les idées pour d'autres choses que je peux essayer autre que la mise à niveau de DBD: Oracle et DBI (hésitent à le faire tout de suite car il s'agit d'une machine de production).

Répondre

1

de perldoc -f system:

Valeur de retour de -1 indique un échec pour démarrer le programme ou une erreur de l'appel système wait(2) (inspection $! pour la raison).

Il ressemble à l'appel système n'est pas en mesure de exec le plus programme pwd. Essayez de changer vos system appels à:

my $rc = system "pwd"; 
if ($rc == -1) { 
    die "system call failed: $!"; 
} elsif ($rc & 0b0000_0000_0111_1111) { 
    die "system call died due to signal ", $rc & 0b0000_0000_0111_1111; 
} elsif ($rc & 0b1111_1111_0000_0000) { 
    warn "system call returned non-zero exit code: ", $rc >> 8; 
} 
+0

Donne la sortie suivante: /usr/local/bin l'appel système a échoué: il y a aucun processus enfant. à la ligne ./test.pl 7. Notez que la commande pwd proprement dite est terminée (sortie/usr/local/bin). – Patrick

+0

Basé sur ce message d'erreur, trouvé le lien suivant, semble être le même comportement: http://rt.cpan.org/Public/Bug/Display.html?id=16548 – Patrick

+1

Basé sur l'un des commentaires là-bas , J'ai ajouté ce qui suit après la connexion: $ SIG {CHLD} = 'DEFAULT'; Cela semble résoudre (ou contourner le problème), merci pour les informations sur la façon d'obtenir le message d'erreur supplémentaire. – Patrick

0

Je réalise cette annonce est plusieurs mois après le fait, mais comme je l'ai rencontré le même problème, je détaillerai ma solution pour tous ceux qui trébuche sur votre poste.

Différentes versions des bibliothèques Oracle OCI traitent SIGCHILD séparément (par exemple, j'ai votre problème avec 11gR2 mais pas 11gR1). Si vous évitez d'utiliser des connexions en légende en changeant

DBI-> connect ('dbi: Oracle:', 'pwd', 'pwd');

à

DBI-> connect ('dbi: Oracle:', 'PWD', 'PWD');

vous verrez que votre problème disparaît. Bien sûr, vous ne voulez pas vous connecter en passant par l'écouteur, mais je n'ai pas de solution pour cela ...

+1

Je ne vois aucune différence entre les deux déclarations que vous énumérez. Ai-je manqué quelque chose ou est-ce une faute de frappe? – Patrick

+0

Je suppose, à partir de la mention de passer par l'écouteur, que le second devrait être DBI-> connect ('dbi: Oracle: tnsconnect', 'pwd', 'pwd'); où tnsconnect est une chaîne de connexion. –

Questions connexes