TechNote

とあるエンジニアのただのメモ

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

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

f:id:kojikoji75:20150702182837j:plain

1.CLOB型とは
2.PHPからCLOB型をふつうに取り出そうとすると...
3.PHPからCLOB型を取り出す2つの方法


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への接続例はここにまとめています。kojikoji75.hatenablog.com



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

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からODBC経由でoracleデータベースへ接続するための記述 - TechNotePHPからODBC経由でoracleデータベースへ接続するための記述 - TechNote

単純な接続方法だが、意外にハマったのでメモを残す。1.COMを使った接続方法(ADODB)2.odbc_connectを使った接続方法1.COMを使った方法(A...

PHPからAccessデータベースの使用 - TechNotePHPからAccessデータベースの使用 - TechNote

PHPからAccessのデータベース(mdb)を利用するにはODBC経由での接続が必要。ODBCの設定手順1.「コントロールパネル」→「管理ツール」→「データソ...

プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNoteプログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNote

基本情報技術者試験応用情報技術者試験の時期も近まった今、あらためて整列アルゴリズムをまとめてみたので、忘備録を兼ねてメモを残します。即席コードも併せて記載しま...



パーフェクトPHP

パーフェクトPHP

独習PHP 第2版

独習PHP 第2版

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

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