繁体   English   中英

Oracle 11g数据库返回Streams而不是字符串

[英]Oracle 11g DB returning Streams instead of Strings

我这里有一个新的数据库,它是从Oracle 10g升级到Oracle 11g的升级版本 - 主要问题是LOB列,每次任何函数返回LOB结果时,新数据库都不会像旧的那样返回字符串:

老DB:

["C"]=>
string(23) "3874163,3874197,3874201"

新数据库:

["C"]=>
resource(182) of type (stream)

现在,在读取流时,有一个错误是引用了不存在的流资源,一切都失败了。 我猜测在没有流读取的情况下关闭连接因此访问丢失了。

更改语句以包含针对varchar的转换时,例如:

CONVERT(VARCHAR, C, 120)

或者像这样:

SELECT TO_CHAR(FUNC())

该值再次作为字符串返回,但这不是一个最佳解决方案,因为每个语句都需要更改。

是否有任何方法/选项来阻止LOB作为流传递,因此它们像Oracle 10g中的字符串一样交付?

编辑:
我们使用oci函数集进行数据库访问。

这不是一个真正的答案,但我希望帮助的一些项目。

看起来LOB在10g和11g之间返回的方式存在细微差别,11g下有一些关于当LOB超过某个值时从btyes转换为byteStreams的注释,在JDBC参考手册中(我理解)这不会影响OCI调用,因为它们使用不同的驱动程序集)。

根据我在php中的OCI8函数所看到的,fetch函数的默认操作是LOB作为引用返回,需要使用->read() ->load()等函数进行访问(参见http://au.php.net/oci_fetch_array - 关于模式和默认值)。

现在我不知道您是否正在使用OCI函数来访问您的oracle系统,因为它没有在您的问题中指定。

如果你能重新编译php或者用更新的客户端版本更新oracle驱动程序,那么其他有助于解决这个问题的其他项目就是如果你能告诉我们的。

我知道它不是一个完整的解决方案但是如果你使用oci_fetch_*来返回行,那么在OCI_RETURN_LOBS的调用中添加第二个参数,这将导致fetch返回LOB字段的字符串而不是对流的引用,或使用$variable["C"]->load()来访问此LOB,这将导致它加载完整的流并像普通字符串一样运行。

希望这可以帮助。

如果您使用的是PDO,则可能需要将PDO :: PARAM_LOB更改为PDO :: PARAM_STR。 例如,与bind列结合使用:

$statement->bindColumn(1, $as_string, PDO::PARAM_STR, 256);
$statement->bindColumn(1, $as_lob, PDO::PARAM_LOB);

使用LOB时,必须使用OCI :: readOCI :: load来获取其内容。

[...]
$row = oci_fetch_assoc($result);

$lobContents = $row['LOB_COLUMN']->load(); //fetches the whole LOB
//or
while ($buffer = $row['LOB_COLUMN']->read(4096)) { //sequential read
   $lobContents .= $buffer;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM