我这里有一个新数据库,它是从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函数集进行数据库访问。
答案 0 :(得分:1)
这不是一个真正的答案,但我希望帮助的一些项目。
看起来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,这将导致它加载完整的流并像普通字符串一样运行。
希望这有帮助。
答案 1 :(得分:0)
如果您使用的是PDO,则可能需要从PDO :: PARAM_LOB更改为PDO :: PARAM_STR。例如,与bind column结合使用:
$statement->bindColumn(1, $as_string, PDO::PARAM_STR, 256);
$statement->bindColumn(1, $as_lob, PDO::PARAM_LOB);
答案 2 :(得分:0)