我维护一个在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:文字不匹配 格式字符串
答案 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);
}
- 基本上是 -