2016-03-24 33 views
1

Bir Oracle DB'ye bazı base64 kodlu veri (alan başına 500.000 karaktere kadar) eklemek istiyorum.PDO_OCI - bir clob alanına

PDO kullanmaya başladığımdan ve CLOB'a alanları belirlemeden önce Oracle'ı PHP ile kullanmamdan beri. Benim kod

Shortversion (sınıf Db \ PDO genişletir):

<?php 

[..snip ..]

 $dbh = new Db("oci:dbname=" . DB_TNS, DB_USER, DB_PASS); 
     $Query = ' INSERT INTO "SENTINEL"."SYSTEM_ERRORS" 
       (BACKTRACE) 
       VALUES 
       (:backtrace) 
     '; 
     $stmt = $dbh->db_prepare($Query); 
     $stmt->bindParam(':backtrace', $backtrace, \PDO::PARAM_LOB); 
     $backtrace = $someobject->get_backtrace(); 
     $stmt->execute(); 
     print_r($stmt->errorInfo()); 
     $stmt->closeCursor(); 

alıyorum:

Array ([0 ] => HY000 [1] => 932 [2] => OCIStmtExecute: ORA-00932: Inkonsistente Datentypen: CLOB erwartet, BLOB erhalten (ext \ pdo_oci \ oci_statement.c: 148))

Bunu PDO ile nasıl çözeceğimi bilen var mı, o yüzden oci sürücüsünü kullanmak zorunda değilim?

cevap

2

Bir çözüm burada bulduk:

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

gmail nokta com de [2009-08-11 11:27 UTC] lehresman yazdı:

bir iş arkadaşınız çözüm keşfettim. PDO kullanarak Oracle'da CLOB'lerle çalışırken, bunu bir LOB olarak ele almaz. Bunu bir PDO :: PARAM_STR olarak bağlamanız ve dizgenin uzunluğunu vermeniz gerekir (bu 4. parametre anahtardır, aksi halde hata mesajıyla başarısız olur). İşte

başarıyla Oracle bir CLOB eklemek için nasıl bir örnek: Benim için

<?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(); 
} 

İşleri mükemmel para ...

İlgili konular