It looks like cloning PDOStatement object does not make any sense because while clone($sth) will not generate any errors, the returned object is not a new object but a reference to original PDOStatement object $sth.
PDOStatement クラス
(バージョン情報なし。おそらく SVN 版にしか存在しないでしょう)
導入
プリペアドステートメントを表します。ステートメント実行後は関連する結果セットを表します。
クラス概要
PDOStatement
implements
Traversable
{
/* プロパティ */
/* メソッド */
bool bindColumn
( mixed
$column
, mixed &$param
[, int $type
[, int $maxlen
[, mixed $driverdata
]]] )
bool bindParam
( mixed
$parameter
, mixed &$variable
[, int $data_type = PDO::PARAM_STR
[, int $length
[, mixed $driver_options
]]] )
mixed fetch
([ int
}$fetch_style
[, int $cursor_orientation = PDO::FETCH_ORI_NEXT
[, int $cursor_offset = 0
]]] )プロパティ
- queryString
-
使ったクエリ文字列。
目次
- PDOStatement::bindColumn — カラムを PHP 変数にバインドする
- PDOStatement::bindParam — 指定された変数名にパラメータをバインドする
- PDOStatement::bindValue — 値をパラメータにバインドする
- PDOStatement::closeCursor — カーソルを閉じてステートメントを再実行できるようにする
- PDOStatement::columnCount — 結果セット中のカラム数を返す
- PDOStatement::debugDumpParams — SQL プリペアドコマンドを出力する
- PDOStatement::errorCode — 文ハンドラにおける直近の操作に関連する SQLSTATE を取得する
- PDOStatement::errorInfo — 文ハンドラにおける直近の操作に関連する拡張エラー情報を取得する
- PDOStatement::execute — プリペアドステートメントを実行する
- PDOStatement::fetch — 結果セットから次の行を取得する
- PDOStatement::fetchAll — 全ての結果行を含む配列を返す
- PDOStatement::fetchColumn — 結果セットの次行から単一カラムを返す
- PDOStatement::fetchObject — 次の行を取得し、それをオブジェクトとして返す
- PDOStatement::getAttribute — 文の属性を取得する
- PDOStatement::getColumnMeta — 結果セットのカラムに対するメタデータを返す
- PDOStatement::nextRowset — 複数の行セットを返す文ハンドラで次の行セットに移動する
- PDOStatement::rowCount — 直近の SQL ステートメントによって作用した行数を返す
- PDOStatement::setAttribute — 文の属性を設定する
- PDOStatement::setFetchMode — この文に対するデフォルトのフェッチモードを設定する
Dmitri Snytkine
25-Jul-2011 06:17
rosko at zeta dot org dot au
02-Dec-2009 05:50
There are many references around for returning a refcursor from a pgSQL function using pg_query. All essentially boil down to executing the following single statement (or some variation of it):
begin; select yourFunction(params...); fetch all in cursorname; commit;
In PDO, this doesn't work because PDO won't allow multiple statements submitted as a single statement (due to SQL injection detection). Instead, try this or similar:
<?php
$sql = 'select yourFunction(params...)';
$db = new PDO('pgsql:dbname=yourDBname');
$db->beginTransaction();
$cmd = $db->prepare($sql);
if ($cmd->execute()) {
if ($query = $db->query('fetch all in cursorname')) {
...processing...
$query->closeCursor();
$cmd->closeCursor();
}
}
$db->commit();
?>
