[PHP-users 7495] Re: Oracle のストアドプロシージャの配列を取得したい
SHIMOOKA Hideyuki
php-users@php.gr.jp
Thu, 16 May 2002 12:58:20 +0900
下岡です。
---- Daisuke Tayamaさん曰く...
>PHP3+Oracle8.1.7でデータの集計プログラムを作成しているのですが、
>集計対象のデータが多量なため、DBサーバからWebサーバへのデータ転送に
>時間がかかり、レスポンスが非常に遅くなってしまいます。
要件にもよると思いますが、予めストアドプロシージャで結果を
別テーブルに保存しておき、PHPではそれをSELECTするだけ、と
いうのはダメでしょうか?
>どなたかPL/SQLの配列の取得方法をご存知でしたらご教示願います。
PHP3ではどうか分かりませんが、PHP4であれば以下のようなコードで
VARRAY型を取得することができるようです。
#マニュアルに説明はありませんが。。。
とりあえず、PHP4.2.1+Oracle8.1.6i/8.1.7iでは動作しています。
----ここから
●PHPスクリプト
<?php
$nm = "";
$conn = OCILogon("scott","tiger", "orcl");
$coll = OCINewCollection($conn, 'SCALE_TEST_ARR');
$stmt = OCIParse($conn, "begin :ret := getUsers(:nm); end; ");
OCIBindByName($stmt, ':RET', &$coll, -1, OCI_B_SQLT_NTY);
OCIBindByName($stmt, ':NM', &$nm, -1);
OCIExecute($stmt);
for ($i = 0; $i < $coll->size(); $i++) {
printf("%d => %s<br />", $i, $coll->getElem($i));
}
OCIFreeCollection($coll);
OCIFreeStatement($stmt);
OCILogOff($conn);
?>
●TYPEの定義
CREATE OR REPLACE TYPE scale_test_arr AS VARRAY(100) OF emp%TYPE;
/
SHOW ERRORS
●ストアドの定義
CREATE OR REPLACE FUNCTION getUsers(
nm IN VARCHAR2 := ''
) RETURN scale_test_arr
IS
CURSOR c1 IS
SELECT ename FROM emp
WHERE ename LIKE nm||'%';
cnt INTEGER := 0;
ret scale_test_arr := scale_test_arr();
BEGIN
FOR csr IN c1 LOOP
cnt := cnt + 1;
ret.EXTEND(1);
ret(cnt) := csr.ename;
END LOOP;
RETURN ret;
EXCEPTION
WHEN OTHERS THEN
RETURN scale_test_arr();
END;
/
SHOW ERRORS
----ここまで
--
H.Shimooka/shimooka@axissoft.co.jp