PHP, Oracle & PL/SQL

Hello!

Bon, je pose le décor d’abord : boite moyenne qui fait un assez gros soft d’hotellerie en PHP sur IE6 avec une BD Oracle.

Problème : on commence à faire sérieusement tous les processus en PL/SQL ( parce que miam et c’est rapide ), et on a vraiment du mal à recuperer les données generée par Oracle depuis PHP.

Je m’explique : on ne sait pas, par exemple, comment chopper un array que pourrait retourner une fonction PL/SQL. On a bien trouvé un moyen de chopper des valeures de retour en utilisant des REF_CURSOR qu’on déclare comme IN/OUT dans le procedure PL/SQL, en l’appellant avec la fonction PHP OCINewCursor qui permet de créer un curseur, et faire que le procédure le remplisse et rechopper le curseur plein après coup. Je suis pas ultra-claire sur ce coup peut-être. Ça donne un truc du genre :

[code]$CURSOR_GARANTIAS = OCINewCursor( $BD );

$SQL = "BEGIN ";
$SQL.= « P_GENERA_ARRAY_GARANTIAS ( :DATA, :AGENCIA, TO_DATE( :FECHA_INI, ‹ DD-MM-YYYY › ), TO_DATE( :FECHA_FIN, ‹ DD-MM-YYYY › ), :GRABAR, :SERIE, :USUARIO, :DECIMALES, :DIVISA, :EMP ); »;
$SQL.= « END; »;

$PARAMETROS[":AGENCIA"] = $AGENCIA;
$PARAMETROS[":FECHA_INI"] = $FECHA_DESDE;
$PARAMETROS[":FECHA_FIN"] = $FECHA_HASTA;
$PARAMETROS[":GRABAR"] = $GRABAR;
$PARAMETROS[":SERIE"] = $SERIE;
$PARAMETROS[":USUARIO"] = $USUARIO;
$PARAMETROS[":DECIMALES"] = $DECIMALES;
$PARAMETROS[":DIVISA"] = $DIVISA;
$PARAMETROS[":EMP"] = $EMPRESA;

$STMT = OCIParse( $BD, $SQL );

foreach( $PARAMETROS as $I => $J )
{ OCIBindByName( $STMT, « $I », &$PARAMETROS[$I], -1 ); }

OCIBindByName( $STMT, « DATA », &$CURSOR_GARANTIAS, -1,OCI_B_CURSOR );

OCIExecute( $STMT );
OCIExecute( $CURSOR_GARANTIAS );

$I = 0;
while ( OCIFetchInto( $CURSOR_GARANTIAS, &$DATA ))
{
$ARRAY[$I] = $DATA;
$I++;
}

OCIFreeCursor( $STMT );
OCIFreeStatement( $STMT );

return $ARRAY[/code]

Et là :DATA est le REF_CURSOR que le procedure va remplir.

Bon … ça marche très bien quand on sait exactement ce que le procédure va génerer, mais quand c’est un truc dynamique, genre d’une date à une autre, on ne sait pas trop comment faire pour passer les valeurs de l’array au cursor.

Donc … euh … si qqun a déjà bossé avec PHP + Oracle …

Merci :stuck_out_tongue:

P.S : oui je programme en espagnol, HA!

Je sais que je vais pas super repondre a la question et que tu t’en fout surement de mon opinion mais la quand meme… Php et oracle?
Ca sonne un peu comme un MacCaviar a $7500 par CPU…

Java, sevlets, JDBC? non?

Si c’est pour un petit truc de reporting par dessus pourquoi pas, ca va vite et c’est pratique mais si c’est l’appli principale c’est, a mon avis a moi, un peu de l’argent jete par les fenetres. Pour ton probleme specifique, je peux super me tromper (j’espere pour toi) mais a mon avis en php4, si c’est pas prevu par le provider c’est zob, tu est nique des que tu fais des trucs pas standards. En general la couche DB est pas super prevue pour faire autre chose que des manips de base au niveau format des retours.

Au fait si c’est du PHP5 (que je connais pas bien) tu as le PDO (ca doit etre une sorte de JDBC) qui est le nouveau truc d’abstraction d’acces aux bases en PHP. Ca serait surement plus facile de voir ce que tu peux faire en utilisant ca. Ca a pas l’air d’etre du php5 la, mais si c’est une option, regardes si ca va mieux avec ca…

Glop > mega-troll spotted :stuck_out_tongue:
(Sinon désolé j’ai pas de vraie réponse à la vraie question :P)

