OracleのCLOB型カラムのデータをPHPで取得する2つの方法

PHP
スポンサーリンク

久々にPHPを触ってて、既存システムのOracleデータをPHPから参照する際、あまり自分では扱ったことのない「CLOB型」を取り出す際につまずいたのでメモとして残します。

1.CLOB型とは

OracleのCLOB型(Character Large Object)は数GBにおよぶのテキストデータを格納できる巨大テキスト格納用のデータ型です。

Oracleでのvachar型の最大サイズは4000バイトなので「4000バイトを超えるテキストデータはCLOB型のカラムに格納する」といった設計が考えられます。

これは通常のデータとは異なり、テーブル本体を保存するための領域ではなく、別で確保した専用領域に保管し、テーブル本体にはその参照(位置を表すデータ)を格納するという実装になってたりするようです。

2.PHPからCLOB型をふつうに取り出そうとすると…

oci_connect関数でoracleに接続し、LONGDATAというCLOB型カラムを取得しようとする例です。

//oci_connect 
$conn = oci_connect('username','password','connectstring'); 
if(!$conn){ 
  $e = oci_error(); 
  trigger_error(htmlentities($e['message'],ENT_QUOTES),E_USER_ERROR); 
} 
$sql = "select * from t_sample where examno=".$examno; 
$stid = oci_parse($conn,$sql); 
oci_execute($stid); 
while($row = oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)){ 
  $logndata = $row['LONGDATA'];//値を取得 
}

ちなみにPHPからOracleへの接続例はここにまとめています。

404 Not Found

さて、上記のようなコードで普通にデータ取得しようとすると、下記のようなエラーが返ってきます。

Object of class OCI-Lob could not be converted to string in xxx.php on line xx

何もデータ型を意識させるようなことは書いてませんが、きちんとOCI-LobというPHPクラスが動きLob型を読もうとして文字にコンバートしきれてない様子がわかります。書き方を少し変えるだけでうまく取れそうな感じがしてきますね。

3.PHPからCLOB型を取り出す2つの方法

ということで、PHPマニュアルを読むとヒントがありました。
PHP: OCI-Lob::read – Manual

これをヒントに下記のように少し書き方を変えるときちんとPHPからCLOB型を読み込んで表示させることができました!意外と簡単に解決に辿りつけました。

while($row = oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS)){ 
  $logndata = $row['LONGDATA']->load();//値を取得 
}

もしくは下記でもよいみたいです。

$logndata = $row['LONGDATA']->read(5000);//値を取得

久々にコードをさわってたらこんな単純なことの解決でも楽しいものですね。

パーフェクトPHP

パーフェクトPHP

独習PHP 第2版

独習PHP 第2版

Oracleの現場を効率化する100の技

Oracleの現場を効率化する100の技

  • 作者: 鈴木健吾,玉置雄大,塩原浩太,小林修,大森慎司,内村友亮
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/05/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
タイトルとURLをコピーしました