PDO_OCI - 进入clob字段

时间:2016-03-24 12:44:32

标签: php oracle pdo

我想在Oracle DB中插入一些base64编码数据(每个字段最多500.000个字符)。

因为在我开始使用PDO并将字段设置为CLOB之前,我没有使用Oracle和PHP。

我的代码短路( Db类扩展\ PDO ):

<?php

[..剪断..]

        $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();

我明白了:

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

任何人都知道如何使用PDO解决这个问题,所以我不必使用oci驱动程序?

1 个答案:

答案 0 :(得分:3)

我在这里找到了解决方案:

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

[2009-08-11 11:27 UTC] lehresman at gmail dot com 写道:

一位同事发现了解决方案。使用PDO处理Oracle中的CLOB时, 不要把它当作LOB。你需要将它绑定为PDO :: PARAM_STR,然后给它 字符串的长度(第4个参数是键,它失败并显示错误消息 关于LONG类型否则)。

以下是如何成功插入Oracle中的CLOB的示例:

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

对我来说效果很好......