Appel procédures stockées par PDO

Petit nouveau ! | 2 Messages

24 janv. 2007, 14:41

Bonjour,

je voudrais appeler des procédures stockées sur base DB2 dont un ou plusieurs paramètres I/O sont des zones décimales, des zones date et/ou heure.
Or PDO ne propose a priori que des paramètres de type
PDO::PARAM_BOL pour booléen
PDO::PARAM_STR pour string
PDO::PARAM_INT pour integer
PDO::PARAM_STMT pour statement

Quelqu'un connaît-il l'astuce technique permettant de contourner ces limitations ?

Petit nouveau ! | 2 Messages

25 janv. 2007, 10:02

premiers éléments de réponses :

pour les paramètres décimaux étendus

. dans la déclaration de procédure stockée, déclarer le paramètre en char
. dans l'appel PDO utiliser PDO::PARAM_STR
. dans le PHP, une petite gymnastique de mise en forme est nécessaire:
caler le nombre à droite avec remplissage par des zéros non signficatifs à droite, de même remplir les caractères de gauche vides par des zéros

Exemple : sur un étendu de 5 dont 2 décimales, 14,2 doit se mettre en forme comme '01420'

De la même manière un traitement de mise en forme du résultat sera nécessaire dans l'autre sens (enlever les zéros à droite et à gauche, et positionner la virgule)

Remarque importante, la déclaration de paramètre doit se faire avec une position de plus (je n'ai pas encore compris pourquoi)
ainsi, si le paramètre I/O fait 8 de long, la déclaration de paramètre doit se faire comme suit :

$stmt->bindParam(1, $a, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 9);


pour les paramètres date

. dans la déclaration de procédure stockée, déclarer le paramètre en char de 10 toujours
. dans l'appel PDO utiliser PDO::PARAM_STR
. dans le PHP, une petite gymnastique de mise en forme est nécessaire:
si la procédure stockée gère la zone date en représentation *ISO, évidemment la date doit être structurée en AAAAMMDD mais en plus doit être séparée par des tirets, soit au final AAAA-MM-DD.
Il faudra également adapter pour les représentations *EUR, *USA...

Remarque importante, la déclaration de paramètre doit se faire avec une position de plus
$stmt->bindParam(1, $a, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 11);


pour les paramètres heure

. dans la déclaration de procédure stockée, déclarer le paramètre en char de 8 toujours
. dans l'appel PDO utiliser PDO::PARAM_STR
. dans le PHP, une petite gymnastique de mise en forme est nécessaire:
si la procédure stockée gère la zone heure en représentation *ISO, l'heure doit être structurée en HHMMSS mais en plus doit être séparée par des points, soit au final HH.MM.SS .
Il faudra également adapter pour les représentations *EUR, *USA...

Remarque importante, la déclaration de paramètre doit se faire avec une position de plus
$stmt->bindParam(1, $a, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 9);


pour les paramètres décimaux packés

dans la déclaration de procédure stockée, déclarer le paramètre en decimal
dans l'appel PDO utiliser PDO::PARAM_INT

Voilà, j'espère que ces éléments d'information pourront aider ceux qui utilisent les procédures stockées. N'hésitez pas à compléter ou à ajuster...