6
votes

Oracle 11g DB des flux de retour au lieu de cordes

J'ai une nouvelle base de données ici et c'est une version améliorée de Oracle 10g à Oracle 11G - Le problème principal est avec les colonnes LOB et chaque fonction renvoie un LOB. La nouvelle base de données ne renverra pas les cordes comme le L'ancien a fait:

Old DB: P>

SELECT TO_CHAR(FUNC())


4 commentaires

Les métadonnées de base de données ont-elles changé du tout? 11g a quelques nouvelles options LOB, telles que SecureFiles. Pouvez-vous comparer user_lobs entre 10 g et 11g?


@JoneRes Qu'est-ce que user_lobs ? Je connais avec user_jobs et c'est à peu près tout ce que je peux trouver lorsque je frappe google avec user_lobs . Je ne pense pas que les métadonnées ont changé mais je vais vérifier.


Quelle (s) fonction (s) OCI utilisez-vous spécifiquement? Aussi, voir ceci pour les différences et exemples d'OCI 10G / 11G DOCS. oracle.com/cd/b28359_01/appdev.111/b28395/oci07LOB.htm


Nous avons surtout oci_fetch_row () dans le code ici ...


3 Réponses :


0
votes

Si vous utilisez PDO, vous devrez peut-être passer de PDO :: PARAM_LOB sur PDO :: PARAM_STR. Par exemple, en combinaison avec la colonne de liaison: xxx


1 commentaires

La moche, c'est que nous avons toujours besoin d'identifier chaque LOB dans chaque relevé (juste pas la déclaration elle-même mais les liaisons) et l'ajuste. Merci de votre réponse, cependant.



1
votes

Pas vraiment une réponse en tant que tel mais aussi quelques articles que j'espère aide.

On dirait qu'il y a une petite différence dans la manière dont les lobes sont retournés entre 10 g et 11g, il y a quelques notes sur la conversion de BYES à byèses lorsque des libreux sont sur une certaine valeur, dans le manuel de référence JDBC. (Je comprends que cela n'effectue pas d'appels OCI car ils utilisent un ensemble de pilotes différent).

D'après ce que je peux voir en termes de fonctions OCI8 dans PHP, le fonctionnement par défaut des fonctions de récupération est que les lobes sont renvoyés sous forme de référence et doivent être consultés à l'aide du -> lire () -> Charger () Fonctions etc fonctionne (voir http://au.php.net/ OCI_FETCH_ARRAY - En ce qui concerne le mode et la valeur par défaut).

Maintenant, je ne sais pas si vous utilisez les fonctions OCI pour accéder à votre système Oracle car il n'est pas spécifié dans votre question.

Couple d'autres objets qui aideraient à comprendre cela serait si vous pouviez nous faire savoir si vous avez recompansé PHP ou mis à jour les pilotes Oracle avec la version client la plus récente du tout.

Je sais que ce n'est pas une solution complète, mais si vous utilisez oci_fetch _ * pour renvoyer la ligne, ajoutez un deuxième argument à l'appel de OCI_RETURN_LOBS , cela causera la récupérer de retourner une chaîne de champ LOB au lieu d'une référence à un flux ou d'utiliser la variable $ ["C"] -> Charger () Pour accéder à ce lob, cela le fera charger flux complet et agissez comme une chaîne normale.

J'espère que cela aide.


5 commentaires

Il semble que (selon la documentation) que seul oci_fetch_array () prend en charge ce paramètre. Le code utilise principalement oci_fetch_row () où il n'est pas pris en charge :(


Si vous pouvez changer le code, vous pouvez remplacer oci_fetch_row () avec OCI_FETCH_ARWARRAY ($ RS, OCI_NUM + OCI_RETURN_NULLS + OCI_RETURN_NULLS + OCI_RETURTURN_LOVELS) et cela vous donnera la même fonctionnalité, bien sûr, cela pourrait-il que cela puisse moi beaucoup de changements en fonction de la quantité d'utilisée, L'autre option serait surcharger la fonction OCI_FETCH_ROW dans un fichier d'inclusion commun à l'aide de la commande Supprimer_function () ( php.net/manual/fr/function.override-function.php )


La surcharge de la fonction est probablement la meilleure réponse à cela maintenant ... Je n'aime pas vraiment cela, car cela se sale de surcharger une fonctionnalité standard, mais c'est probablement le moyen le plus sûr de le faire.


Eh bien, attendons un autre 1-2 jours si quelqu'un propose une meilleure solution pour cela peut-être avec une option de configuration, sinon je pense que vous obtiendrez la bonne réponse et une bonne génération - déjà aidé beaucoup :)


Toujours mieux à pécher sur le côté de la prudence avant de faire quelque chose comme ça :).



0
votes

Lorsque vous utilisez des lobes, vous devez utiliser OCI :: Lire A > ou OCI :: Chargez pour obtenir leur contenu.

[...]
$row = oci_fetch_assoc($result);

$lobContents = $row['LOB_COLUMN']->load(); //fetches the whole LOB
//or
while ($buffer = $row['LOB_COLUMN']->read(4096)) { //sequential read
   $lobContents .= $buffer;
}


1 commentaires

Oui, mais cela signifierait d'énormes quantités de changements de code hérité. Ce n'est pas vraiment ce dont j'ai besoin. Voir la question.