php - Oracle 11g DB 返回流而不是字符串

标签 php sql database oracle oracle11g

我这里有一个新数据库,它是从 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/

相关文章:

PHP 手动 GZip 编码

c# - 无法将方法组 'Read' 转换为非委托(delegate)类型 'bool'

database - 交错表术语

php - 我可以使用什么 Sql Join 来组合我的三个表

php - 添加条件并连接到 laravel 中的连接表

php - PHP Elasticsearch与查询参数

MySQL MATCH 多个字段

sql - SQL Server 中 NOT Exists 和 LEFT JOIN 之间的性能差异

php - 如何在Mysql中将Top Value字段显示为top

sql-server - 将数据库数据从多个 DB 复制到一个。数据复制(某种)