久々に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への接続例はここにまとめています。
さて、上記のようなコードで普通にデータ取得しようとすると、下記のようなエラーが返ってきます。
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);//値を取得
久々にコードをさわってたらこんな単純なことの解決でも楽しいものですね。
- 作者: 小川雄大,柄沢聡太郎,橋口誠
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: 山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2013/06/20
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: 鈴木健吾,玉置雄大,塩原浩太,小林修,大森慎司,内村友亮
- 出版社/メーカー: 技術評論社
- 発売日: 2015/05/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る