powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в plpgsql сдвинуть курсор??
16 сообщений из 16, страница 1 из 1
Как в plpgsql сдвинуть курсор??
    #32884773
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция которая должна выбрать из базы данные и по определенному правилу сделать string и отдать его на выход функции

может и криво делать 3 курсора из одной и той же таблицы но суть не в этом.

Не работает строчка
MOVE 100 IN all_cat;
и я немогу понять почему?!!ъ
Если кто знает как в plpgsql двигать курсоры то просьба сообщить.

добавление forward и тп специальных слов не понимает

и почему-то курсор имеет значение NULL?!!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
CREATE OR REPLACE FUNCTION "up_data"."catalog_test" () RETURNS text AS
$body$
/* New function body */
DECLARE
       all_cat CURSOR FOR select distinct(c.item_category_code), c.group_by from up_data.catalog c;
       sub_cat_man refcursor; -- CURSOR FOR select c.item_category_code, c.manufacturer_code from up_data.catalog c ORDER BY c.item_category_code, c.manufacturer_code;
       sub_cat_prod CURSOR FOR select c.item_category_code, c.product_group_code from up_data.catalog c ORDER BY c.item_category_code, c.product_group_code;

       item_cat varchar( 100 );
       group_by integer;
       sub_cat varchar( 100 );
       sub_cat_ic varchar( 100 );
       
       counter_sub_cat integer;

       tmp_sub_cat varchar( 100 );
       html text;

