OracleのCLOB型カラムのデータをPHPで取得する2つの方法
久々にPHPを触ってて、既存システムのOracleデータをPHPから参照する際、あまり自分では扱ったことのない「CLOB型」を取り出す際につまずいたのでメモとして残します。
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: OCILob::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データベースへ接続するための記述 - TechNote単純な接続方法だが、意外にハマったのでメモを残す。1.COMを使った接続方法(ADODB)2.odbc_connectを使った接続方法1.COMを使った方法(A...
プログラムで簡単理解! 7つの超重要な整列アルゴリズム(ソートアルゴリズム)まとめ - TechNote基本情報技術者試験や応用情報技術者試験の時期も近まった今、あらためて整列アルゴリズムをまとめてみたので、忘備録を兼ねてメモを残します。即席コードも併せて記載しま...