我这里有一个新数据库,它是从 Oracle 10g 到 Oracle 11g 的升级版本 - 主要问题是 LOB 列,每次任何函数返回 LOB 结果时,新数据库都不会返回像旧的做了:
旧数据库:
["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 函数方面,获取函数的默认操作是 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/