Bonjour,

Je ne suis pas certain de poster au bon endroit, j'ai posté là où bon me semblait, désolé si ce n'était pas le meilleur endroit pour cette problématique.

Ma problématique est la suivante :

Je suis dans une application PHP (j'utilise notamment ZEND) et j'ai besoin depuis php d'appeler une procédure SQL située sur un système iSeries (AS400) dans une base de données DB2. Ma problématique se situe au niveau du passage de paramètres. Ma procédure SQL est déclarée avec 2 paramètres, 1 premier paramètre en entrée de type char (qui ne pose pas de problèmes), et un deuxième paramètre en entrée/sortie de type int (que je n'arrive pas à gérer). Je n'ai pas réussi à mettre la main sur une doc ou un bout de code mettant en oeuvre un passage de paramètre de type int dans ce cadre.

Voici le code :

côté php :

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
public function createListeDiffusion($idDemande)
{
//initialisation du code retour à 0
$cdret = 0;

$conn = i5_connect($this->_machine, $this->_uid, $this->_pwd, $this->_connOptions);

if ($conn == false) die("<br>Connection Error. Errornumber = ".i5_errno()." msg = ".i5_errormsg())."<br>";

$sql = "CALL A_LstCA(? , ?)";

$stmt= i5_prepare($sql);

if ($stmt == false) die("<br>prepare error. Error number =".i5_errno()."msg=".i5_errormsg());
		
$ret = i5_paramdesc($stmt, I5_TYPE_CHAR, 0, 26, 0, I5_IN);

if ($ret == false) die("<br>paramdesc '0' error. Error number =".i5_errno()."msg=".i5_errormsg());
		
$ret = i5_setparam($stmt, 0, $idDemande);
		
if ($ret == false) die("<br>setparam '0' error. Error number =".i5_errno()."msg=".i5_errormsg());

//                  QUE DOIS JE METTRE ???		
$ret = i5_paramdesc($stmt, I5_TYPE_INT, 0, 9, 0, I5_INOUT);
		
if ($ret == false) die("<br>paramdesc '1' error. Error number =".i5_errno()."msg=".i5_errormsg());
		
$ret = i5_setparam($stmt, 1, $cdret);

if ($ret == false) die("<br>setparam '1' error. Error number =".i5_errno()."msg=".i5_errormsg());
		
$result = i5_execute($stmt );
		
if($result == false) echo "Execute Error:". i5_errno()."  Msg:".i5_errormsg()."<br>";
		
return;
}
j'ai mis en gras la ligne qui me pose problème :
$ret = i5_paramdesc($stmt, I5_TYPE_INT, 0, 9, 0, I5_INOUT)

pour le type char pas de problème par contre je trouvé aucun exemple avec le type "I5_TYPE_INT" et c'est les paramètres 3, 4 et 5 de i5_paramdesc qui me pose problème car je ne sais pas quelles valeurs assigner, ils représentent respectivement :
3-Sequence – Parameter sequential number (starting from 0)
4-Length – Parameter length
5-Decimals – Number of decimal position for the numeric parameter type

j'obtiens le code erreur -180 et le SQLState : 22007 soit :

-180

THE DATE, TIME, OR TIMESTAMP VALUE value IS INVALID
Explanation

The length or string representation of a DATE, TIME, or TIMESTAMP value does not conform to any valid format.
The value can contain one of the following:

For a host variable, the position number of the input host variable. If the position number cannot be determined, a blank is displayed.
For a character string constant, the character string constant. The maximum length that is displayed is the length of SQLERRM.
For a character column, the column name. If the column is a VIEW column and it has a corresponding base column, the VIEW column name is displayed. If the column is a VIEW column but it does not have a corresponding base column, a string of '*N' is displayed.

Otherwise, value is a string of '*N'.
System action

The statement cannot be processed.
Programmer response

Correct the program to ensure the specified value conforms to the syntax of DATE, TIME, and TIMESTAMP. Refer to SQL Reference for a list of valid DATE and TIME formats.
SQLSTATE

22007

côté iSeries (AS400) DB2 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
Create Procedure A_LstCA ( In      P_IdDemd     Char(26)  
                                    , InOut  P_CdRet      Int       
                         )                              
Language SQL                                            
Modifies SQL DATA                                       
Begin                    
[...]
End;

Si quelqu'un trouve la réponse je dis chapeau