BEGIN
     html := '';
     counter_sub_cat :=  0 ;
     OPEN all_cat;
     OPEN sub_cat_man FOR select c.item_category_code, c.manufacturer_code from up_data.catalog c ORDER BY c.item_category_code, c.manufacturer_code;
     OPEN sub_cat_prod;
     /**/
     LOOP
       --------------------------
       -------!!!неработает!!!-------------------
       MOVE  100  IN all_cat;
       --------------------------
       --------------------------
       FETCH all_cat INTO item_cat, group_by;IF FOUND = false THEN EXIT; END IF;
       html := html || '[a parent]' || item_cat;
       ---------------------------------------------
       IF group_by =  1  THEN
         MOVE FORWARD  1  IN sub_cat_man;
         counter_sub_cat :=  0 ;
         LOOP
           FETCH sub_cat_man INTO sub_cat_ic, sub_cat;IF sub_cat_ic != item_cat THEN EXIT; END IF;
           IF sub_cat IS NOT NULL THEN
             html := html || '[a child' || group_by || ']' || sub_cat;
           END IF;
           counter_sub_cat := counter_sub_cat + 1 ;
         END LOOP;
         sub_cat = NULL;
       END IF;
       ---------------------------------------------
       IF group_by =  2  THEN
         MOVE FORWARD counter_sub_cat IN sub_cat_prod;
         counter_sub_cat :=  0 ;
         LOOP
           FETCH sub_cat_prod INTO sub_cat_ic, sub_cat;IF sub_cat_ic != item_cat THEN EXIT; END IF;
           IF sub_cat IS NOT NULL THEN
             html := html || '[a child' || group_by || ']' || sub_cat;
           END IF;
           counter_sub_cat := counter_sub_cat + 1 ;
         END LOOP;
         sub_cat = NULL;
       END IF;
       ---------------------------------------------
     END LOOP;
     
     CLOSE all_cat;
     CLOSE sub_cat_man;
     CLOSE sub_cat_prod;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER;
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32884778
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
простите нечаянно в IE еще раз нажал на линк и запостил 2 раз :-(((
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32884921
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что никто никогда не работал с курсорами??
странно странно либо я тупой либо PG так просто не умеет :-((
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885150
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с курсорами работает, но к сожалению я не смогу помочь. так как сам не силён в этом вопросе.
думаю, что хорошо ознакомились с этим разделом в доках.
http://www.postgresql.org/docs/8.0/interactive/plpgsql-cursors.html
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885172
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эх читал я батенька эти разделы и не только эти и искал в google и где только не искал :-((( НЕРАБОТАЕТ!

там вроде как ничего про сдвиг не написанно
можно в моем случае вызывать курсор другой как пустышку чтоб он двигался а потом наоборот

тольько это ж кривота :-((
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885254
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
FETCH all_cat INTO item_cat, group_by;
откуда это "INTO" взялось, нукак не пойму, даже по хелпу не нашёл.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
test1=> \h FETCH
Command:     FETCH
Description: retrieve rows from a query using a cursor
Syntax:
FETCH [ direction { FROM | IN } ] cursorname

where direction can be empty or one of:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE count
    RELATIVE count
    count
    ALL
    FORWARD
    FORWARD count
    FORWARD ALL
    BACKWARD
    BACKWARD count
    BACKWARD ALL

--
интересно у вас тут
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885285
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
35.8.3.1. FETCH
FETCH cursor INTO target;
FETCH retrieves the next row from the cursor into a target, which may be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. As with SELECT INTO, the special variable FOUND may be checked to see whether a row was obtained or not.

An example:

FETCH curs1 INTO rowvar;
FETCH curs2 INTO foo, bar, baz;

ты ж мне сам ссылку кинул ну почитал бы ее сам ;-)))

ну типа RTFM :-))
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885298
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче у нас тут чел пришел он ораклоид сказал что в оракле MOVE нет :-((( наверное и в PG нет :-(((

буду крутить FETCH и :-(( мать их за ногу
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885350
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
признаться я больше доверяю хелпу, встроеному в "psql", а доку могут и забыть подправить :)
тем неменее перепроверю ещё раз.
--
интересно у вас тут
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885365
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
курсоры в SQL и в plpgsql отличаются если делать как ты пишешь то работать не должно ...
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885402
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эх, точно. "слона то я и не приметил" (с)
--
интересно у вас тут
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885615
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfabrкурсоры в SQL и в plpgsql отличаются если делать как ты пишешь то работать не должно ...

Нда.
Не так давно сам на такой штуке подорвался(((
Это что получается или курсоры двигаются, или циклы и условия есть?
А почему такая фигня нездоровая получается?
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885738
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял двигать курсоры нельзя :-)) (нет заложенных функций PG)
чтобы нужно было крутить 2 или даже 3 курсора надо что - то такое .... :-))

я просто переписал запрос и вместо 3 получил 1 курсор и его даже никуда двигать ненадо вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
DECLARE
  cur CURSOR FOR
      SELECT
        DISTINCT c.item_category_code,
        CASE
          WHEN c.group_by =  1  THEN c.product_group_code
          WHEN c.group_by =  2  THEN c.manufacturer_code
          ELSE c.item_category_code
         END AS sub_cat
       FROM up_data.catalog c INNER JOIN up_data.catalogue c1 ON c.item_category_code = c1.item_code
       WHERE (c.group_by =  1  AND c.product_group_code IS NOT NULL) OR (c.group_by =  2  AND c.manufacturer_code IS NOT NULL)
       ORDER BY c.item_category_code, sub_cat;
  ------------
  html_sub text;
  html_main text;
  html text;
  tmp_main_cat varchar( 100 );
  main_cat varchar( 100 );
  sub_cat varchar( 100 );
  
BEGIN
  html = '';
  html_main = '';
  html_sub = '';
  
  OPEN cur;
  
  LOOP
    FETCH cur INTO main_cat, sub_cat;
    IF NOT FOUND THEN EXIT; END IF;
    IF tmp_main_cat != main_cat THEN
      html_main := '[a parent]' || tmp_main_cat || '\n';
      html :=  html || html_main || html_sub;
      html_main := '';
      html_sub := '';
    END IF;
    html_sub := html_sub || '[a child]' || sub_cat || '\n';
    tmp_main_cat = main_cat;
  END LOOP;
  
  RETURN html;
END;

а в оракле говорят тоже крутить нельзя ... ну вернее можно но для этого надо самому написать пакет ... а может оно и правильно
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32885779
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
перечитал неправильная формулировка у меня

можно делать FETCH cur INTO var1, var2, ... ,varN;

нельзя в plpgsql MOVE FORWARD (BACKWARD, ...) N IN cur
также нельзя FETCH FORWARD N ...

а просто на SQL можно в любую сторону на любое колво полей

Узнал сегодня много нового можна сказать познакомился с plpgsql :-))) как говорится написал свой первый LOOP ^-)))
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32887291
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a EXECUTE 'MOVE FORWARD 5 IN ...'; не пробовал?
...
Рейтинг: 0 / 0
Как в plpgsql сдвинуть курсор??
    #32887538
Fabrichenko Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробовал тогда переменная курсора появляется (в дебагере) и она = NULL все время те я не могу в EXEC подставить курсор
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в plpgsql сдвинуть курсор??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]