Курсор не скролируется!!! - В продолжение курсорной эпопеи

mwolf
Дата: 04.11.2004 17:43:30
Всё началось отсюда.
Теперь вопрос следущий. Попытка сделать что-то типа такого
MOVE FORWARD IN cur;
приводит к

ERROR: parser: parse error at or near "$1" at character 18

WARNING: Error occurred while executing PL/pgSQL function getcreative
WARNING: line 21 at SQL statement

То есть к ошибке на этой строке.
FETCH с подобными параметрами приводит к этой ж ошибке.
Попытка объявить курсор с параметром SCROLL приводит к

ERROR: parser: parse error at or near "CURSOR" at character 22

WARNING: plpgsql: ERROR during compile of getcreative near line 5

Версия Постгреса 7.3.2, пробовал на 7.4.5 с тем же эффектом.

Как это всё исправить?
MaximZ
Дата: 04.11.2004 18:09:39
блин, да что за дурацкая привычка. Можно полный листинг предоставить?
mwolf
Дата: 04.11.2004 18:23:53
MaximZ
блин, да что за дурацкая привычка. Можно полный листинг предоставить?

Кого? Ф-ции которая вызывается?
Лёгко, только кавычки я уберу чтоб синтаксис в ф-ции подсветило
CREATE OR REPLACE FUNCTION "public"."getcreative2" (bigint, bigint, varchar, bigint) RETURNS bigint AS

DECLARE
  RowCount int8;
  i int8;
  res creative.creative_id%TYPE;
  cur CURSOR FOR
    SELECT g.creative_id
    FROM getcreative( $1, $2, $3, $4) as g;
BEGIN
  OPEN cur;
  RowCount := 0;
  FETCH cur INTO res;
  WHILE FOUND LOOP
    RowCount := RowCount+1;
    FETCH cur INTO res;
  END LOOP;
  RowCount := round(RowCount*random());
  MOVE BACKWARD RowCount IN cur;
  FETCH cur INTO res;
  CLOSE cur;
  return res;
END;

LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

И ошибки к ней

ERROR: parser: parse error at or near "$1" at character 18
WARNING: Error occurred while executing PL/pgSQL function getcreative2
WARNING: line 21 at SQL statement
и

ERROR: parser: parse error at or near "CURSOR" at character 22
WARNING: plpgsql: ERROR during compile of getcreative2 near line 5
MaximZ
Дата: 04.11.2004 18:34:12
я точно не уверен, но что то у меня большие сомнения что курсор определяется в разделе DECLARE.
Кажется это делается уже внутри функции. Сейчас уточню.
MaximZ
Дата: 04.11.2004 18:43:09
MaximZ
я точно не уверен, но что то у меня большие сомнения что курсор определяется в разделе DECLARE.
Кажется это делается уже внутри функции. Сейчас уточню.


страно в документации на 7.4 написано что он определяется именно в разделе DECLARE.

а что такое getcreative() ?
ведь первое сообщение об ошибке в этой функции.
вчера немного смотрел%
Дата: 04.11.2004 18:46:15
plpgsql, как я заметил, поддерживает несколько другой синтаксис CURSOR - ов чем его же SQL-диалект. В частности в объявлении нельзя написать SCROLL, в теле - не получилось написать MOVE ALL|FORWARD ctest. ПОлучилось только MOVE ctest;
Написать Fetch FORWARD count кажется тоже не шибко получилось.
mwolf
Дата: 04.11.2004 18:57:05
вчера немного смотрел%
plpgsql, как я заметил, поддерживает несколько другой синтаксис CURSOR - ов чем его же SQL-диалект. В частности в объявлении нельзя написать SCROLL, в теле - не получилось написать MOVE ALL|FORWARD ctest. ПОлучилось только MOVE ctest;
Написать Fetch FORWARD count кажется тоже не шибко получилось.


Эээ.
MOVE ctest; ?
Это как?
В смысле, а имя курсора куда?
А можно ли полный вариант кода?

Просто у меня на этом тоже ошибка лезет.
mwolf
Дата: 04.11.2004 19:00:43
MaximZ
MaximZ
я точно не уверен, но что то у меня большие сомнения что курсор определяется в разделе DECLARE.
Кажется это делается уже внутри функции. Сейчас уточню.


страно в документации на 7.4 написано что он определяется именно в разделе DECLARE.

а что такое getcreative() ?
ведь первое сообщение об ошибке в этой функции.


CREATE OR REPLACE FUNCTION "public"."getcreative" (bigint, bigint, varchar, bigint) RETURNS SETOF bigint AS'
...
очень большой запрос
...
'LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Насчёт сообщений об ошибке, то с именами я напутал немного.
Правильный вариант в посте с ф-цией.
MaximZ
Дата: 04.11.2004 19:08:31
mwolf


CREATE OR REPLACE FUNCTION "public"."getcreative" (bigint, bigint, varchar, bigint) RETURNS SETOF bigint AS'
...
очень большой запрос
...
'LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Насчёт сообщений об ошибке, то с именами я напутал немного.
Правильный вариант в посте с ф-цией.


А попробуйте вызвать функцию в курсоре с абсолютными параметрами.
Если все заработает, то беда, видимо постгрес не понимает в разделе объявлений применение переменных. Или можно для верности сначала проальасить входные параметры, и уже ссылаться на альасы, хотя это врядли сработает.
вчера немного смотрел%
Дата: 04.11.2004 19:18:58
mwolf
MOVE ctest; ?

ctest - это и был мой курсор. И его удалось только MOVE имя без всеких ALL или тп. Хотя в транзакции SQL (а не в plpgsql) можно выполнить и MOVE ALL.