Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в plpgsql сдвинуть курсор?? / 16 сообщений из 16, страница 1 из 1
26.01.2005, 14:24
    #32884773
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
Есть функция которая должна выбрать из базы данные и по определенному правилу сделать 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
26.01.2005, 14:25
    #32884778
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
простите нечаянно в IE еще раз нажал на линк и запостил 2 раз :-(((
...
Рейтинг: 0 / 0
26.01.2005, 15:07
    #32884921
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
что никто никогда не работал с курсорами??
странно странно либо я тупой либо PG так просто не умеет :-((
...
Рейтинг: 0 / 0
26.01.2005, 16:13
    #32885150
Niemi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
с курсорами работает, но к сожалению я не смогу помочь. так как сам не силён в этом вопросе.
думаю, что хорошо ознакомились с этим разделом в доках.
http://www.postgresql.org/docs/8.0/interactive/plpgsql-cursors.html
...
Рейтинг: 0 / 0
26.01.2005, 16:19
    #32885172
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
Эх читал я батенька эти разделы и не только эти и искал в google и где только не искал :-((( НЕРАБОТАЕТ!

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

тольько это ж кривота :-((
...
Рейтинг: 0 / 0
26.01.2005, 16:46
    #32885254
Niemi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
Код: 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
26.01.2005, 16:54
    #32885285
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
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
26.01.2005, 16:56
    #32885298
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
Короче у нас тут чел пришел он ораклоид сказал что в оракле MOVE нет :-((( наверное и в PG нет :-(((

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

Нда.
Не так давно сам на такой штуке подорвался(((
Это что получается или курсоры двигаются, или циклы и условия есть?
А почему такая фигня нездоровая получается?
...
Рейтинг: 0 / 0
26.01.2005, 19:55
    #32885738
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
Насколько я понял двигать курсоры нельзя :-)) (нет заложенных функций 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
26.01.2005, 20:42
    #32885779
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в plpgsql сдвинуть курсор??
перечитал неправильная формулировка у меня

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

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

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

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


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