Определить количество записей в курсоре

Здраствуйте.
Как определить конец курсора?
Аналог @@FETCH_STATUS
Нужно считать в курсор сложный запрос и пройтись по нему.
Спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

цикл по курсору?

Насколько я понял, Вам нужно не количество записей в курсоре, а цикл по нему:
FOR recordvar IN bound_cursor LOOP
statements
END LOOP;
Подробнее: http://postgresql.ru.net/manual/plpgsql-cursors.html#PLPGSQL-CURSOR-FOR-...
Это из мануала:
http://postgresql.ru.net/manual/plpgsql-cursors.html

Спасибо. То что

Спасибо.
То что надо.

Оказалось,что

Оказалось,что не очень подходит для версии 7.3.
Нужен именно цикл по курсору.
Есть советы?
Спасибо.

лучше один раз

лучше один раз спросить нормально, чем сто раз повторять одно и то же.
В чем проблема так и не понятно.

Что здесь не так?

38.7.3.1. FETCH
FETCH [ direction { FROM | IN } ] cursor INTO target;
FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.

Подробно вопрос.

declare
cursor_1 refcursor;
var INTEGER;

open cursor_1 for select id_x from table1 INNER JOIN table2 ON table1.x = table2.x
FETCH cursor_1 INTO var;
move cursor_1 ;
insert into table3(id) values (var);

? А теперь, Я хочу взять слудующую запись.
Нужен цикл. И условие выхода из него.

и что здесь

и что здесь такого страшного?

без всяких там курсоров (рекомендуется)

declare
  var int;
begin
FOR var IN SELECT id_x FROM table1 INNER JOIN table2 ON table1.x = table2.x
loop
  INSERT INTO table3(id) VALUES (var);
end loop;
end;

со всякими там курсорами (FOUND)

declare
  r refcursor;
  var int;
begin
open r FOR SELECT id_x FROM table1 INNER JOIN table2 ON table1.x = table2.x;
loop
  fetch r INTO var;
  IF NOT FOUND then exit; end IF;
  INSERT INTO table3(id) VALUES (var);
end loop;
end;

со всякими там курсорами 2 (без FOUND)

declare
  r refcursor;
  var record;
begin
open r FOR SELECT id_x FROM table1 INNER JOIN table2 ON table1.x = table2.x;
loop
  fetch r INTO var;
  IF var IS NULL then exit; end IF;
  INSERT INTO table3(id) VALUES (var.id_x);
end loop;
end;

количество записей - раз уж вы настаиваете (FOUND)

declare
  r refcursor;
  r_count int DEFAULT 0;
begin
open r FOR SELECT id_x FROM table1 INNER JOIN table2 ON table1.x = table2.x;
loop
  move r;
  IF FOUND then 
    r_count:=r_count+1; 
  else
    exit;
  end IF;
end loop;
end;

этот вариант, судя по всему, только в последней версии появился

declare
  r cursor FOR SELECT id_x FROM table1 INNER JOIN table2 ON table1.x = table2.x;
  var record;
begin
FOR var IN r LOOP
  INSERT INTO table3(id) VALUES (var.id_x);
END LOOP;
end;

Спасибо

Спасибо большое за подробный ответ.
Переводим процедуры из MSSQL, хотелось сохранить максимально сходство .

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023