[perl]sqlplus (no module)

Bonjour,

La contrainte est simple, je ne peux pas utiliser de module autres que ceux fournit de bases avec perl.

J'aimerai récupérer la version d'Oracle coté serveur, celle ci est marqué au moment de la connexion :

le code :
$bob = `sqlplus PSEUDO/PASS`;
$bob =~ /Oracle Database 10g Enterprise Edition Release (.*) - /;
print $1;


Bien évidemment ca ne marche pas, j'ai essayé en rajoutant un "exit" mais ca plante pareil.
Configuration: Windows XP
Firefox 3.5.7

8 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    Affiche le contenu de $bob
    $bob = qx#sqlplus PSEUDO/PASS#;
    print "$bob\n"

    1. Ca ne fonctionne pas, après l'exécution du perl le programme reste bloqué.
      Après un [ctrl]+c, pour annuler l'exécution du perl, j'ai alors un message d'erreur :

      /bob/tmp>Error 45 initializing SQL*Plus
      Internal error
      1. C'est plus qu'une piste, c'est la solution!

        Malheureusement je ne peux pas utiliser de module externe, je ne peux utiliser que les modules natifs de perl.... Galère...
        1. Bon j'ai trouvé, c est pas super propre mais sans module j'ai pas trouvé d autres facons :

          $shell = "X=`sqlplus -S login/pass <<EOFTOTO
          set HEADING    off
          set LINESIZE   250
          set PAGESIZE   0
          set SQLPROMPT  \"\"
          set ECHO       off
          set WRAP       off
          set VER        off
          set FEED       off
          set TERM       off
          set SQLNUMBER  OFF
          SELECT * FROM v\\\\\$version ;
          EOFTOTO`
          echo \"\$X\" >> rqt.txt";
          
          	open (FILE, ">rqt.sh");
          	print FILE $shell;
          	close FILE;
          
          	system ". rqt.sh";
          	unlink "rqt.sh";
          
          	open (FILE, "rqt.txt");
          	$/ = "66210-34" ;
          	$result = <FILE>;
          	$/ = "\n" ;
          	close FILE;
          	unlink "rqt.txt";
          
          	if ($result =~ /Edition Release (.*) - /){
          		$oraserv = $1;
          		print $oraserv;
          	


          $version a beaucoup d 'antislash car il faut empécher l'interprétation du $version comme une variable pour perl, shell et sqlplus....
          1. Modérateur
            Salut,

            Tu aurais pu utiliser open de cette manière pour lire depuis une commande

            La commande shell
            $ gcc --version
            gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
            Copyright (C) 2004 Free Software Foundation, Inc.
            This is free software; see the source for copying conditions.  There is NO
            warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


            Le script
            $ cat readpipe.pl
            #!/usr/bin/perl
            
            open LIREPIPE,"gcc --version |" or die "E/S : $!\n";
            while (<LIREPIPE>){
              print if /gcc/i;
            }
            
            $ perl readpipe.pl
            gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)


            Quelque chose comme ça dans ton cas

            my $oraserv;
            my $connect_oracle = "X=`sqlplus -S login/pass <<EOFTOTO
            set HEADING    off
            set LINESIZE   250
            set PAGESIZE   0
            set SQLPROMPT  \"\"
            set ECHO       off
            set WRAP       off
            set VER        off
            set FEED       off
            set TERM       off
            set SQLNUMBER  OFF
            SELECT * FROM v\\\\\$version ;
            EOFTOTO`
            echo \"\$X\" >> rqt.txt";
            
            open FILE,"$connect_oracle |" or die "E/S : $!\n";
            while (<FILE>){
            	next unless /Edition Release (.*) - /;
            	$oraserv = $1;
            }
            print $oraserv;


            1. Salut, je suis désolé mais ca ne fonctionne pas.

              Le open File fonctionne bien et exécute bien la requete, mais j'ai l'impressions que le while <FILE> ne fonctionne pas.

              Par exemple si je fais un print dans le while :
              open FILE,"$connect_oracle |" or die "E/S : $!\n";
              while (<FILE>){
                   print "je suis dans le while \n";
              	next unless /Edition Release (.*) - /;
              	$oraserv = $1;
              }
              
              


              ca ne print rien et je n'ai pourtant pas l'erreur du open FILE..... Je ne comprend pas tres bien le fonctionnement de perl pour ce coup ci.
              1. J'ai fait comme ca en fait, j'open la variable qui contient la commande shell qui contient la commande sqlplus et qui crée rqt.txt. Apres j'open rqt.txt.

                Voici le code :

                $shell = "X=`sqlplus -S login/pass <<EOFTOTO
                set HEADING    off
                set LINESIZE   250
                set PAGESIZE   0
                set SQLPROMPT  \"\"
                set ECHO       off
                set WRAP       off
                set VER        off
                set FEED       off
                set TERM       off
                set SQLNUMBER  OFF
                SELECT * FROM v\\\\\$version ;
                EOFTOTO`
                echo \"\$X\" >> rqt.txt";
                
                open (FILE,"$shell |") or die "E/S : $!\n";
                close FILE;
                
                open (FILE, "rqt.txt");
                while (<FILE>){
                	next unless /Edition Release (.*) - /;
                	$oraserv = $1;
                }
                close FILE;
                unlink "rqt.txt";
                	
                print $oraserv;