PHP中用PDO替代OCI_Connect读取Oracle数据库LOB数据的方法
PDO读取Oracle LOB数据的替代方案
之前用OCI扩展时可以通过->load()读取LOB,但切换到PDO后无法使用该方法,针对字段数量和名称不固定的场景,有以下几种等效解决方式:
1. 直接强制转为字符串
PDO查询返回的LOB是PDOLOB对象,它支持直接转换为字符串,不需要提前绑定变量,适配任意字段:
$sql = "select field from table"; $stmt = $this->PDO->query($sql); $res = $stmt->fetch(PDO::FETCH_ASSOC); // 直接强制转换即可获取LOB内容 echo (string)$res['FIELD'];
2. 流方式读取(适合大LOB数据)
如果LOB数据体积较大,可利用PDOLOB的流特性,用fread读取:
$sql = "select field from table"; $stmt = $this->PDO->query($sql); $res = $stmt->fetch(PDO::FETCH_ASSOC); $lob = $res['FIELD']; // 读取全部LOB内容 $content = fread($lob, $lob->getSize()); echo $content;
3. 全局配置自动字符串化
可以在PDO连接时开启ATTR_STRINGIFY_FETCHES属性,让PDO自动把LOB转换为字符串返回,注意这个设置会让所有字段(包括数字)都转为字符串,需根据业务场景选择:
$paramArray = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_STRINGIFY_FETCHES => true // 开启自动字符串化 ); $this->PDO = new PDO("oci:dbname=" . $dbTns . ";charset=utf8", $db_username, $db_password, $paramArray ); // 后续查询直接读取字段值即可 $sql = "select field from table"; $stmt = $this->PDO->query($sql); $res = $stmt->fetch(PDO::FETCH_ASSOC); echo $res['FIELD'];
内容的提问来源于stack exchange,提问作者Andre Duarte
相关产品推荐
相关产品推荐

