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

bar*_*iir 6 php sql database oracle oracle11g

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

老DB:

["C"]=>
string(23) "3874163,3874197,3874201"
Run Code Online (Sandbox Code Playgroud)

新数据库:

["C"]=>
resource(182) of type (stream)
Run Code Online (Sandbox Code Playgroud)

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

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

CONVERT(VARCHAR, C, 120)
Run Code Online (Sandbox Code Playgroud)

或者像这样:

SELECT TO_CHAR(FUNC())
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pay*_*oad 1

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

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

从我所看到的 php 中的 OCI8 函数来看,获取函数的默认操作是 LOB 作为引用返回,并且需要使用 etc->read() ->load()函数进行访问(请参阅http://au.php.net/ oci_fetch_array - 关于模式和默认值)。

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

其他一些有助于解决这个问题的项目是,如果您可以让我们知道您是否重新编译了 php 或使用较新的客户端版本更新了 oracle 驱动程序。

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

希望这可以帮助。