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();
?>
Класс PDOStatement
(PHP 5 >= 5.1.0, PECL pdo >= 1.0.0)
Введение
Представляет подготовленный запрос к базе данных, а после выполнения запроса соответствующий результирующий набор.
Обзор классов
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
- PDOStatement::errorInfo — Получение расширенной информации об ошибке, произошедшей в результате работы объекта PDOStatement
- PDOStatement::execute — Запускает подготовленный запрос на выполнение
- PDOStatement::fetch — Извлечение следующей строки из результирующего набора
- PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора
- PDOStatement::fetchColumn — Возвращает данные одного столбца следующей строки результирующего набора
- PDOStatement::fetchObject — Извлекает следующую строку и возвращает ее в виде объекта
- PDOStatement::getAttribute — Получение значения атрибута запроса PDOStatement
- PDOStatement::getColumnMeta — Возвращает метаданные столбца в результирующей таблице
- PDOStatement::nextRowset — Переход к следующему набору строк в результате запроса
- PDOStatement::rowCount — Возвращает количество строк, модифицированных последним SQL запросом
- PDOStatement::setAttribute — Присваивает атрибут объекту PDOStatement
- PDOStatement::setFetchMode — Задает режим выборки по умолчанию для объекта запроса
rosko at zeta dot org dot au ¶
3 years ago
Dmitri Snytkine ¶
1 year ago
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.
