0

この簡単な説明は、次の方法を示しています。

  1. Oracle データベースを PHP Zend DB に接続するには
  2. Zend DB でストアド プロシージャ/ストアド関数を呼び出す
  3. 実数配列または整数のコレクションを入力パラメータとしてストアド プロシージャ/関数に渡す (コンマ区切り値の文字列は渡しません)
  4. ストアド関数の結果を取得する

(注: Oracle 11.x、PHP 5.x、および Zend Framework 1.x を使用しました)

さあ行こう。

Oracle リスト タイプを作成します。

CREATE OR REPLACE TYPE NUMBER_LIST_TYPE IS TABLE OF NUMBER;

ストアド関数を作成します:

CREATE FUNCTION MY_STORED_FUNCTION(id_list in NUMBER_LIST_TYPE) RETURN NUMBER AS 
    lv_list_size number;
BEGIN
    select count(*) into lv_list_size from table(id_list);
    RETURN lv_list_size; 
END MY_STORED_FUNCTION;

PHP ファイルを作成します。

<?php
require_once 'Zend/Db.php';
require_once 'DataSource.php';

$db_config['host'] = 'khazgoroth'; 
$db_config['port'] = 1521; 
$db_config['username'] = 'thrall'; 
$db_config['password'] = 'chuchu'; 
$db_config['dbname'] = 'orgrimmar'; // see TNSNAMES.ORA

$db = Zend_Db::factory('Oracle', $db_config);

$conn = $db->getConnection();  

$sql = 'BEGIN :r := MY_STORED_FUNCTION(:pmids); END;';

// Create an OCI-Collection object of NUMBER_LIST_TYPE
$ids = oci_new_collection($conn, 'NUMBER_LIST_TYPE');

$id_array = array(1, 12, 67);

// Append all IDs to the collection;
foreach ($id_array as $id) {
    $ids->append($id);
}

// create a statement and bind the parameters 
$stmt = new Zend_Db_Statement_Oracle($db, $sql);
$stmt->bindParam(':pmids', $ids, SQLT_NTY);
$stmt->bindParam(':r', $result, SQLT_INT); // this is the result of the Stored Function

$stmt->execute();

print "Result: $result";
?>

これが誰かを助けることを願っています。

4

1 に答える 1

0

残念ながら Zend_Db ではそれができませんが、bindArray メソッドを使用して Zend_Db の実装を強化することはできます。

プレーンな PHP では、 http://php.net/manual/en/function.oci-bind-array-by-name.phpを使用できます。これは非常にうまく機能します。php 配列を pl/sql プロシージャに直接バインドするだけです。

于 2012-11-02T21:07:02.137 に答える