PHPでのOracle利用(4)

前回、呼び出したジオメトリ情報が

Array ( 
[ID] => 1 
[SDO_UTIL.TO_WKTGEOMETRY(GEOM)] => OCI-Lob Object 
( [descriptor] => Resource id #5 ) 
)

という風になっていて、肝心のWKTを習得出来ずに困惑した
今回は、これの解決

問題のジオメトリ情報が格納されている連想配列の要素出力する。Resource idとか入っていて訳がわからなかったが

OCI-Lob Object

と書かれているのに注目
どうやら型が違うらしい

WKTは例えばマルチポリゴンやマルチラインだと、恐ろしいほど簡単に長くなってしまう
よって、Oracleさんでは初めからWKTをラージオブジェクトで習得してほしいらしい
小さな親切大きなお世話な話。PHPは型を意識する事が少ない言語だけに、すっかり気が付かなかったorz
Javaだとまずタイプミスと型違いを怪しむのだが…

ラージオブジェクトは通常の変数と扱いが少々異なる
とりあえず、内容を出力しようとこんな構文を組んでみた

$reqarray->load();

…いや、これで正しいのかは知らないがな!
具体的な構文例が見当たらなかったので、こねくり回して覚えようという算段。とりあえず実行してどういうエラーが出るのか見てみる事にする

Fatal error: Call to a member function load() on a non-object

む。余計なデータがあるのか?
そもそもの情報習得が連想配列形式をしていしていたのが問題か。要素を明記して指定する構文に変更する

$reqarray=@oci_fetch_assoc($stid);
$reqarray2=$reqarray['SDO_UTIL.TO_WKTGEOMETRY(GEOM)']->load();
echo"$reqarray2<br>";

実行結果はこんな感じ

POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))
POLYGON ((5.0 1.0))

Fatal error: Call to a member function load() on a non-object in <ファイルパス> on line 48

おお、上手くいっている
PostGISMySQLWKTと違って二十括弧なのが気になるが、いい感じ
でも、最後に相変わらずエラーが。処理は回っているのだが、何が原因なのだろうか
リファレンスではload()はエイリアスとか特に明記してなかったんだが…
とりあえず読み込むデータ数を指定する関数に変更してみる。こちらは推奨とか何とかかかれてたから、よもやエイリアスされた関数という事態は無いだろう

$reqarray=@oci_fetch_assoc($stid);
$reqarray2=$reqarray['SDO_UTIL.TO_WKTGEOMETRY(GEOM)']->read(10);
echo"$reqarray2<br>";

てきとーに10bを指定。出力結果は以下の通り

POLYGON ((
POLYGON ((
POLYGON ((
POLYGON ((
POLYGON ((
POLYGON ((
POLYGON ((
POLYGON ((

Fatal error: Call to a member function read() on a non-object in <ファイルパス> on line 48

loadの時と比べて出力する内容(POLYGON ((…という所)が減っているのは10bなんて読み込む情報量を制限したから
…むぅ、しかしてエラーは消えない。全く同じ様な内容を図れている
ここまでくるとinfoを見た方が早いんで、infoを出力して定義されているかどうか確認
oci8:1.1-1.2.4で実装されているそうだから、oci8のバージョンがその範囲内か見る

1.2.3

むう。ちょうど中間で、oci8に含まれている筈だが…