[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