2011-11-02 4 views
1

Je dois récupérer la valeur renvoyée par un sproc DB2 que j'ai écrit. Le sproc renvoie le nombre de lignes dans une table et est utilisé par le processus appelant pour décider de mettre à jour ou non les autres données.Comment extraire la valeur de retour d'un sproc SQL DB2 à l'aide de Perl DBI?

J'ai regardé plusieurs questions similaires sur SO, mais ils se réfèrent à l'utilisation des paramètres sur au lieu d'utiliser la valeur de retour de sproc, par exemple:

Perl Dbi and stored procedures

J'utilise une connexion standard dBi la base de données avec RaiseError et PrintError activés. J'ai essayé d'examiner $ h-> err pour le handle d'instruction et le handle de db.

Je préfèrerais vraiment communiquer le nombre de lignes via un code retour plutôt que d'utiliser le mécanisme SQLSTATE si je le peux.

Edit:

J'ai fini à l'aide d'un paramètre dédié à communiquer le nombre de lignes mises à jour comme suit:

 

    $sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; 
    $sth = $dbh->prepare($sql_stmt) 
     or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; 
    $sth = $dbh->bind_param_inout(1, $rows_updated, 128) 
     or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; 

    $rows_updated = 0; 
    $rsp = 0; 
    $rsp = $sth->execute(); 
    unless($rsp) { 
     print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n"); 
    } 

    print(STDERR "$rows_updated\n"); 

Edit 2:

Et maintenant penser à propos de cela, j'ai réalisé que je devrais appliquer le principe PragProg de "Tell, ne demandez pas". Autrement dit, je ne devrais pas appeler le sproc. Puis demandez-lui de me rendre un numéro avant de décider si je dois ou non appeler le sprop anopther, c'est-à-dire "Ask".

Je devrais appeler le premier sproc. et demandez-lui s'il doit appeler l'autre sproc ou non, c'est-à-dire "Tell" et laissez-le décider.

Répondre

1

Quel est le problème avec l'utilisation d'un paramètre de sortie dans votre procédure. Je n'ai pas de DB2 fonctionnant en ce moment ou je donnerais un exemple mais quand je l'utiliserais je suis sûr que vous pouvez définir des paramètres de sortie dans les procédures et les lier avec bind_param_inout. Je ne me souviens pas si une procédure DB2 peut renvoyer une valeur (comme une fonction) mais si elle peut les utiliser avec "? = Appel MY_TABLE_SPACE.MY_SPROC ('2011-10-31')" vous permettrait de lier la valeur de retour de sortie. Si cela ne fonctionne pas, vous pouvez utiliser une fonction DB2 qui peut certainement renvoyer une valeur. Cependant, à la fin de la journée, la façon dont vous extrayez des données d'une procédure/fonction consiste à lier les paramètres de sortie - c'est comme ça.

Je ne sais pas ce que vous voulez dire par "utiliser SQLSTATE". Je n'ai pas non plus d'idée de ce que vous voulez dire en regardant $ h-> err car cela n'est défini que si la procédure échoue ou si vous ne pouvez pas appeler la procédure (erreur SQL, etc.).

+0

Merci pour l'aide. Je vais utiliser votre suggestion pour utiliser une affectation dans le SQL "? = Appel MY_TABLE_SPACE.MY_SPROC" avec bind_param_inout. "Utiliser SQLSTATE" signifiait définir une valeur SQLSTATE explicite dans le sproc, bien sûr dans la plage de nombres définie par l'utilisateur, puis utiliser $ sth-> state pour récupérer le code à cinq caractères. –

+0

Cela ne fonctionnait pas pour DB2. Donc j'utilise maintenant un paramètre out au lieu d'une valeur de retour. –

+0

Comme je l'ai dit, je n'étais pas sûr que les procédures DB2 étaient autorisées à renvoyer quoi que ce soit - cela en fait habituellement une fonction et non une procédure. – bohica

Questions connexes