IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

[Sqlserver] DBI et variable OUTPUT


Sujet :

SGBD Perl

  1. #1
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut [Sqlserver] DBI et variable OUTPUT
    Bonjour,

    Quand j'exécute une requête sur un serveur sqlserver, le script fait printf du nombre d'enregistrement impactés(delete/insert) ou retournés(select).
    Ce printf a lieu lors de la fermeture d'une accolade. J'aimerai récupérer cette valeur de façon propre et que le script ne fasse pas de printf que je ne lui ai pas demandé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        my $requete = "EXECUTE [InfraPeriph].[dbo].[sp_importSupervision_bis] services,null,$cls_param ";
        my $sth = $dbh_infra->prepare($requete);
        $sth->execute() or $logger->debug("Erreur bdd SqlServer@".$InfraBdd{$env}{'ip'}." : ". $DBI::errstr);
     
        my @row;
        #Parcours des enregistrements
        while (@row = $sth->fetchrow_array()) {
     
     [...]traitement
     
        } #fin boucle
    # NB record s'affiche ici 43 (sqlserver)
    L'affichage du nombre d'enregistrements passe par la sortie d'erreur.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Dans la procédure stockée, il y avait des PRINT. L'affichage de ce print passe par le flux d'erreur (2). J'ai demandé la modification de la procstock. Je souhaite maintenant binder une variable pour récupérer cette valeur proprement. Par contre je ne sais pas comment faire.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Les PRINT entrainent l'écriture d'un string sur STDERR.
    J'ai essayé de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( my $RC = <STDERR>)
    mais ça ne récupère rien. ça a lieu quand l'accolade fermant le scope où la requête sqlserver a eu lieu apparaît.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    sub mytest{
     
            my $server      ='**.**.**.**';
            my $login       ='********';
            my $password    ='***********';
     
            $ENV{'SYBASE'} = '/usr/local/freetds' unless $ENV{'SYBASE'};
            my $dbh_alti =    DBI->connect('dbi:Sybase:server='.$server,$login,$password)
            or printf ("Echec connexion $login@".$server." ".DBI->errstr);
     
            my $requete = "DECLARE \@output INT; SET \@output=1337; PRINT \@output;";
    #       my $requete = "PRINT 1337";
     
            my $sth = $dbh_alti->prepare($requete);
     
    # save original STDERR
    open my $saved_stderr, ">&STDERR";
    # create a pipe, which we'll use to read STDERR
    local(*RH, *WH);
    pipe RH, WH;
    # connect the writing side of the pipe to STDERR, with
    # STDERR being (and remaining) fileno 2 (!)
    open STDERR, ">&WH" or die "open: $!";
    # debug: verify that fileno(STDERR) really is 2
    printf "fileno(STDERR): %d\n", fileno(STDERR);
     
            my $rc = $sth->execute
            or die "Can't execute statement: $DBI::errstr";
     
    # close WH to avoid buffering issues (pipes are buffered)
    close WH;
    # read output (one line)
    # (todo: fix so it doesn't block when there's nothing to read!)
    my $err = <RH>;
    close RH;
     
    # restore original STDERR
    open STDERR, ">&", $saved_stderr or die "open: $!";
     
    print "captured stderr: $err\n";
     
    }
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    à la lecture de tes trois premiers posts, j'allais te proposer de rediriger la sortie d'erreur, par exemple à la ligne de commande lançant ton script, avec un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl my_program.pl param1 param2 2>/dev/null
    ou dans le script Perl lui-même en associant un fichier à la sortie d'erreur. Il me semble que c'est plus ou moins ce que tu fais dans le script du post # 4, est-ce que ça marche pour toi?

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
     
    use IO::Capture::Stderr;
     
    my $capture = IO::Capture::Stderr->new();
    $capture->start();
     
    print STDERR "erreur t'asvu";
     
    $capture->stop();
    my $err = $capture->read;
     
    printf $err."\n";
    Je ne veux rediriger STDERR que pour une commande interne à Perl (le $sth->execute d'une requête sqlserver)
    Il faudra que je vérifie si le "or die" fonctionne bien. Mis à part ça le paquet IO::capture a l'air de faire le travail.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Amha le or die va arrêter le programme sans rien écrire sur STDERR, du coup il ne faudrait pas mettre le die à cet endroit là mais plutôt après la réouverture de stderr.

    Bien à toi.
    Loceka.

  8. #8
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Tu as raison Loceka, cette capture a un bel effet de bord qui peut m'empêcher de récupérer les messages d'erreur. Merci.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Output multi variables avec Matlab builder EX
    Par jerryshen427 dans le forum MATLAB
    Réponses: 0
    Dernier message: 20/04/2009, 14h17
  2. Réponses: 4
    Dernier message: 24/11/2008, 16h04
  3. Récuperer la valeur de la variable output.
    Par zer_hich dans le forum SSIS
    Réponses: 1
    Dernier message: 26/06/2008, 16h14
  4. [SqlServer 2K] curseurs avec SELECT contenant des variables
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2006, 10h25
  5. Variable OUTPUT dans Trigger
    Par Yanmeunier dans le forum Développement
    Réponses: 4
    Dernier message: 09/12/2005, 13h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo