2011-04-05 45 views
2

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

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

<?php 

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

?> 

但只要字符串大于4000个字节:

SQL error: [Microsoft][ODBC driver for Oracle]Error en el parámetro 2: Datos truncados, SQL state 01004 in SQLExecute

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

是否可以使用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: literal does not match format string

回答

3

你必须使用用于Oracle的Microsoft ODBC驱动程序?那驱动程序does not support the CLOB data type之间的各种其他问题。如果使用Oracle ODBC驱动程序,驱动程序将支持CLOB。

+0

非常感谢您的建议,修复了INSERT问题。现在我需要SELECT部分​​的建议'<:-)' – 2011-04-05 09:53:34

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. 读取所有数据如果< 6000个字符,或
  2. 反复,读取和附加数据块直到没有更多返回。
+0

非常感谢! 'odbc_binmode()'在获取行时防止出错,'odbc_result($ res,FOO_CLOB)'允许读取剩余的块。我希望我能标出两个接受的答案。 – 2011-04-18 09:23:50