Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

ストアドファンクションから配列を返す

Do You PHP?でやったネタですが、何かふとしたことからdbms_sqlパッケージのXXXX_tableを使って簡単にできそうな気がして、実際に試してみたのでメモ。
毎度の事ながら、環境は次の通り。

  • PHP5.2.0
  • Oracle 10g XE 10.2.0.1.0

で、PL/SQLソースとPHPスクリプトはこんな感じ。

<?php
/**
 * ストアドは別途SQL*Plusとかから作成する
 *
 * CREATE OR REPLACE FUNCTION getUsers(
 *     nm IN VARCHAR2 := ''
 * ) RETURN dbms_sql.varchar2_table
 * IS
 *     ret dbms_sql.varchar2_table;
 * BEGIN
 *     SELECT ename
 *     BULK COLLECT INTO ret
 *     FROM emp
 *     WHERE ename LIKE nm||'%';
 * 
 *     RETURN ret;
 * END;
 * /
 * SHOW ERRORS
 */
$nm = '';

$db = oci_connect("scott", "tiger", "//localhost/XE");
$stmt = oci_parse($db, "BEGIN :ret := getUsers(:nm); END; ");
oci_bind_array_by_name($stmt, ":ret", $ret, 100, 20, SQLT_CHR);
oci_bind_by_name($stmt, ':nm', $nm, -1);
oci_execute($stmt);

var_dump($ret);

何だろ。。。楽すぎ。。。:-D