[quote name=‘Zekiller’ date=’ 9 Nov 2004, 21:10’]Et là :DATA est le REF_CURSOR que le procedure va remplir.
[right][post=“301284”]<{POST_SNAPBACK}>[/post][/right][/quote]C’est quoi la définition de ton ref cursor ?
Il peut être typé comme ref cursor tout court sans autre précision il me semble ?

D’autre part tu peux aussi utiliser un record ?

PS: Je connais Oracle mais pas php.

Bah non pas mega troll, Oracle coutant $7500 par CPU, si c’est pour l’utiliser comme du Mysql ameliore je trouve ca nul et je pense franchement que c’est du gachi si c’est l’appli principale. Le MacCaviar etait un peu provoc j’admet :stuck_out_tongue: c’est fait expres… mais c’est loin d’etre un troll…

Maintenant si c’est pour faire un truc de reporting par dessus la base existante, un peu de data mining, tranquille c’est bon, effectivement PHP peut super bien le faire, RAD tout ca, t’as un truc qui tourne vitesse grand V, tout le monde est content, joie, bonheur et felicite dans le monde de l’entreprise :P. Maintenant tout depend du scenario et le peu qu’il explique semble dire que c’est l’appli principale et juste comme ca la PHP sur du Oracle… surtout du PHP4… non quoi, je suis super serieux, moi je trouve que c’est une recette pour les emmerdes. Mais bon c’est lui qui va se taper le mix, moi je donne juste mon avis.

Surtout que c’est pas comme si une solution Java coutait plus cher en licenses… ou que tu sois a quelques $ pres pour te payer un bon framework genre Resin de Caucho ou autre. Remarque que je parle que de Java, j’ose meme pas parler ASP.Net parceque ca a rien a faire ici et je pense pas que windows soit la plate forme qu’il aient choisit. Ca a rien a voir avec « machin c’est mieux que truc »…

[quote name=‘GloP’ date=’ 9 Nov 2004, 22:17’]Je sais que je vais pas super repondre a la question et que tu t’en fout surement de mon opinion mais la quand meme… Php et oracle?
Ca sonne un peu comme un MacCaviar a $7500 par CPU…[/quote]

Aaah ça c’est pas à moi qu’il faut demander. C’est sûr que PHP c’est supra pas le meilleur truc, mais ouais, c’est une grosse appli, et c’est TOUT en PHP. Et je dois dire qu’on arrive à faire des trucs que j’aurais jamais pensé possibles, mais bon, là on touche quand même profond au limitations de la bête.

En même temps, avec le programme déployé et 3 ans de dev’ derrière, c’est un peu tard pour dire “ouais non on va faire ça en java” ou “on change en .NET avec MSSQL” ( même si, haha, il y a de ça une année, des gars de Microsoft sont venus pour nous convaincre de tout changer en ASP.NET avec plein de bon plans gratos. Pas de chance, la boite préfère les serveurs linux … ).

Bref tout ça pour dire que ouais, c’est peut-être pas une trop bonne idée, mais mes patrons sont loin d’être des lumières et maintenant c’est un peu tard … pas de bol.

Pour le PHP 5, on y songe pour les nouveaux modules, j’essaye de regarder de ce côté.

Oui si tu peux PHP5, apres avoir attendu un peu qu’ils virent les bugs les plus relouds a mon avis ca vaut carrement le coup. Ils ont quand meme fait des gros progres et justement ils se dirigent plus vers un truc de type « enterprise » qui gere tout ces petits bordels et avec PDO qui est plus « architecture » pour faireun truc propre avec Oracle. Moi je dis met la pression pour :stuck_out_tongue:
Sinon je comprend tout a fait le probleme de l’appli qui grossit, qui grossit et qui continue d’utiliser le truc qu’on a choisit au depart :stuck_out_tongue: C’etait pas un reproche ca arrive super souvent. J’avais pas realise que c’etait pas un nouveau produit :stuck_out_tongue: En tout cas bonne chance!

[quote name=‘phili_b’ date=’ 9 Nov 2004, 22:33’]C’est quoi la définition de ton ref cursor ?
Il  peut être typé comme ref cursor tout court sans autre précision il me semble ?

D’autre part tu peux aussi utiliser un record ?

PS: Je connais Oracle mais pas php.
[right][post=“301330”]<{POST_SNAPBACK}>[/post][/right][/quote]

Là c’est un REF CURSOR sans record derrière, mais bon je pourrais faire les deux, c’est pas un problème.

En fait le problème basique c’est comment “remplir” un CURSOR avec un array en PL/SQL ( si c’est possible, bien que j’en doute ).

un petit UP …

Aucune idée ? :stuck_out_tongue: