使用PHP-ODBC处理CLOB列

时间:2011-04-05 08:31:55

标签: php oracle odbc

我维护一个在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 enelparámetro2:Datos   truncados,SQL状态01004 in   SQLExecute

...大致意思是“截断数据”。我在阅读时遇到类似的问题:它工作正常,直到我收到超过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:文字不匹配   格式字符串

2 个答案:

答案 0 :(得分:3)

您是否必须使用Microsoft ODBC Driver for Oracle?其他问题中的那个驱动程序does not support the CLOB data type。如果您使用Oracle ODBC驱动程序,则驱动程序将支持CLOB。

答案 1 :(得分:1)

为了阅读你,基本上,你必须通过数据进行分析。

像 -

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. 如果&lt; 6000 chars或
  2. ,则读取所有数据
  3. 反复地,读取并附加数据块,直到不再返回。