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.
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. –
Cela ne fonctionnait pas pour DB2. Donc j'utilise maintenant un paramètre out au lieu d'une valeur de retour. –
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