PERL SQLPLUS encapsulé

PERL SQLPLUS encapsulé - Perl - Programmation

Marsh Posté le 04-07-2012 à 10:22:19    

Bonjour,
 
Voila, j'ai un petit souci. je m'explique
Je me connecte en ssh sur un serveur, dans ce shell, je fais un su - grid pour executer un script SQL.  
Quand j'execute tout ma commande depuis un shell standard pas de problème, par contre depuis un script perl, rien ne se passe. Enfin il se connecte correctement sous l'utilisateur grid lance la commande sqlplus mais je n'obtient aucun résultat.
Voici un bout de mon script.  
my $command = 'sqlplus / as sysdba << EOF
 set heading off  
 set pages 1000  
 set lines 300
 col path format a50
 col instance_name format a20
 select v\$asm_diskgroup.name,v\$asm_disk.PATH from v\$asm_diskgroup,v\$asm_client,v\$asm_disk where v\$asm_client.GROUP_NUMBER=v\$asm_disk.GROUP_NUMBER and v\$asm_disk.GROUP_NUMBER=v\$asm_diskgroup.GROUP_NUMBER;
 EOF';
 
print $command ."\n";  # ici pas de problème
 
my @lines= () ;  
 my $cmd ;
 $cmd='ssh -q -o stricthostkeychecking=no -o batchmode=yes root@'.$server.' \'echo "1" | su - grid -c \''.$command; # Je pense que le problème vient d'ici.
 print "Commande executée : ". $cmd . "\n";    
 open (SHELLCMD,"$cmd |" );
  while (<SHELLCMD> ){
   s/^\s+//g;
   s/\s+$//g;
   if (defined($_)){
    my ($line)=$_ ;
    print "line = " . $line ."\n";
    $lines[$i]= $line;
    $i++;
   }
  }
 
Et voici le résultat de tout ça  
line =
line = 1) - +ASM1 - Oracle Grid and ASM Environment
line =
line = --->
line =
line = SQL*Plus: Release 11.2.0.3.0 Production on Wed Jul 4 10:08:46 2012
line =
line = Copyright (c) 1982, 2011, Oracle.  All rights reserved.
line =
line = Enter user-name: logout  
 
J'ai modifié le script pour le faire tourner en local, pas de souci.  
 
Si vous avez une idée.
Merci pour votre aide.  
Grulles  
 
 
 

Reply

Marsh Posté le 04-07-2012 à 10:22:19   

Reply

Marsh Posté le 04-07-2012 à 12:49:06    

Citation :

$cmd='ssh -q -o stricthostkeychecking=no -o batchmode=yes root@'.$server.' \'echo "1" | su - grid -c \''.$command; # Je pense que le problème vient d'ici.


Il y a pas un ' qui manque quelque part?
'ssh -q -o stricthostkeychecking=no -o batchmode=yes root@' OK
.$server. OK
' \'echo "1" | su - grid -c \''.$command; je ne vois pas la ' fermant celle de départ
EDIT ah! ça se termine par deux simple quotes
 
A+,


Message édité par gilou le 04-07-2012 à 12:49:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-07-2012 à 13:14:34    

Merci pour ta réponse gilou  
Non pas mieux. c'est comme si la commande sqlplus n'arrivait pas à me renvoyer le résultat .  
Je vois bien le header du sqlplus ..
 
line FROM PARENT = SQL*Plus: Release 11.2.0.3.0 Production on Wed Jul 4 13:06:24 2012
line FROM PARENT =
line FROM PARENT = Copyright (c) 1982, 2011, Oracle.  All rights reserved.
line FROM PARENT =
line FROM PARENT = Enter user-name: logout  
Mais cette dernière ligne me parait etrange ...  

Reply

Marsh Posté le 04-07-2012 à 14:26:49    

Avec
my $command =<<EOF
 'sqlplus / as sysdba
 set heading off
 set pages 1000
 set lines 300
 col path format a50
 col instance_name format a20
 select v\$asm_diskgroup.name,v\$asm_disk.PATH from v\$asm_diskgroup,v\$asm_client,v\$asm_disk where v\$asm_client.GROUP_NUMBER=v\$asm_disk.GROUP_NUMBER and v\$asm_disk.GROUP_NUMBER=v\$asm_diskgroup.GROUP_NUMBER;'  
EOF
;
ça marcherait pas mieux?
Il y avait plusieurs pbs:
Un blanc entre le << et le EOF ce qui en faisait une séquence pas reconnue ('deprecated')
les ' avant le <<EOF ce qui fait qu'ils étaient pris en compte en premier
le ; juste après le EOF alors qu'il doit figurer seul sur la ligne.
 
Bref, si  
$command doit contenir

'sqlplus / as sysdba
 set heading off
 set pages 1000
 set lines 300
 col path format a50
 col instance_name format a20
 select v$asm_diskgroup.name,v$asm_disk.PATH from v$asm_diskgroup,v$asm_client,v$asm_disk where v$asm_client.GROUP_NUMBER=v$asm_disk.GROUP_NUMBER and v$asm_disk.GROUP_NUMBER=v$asm_diskgroup.GROUP_NUMBER;'


ce qui à priori me semble logique au vu du $cmd='ssh -q -o stricthostkeychecking=no -o batchmode=yes root@'.$server.' \'echo "1" | su - grid -c \''.$command;  
alors ça devrait coller avec ce que je vous ai modifié.
 
Peut être que pour la première ligne, un  'sqlplus "/ as sysdba" est meilleur, au vu de certains exemples trouvés sur le web (qui ont aussi un exit final en fin de commande).
 
A+,


Message édité par gilou le 04-07-2012 à 14:30:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-07-2012 à 10:16:42    

Salut Gilou
Désolé pour ma réponse tardive, mais j'étais en vacances et qui dit vacances dit pas d'internet, merci encore pour ton aide...  
Sinon, j'ai essayé mais ça ne fonctionne pas dans mon environnement, le problème c'est la commande ssh qui encapsule un "su" puis un sqlplus. J'ai pallié au problème en créant un fichier sql que je dépose  sur les serveurs et après je peux l’exécuter sans pb.  
 
FYI : voici ce que cela donne en espérant que cela puisse aider quelqu'un d'autre :  
my $transfert='scp -q -o stricthostkeychecking=no asm_diskgroup.sql root@'.$server.':/home/grid/';
 system($transfert);  
 $cmd='ssh -q -o stricthostkeychecking=no -o batchmode=yes root@'.$server.' \' echo "1" | su - grid -c  "sqlplus -S / as sysdba @asm_diskgroup.sql" \' ';  
 
 
Grulles


Message édité par gilou le 26-07-2012 à 11:43:49
Reply

Sujets relatifs:

Leave a Replay

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