Oracle
 sql >> Base de données >  >> RDS >> Oracle

PDO_OCI - dans un champ clob

J'ai trouvé une solution ici :

https://bugs.php.net/bug.php?id=57095

[2009-08-11 11:27 UTC] lehresman sur gmail point com a écrit :

Un collègue a trouvé la solution. Lorsque vous traitez avec des CLOB dans Oracle à l'aide de PDO, ne le traitez pas comme un LOB. Vous devez le lier en tant que PDO::PARAM_STR et lui donner la longueur de la chaîne (ce 4ème paramètre est la clé, sinon il échoue avec un message d'erreur concernant le type LONG).

Voici un exemple d'insertion réussie dans un CLOB dans Oracle :

<?php

/*
CREATE TABLE clob_test (my_clob CLOB)
*/

$big_string = "";
for ($i=0; $i < 10000; $i++)
    $big_string .= rand(100000,999999)."\n";

try {
    $pdo = new PDO("oci:dbname=TESTDB", "TESTUSER", "TESTPW");
    $stmt = $pdo->prepare("INSERT INTO healthbit.clob_test (my_clob) VALUES (:cl)");
    $stmt->bindParam(":cl", $big_string, PDO::PARAM_STR, strlen($big_string));
    $pdo->beginTransaction();
    if (!$stmt->execute()) {
        echo "ERROR: ".print_r($stmt->errorInfo())."\n";
        $pdo->rollBack();
        exit;
    }
    $pdo->commit();

    $stmt = $pdo->prepare("SELECT my_clob FROM healthbit.clob_test");
    $stmt->execute();
    $row = $stmt->fetch();
    $str = "";
    while ($tmp = fread($row[0],1024))
        $str .= $tmp;
    echo strlen($str); // prints 70000
} catch (Exception $e) {
    echo "ERROR: ";
    echo $e->getMessage();
    $pdo->rollBack();
}

Fonctionne parfaitement bien pour moi...