我在这里有一个新数据库,它是从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函数集进行数据库访问。
最佳答案
并不是真正的答案,但我希望能提供一些帮助。
看起来在10g和11g之间返回LOB的方式有一个小的差异,在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,这将导致它加载完整的流并像普通字符串一样工作。
希望这可以帮助。
关于php - Oracle 11g DB返回流而不是字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8794996/