Получить cursor и выбрать из него данные

Игорь

Новичок
Получить cursor и выбрать из него данные

Здравствуйте.

Мигрировал на PostgreSQL с Oracle, при использовании которого сложностей с курсорами не испытывал. Спокойно получал курсор, fetch`ил его на стороне вебсервера, и парсил страничку.

С PostgreSQL такого не получается. Вроде бы не проблема получить курсор:

Код:
CREATE OR REPLACE FUNCTION "gps"."tst_func" () RETURNS "pg_catalog"."refcursor" AS
$body$
declare
  cur1 cursor for select * from gps.providers;
begin
  open cur1;
  return cur1;
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
Но вот что с ним делать дальше?
Вроде как в мануале по PHP об этом тишина. На ум приходит ещё возможность получить набор данных средствами СУБД, но вот как получить данные вне блока pl/pgsql?

-~{}~ 28.05.07 18:03:

Делать дальше с ним следующее:

Код:
<?php

include_once("../my_vars.php");

$res = pg_query("begin; select * from gps.tst_func('2007-05-28'::date, 14); fetch all from cur1;");

while ($row = pg_fetch_array($res)) {

	echo $row[0];
	echo "<br>";

}
pg_free_result($res);
pg_query("commit;");
pg_close($dbconn);

?>
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Ответа на Ваш вопрос я, к сожалению, не знаю, но всегда интересовался целями использования курсоров. Расскажите - зачем они Вам, почему не обычный SQL?
 

neko

tеam neko
затем что курсоры позволяют данные получать частями
при "обычном sql" libpq буферизует весь результат на клиенте,
прежде чем его начать отдавать приложению.

-~{}~ 28.05.07 23:43:

при этом можно держать несколько откртых курсоров
и по мере необходиости из них что-то тянуть.
 

Игорь

Новичок
grigori
Ответ на свой вопрос я уже добыл :) Вторая секция кода. Кроме того, что сказал neko, можно добавить:

без курсоров просто не обойтись, когда требуется произвести хитроумные расчёты, которые проблематично реализовать в запросе. Например, Вы подсчитываете что-либо, по хитроумному алгоритму, ветвящемуся, скажем, в зависимости от пяти полей. И при определённых обстоятельствах заносите значение в иную таблицу. Хотя можно написать и функцию, и вставить её в запрос.

Ну или проще: если в клиенте хочется организовать цикл, с перебором данных от начала к концу -- курсор отличное решение. А если нужно что-то посчитать и вернуть просчитанное, то курсор вообще к месту, т.к. алгоритм может быть выполнен на стороне сервера РСУБД, и мы получим не массив данных для обработки, а готовый результат.

В моём же случае я упрощаю себе жизнь тем, что получаю курсор как в свои клиенты под win32, так и в скрипты на PHP. Представьте, что что-то требуется изменить. Вам придётся переписывать запрос в клиенте и PHP скрипт. Мне же нужно будет поправить только хранимую процедуру на стороне сервера. В случае, если количество и типы столбцов не меняются, в клиентских приложениях мне не нужно править ни байта.
 
Сверху