【问题标题】:Handle CLOB columns with PHP-ODBC使用 PHP-ODBC 处理 CLOB 列
【发布时间】:2011-07-29 18:48:27
【问题描述】:

我维护一个遗留应用程序,它在 Windows Server 2003 下的 PHP/5.2.6 上运行,并通过 ODBC 连接到远程 Oracle 10g 服务器。我正在编写一个需要 CLOB 列的新功能,因此它可以存储任意大的文本,但我找不到通过良好的旧 ODBC 函数来操作它的方法。

对于写作,我尝试过这种方法:

<?php

$sql = 'INSERT INTO FOO (FOO_ID, FOO_CLOB) VALUES (?, ?)';
$stmt = odbc_prepare($conn, $sql);
$res = odbc_execute($stmt, array(1, 'Very large string'));

?>

但只要字符串大于 4,000 字节:

SQL 错误:[Microsoft][ODBC 驱动程序 Oracle]Error en el parametro 2: Datos 截断,SQL 状态 01004 在 SQL执行

...大致意思是“截断数据”。我在阅读时遇到了类似的问题:它工作正常,直到我收到超过 4,000 个字节。

是否可以使用 PHP ODBC 函数来操作超过 4,000 字节的 CLOB 列?

(我的替代方法是将内容存储在文件中,仅将文件路径保存在数据库中,但如果可能的话,我想避免这种情况。)


更新:Justin Cave's advice 之后,我放弃了 Microsoft 的 ODBC 驱动程序,转而使用 Oracle 的驱动程序,并且我的代码无需更改即可插入大字符串。我现在的问题是如何阅读 CLOB 专栏。按原样阅读:

$sql = 'SELECT FOO_ID, FOO_CLOB FROM FOO';
$res = odbc_exec($conn, $sql);
while($row = odbc_fetch_array($res)){
    // ...
}

...在运行odbc_fetch_array()时触发:

ORA-01861: 文字不匹配 格式化字符串

【问题讨论】:

    标签: php oracle odbc


    【解决方案1】:

    您必须使用 Microsoft ODBC Driver for Oracle 吗?该驱动程序does not support the CLOB data type 以及其他各种问题。如果您改用 Oracle ODBC 驱动程序,该驱动程序将支持 CLOB。

    【讨论】:

    • 非常感谢您的建议,它解决了 INSERT 问题。现在我需要关于 SELECT 部分的建议 &lt;:-)
    【解决方案2】:

    为了阅读你,基本上,必须通过数据来分块。

    类似--

    define ("MAX_LONGREAD_LENGTH", 4000);
    
    $res = odbc_exec($con, $sql);
    
    odbc_binmode($res, ODBC_BINMODE_RETURN);
    
    $oflen = odbc_field_len($res, 1);
    
    if ( $oflen >= MAX_LONGREAD_LENGTH)
    {
      $out = '';
    
      do
      {
        $temp = odbc_result($res, 1);
    
        if ($temp != null) $out .= $temp;
      }
    
      while ($temp != null);
    }
    
    else
    
    {
      $out = odbc_result($res, 1);
    }
    

    -- 基本上,要么-

    1. 读取所有数据,如果
    2. 反复读取和追加数据块,直到不再返回。

    【讨论】:

    • 非常感谢! odbc_binmode() 防止在获取行时出错,odbc_result($res, FOO_CLOB) 允许读取剩余的块。我希望我可以将两个答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2013-03-16
    • 2017-11-30
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多