Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как из функции plpgsql вернуть массив??! / 7 сообщений из 7, страница 1 из 1
12.02.2005, 20:37
    #32913062
Fabrichenko Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Есть функция

Код: 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.
CREATE OR REPLACE FUNCTION "up_sys"."str_explode" (str varchar, separator char) RETURNS varchar [] AS
$body$

DECLARE
       ret varchar[];
       i int2;
       c int2;
       tmp_val varchar( 255 );
       tmp_char char;
       len int2;
BEGIN
  i :=  0 ;
  c :=  1 ;
  len = length(str) +  1 ;
    WHILE i <= len LOOP
      tmp_char := substr(str, i,  1 );
        IF tmp_char = separator OR i = len THEN
          ret[c] := tmp_val;
          tmp_val := '';
          c := c +  1 ;
        ELSE
          tmp_val := tmp_val || tmp_char;
        END IF;
      i := i +  1 ;
    END LOOP;
  RETURN ret;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

которая разбивает строку по заданному разделителю
должна возвращать массив (в дебагере Return Value и становится массивом), но когда я вызываю ее

SELECT up_sys.str_explode1('param1;param2', ';');

возвращает null

???
...
Рейтинг: 0 / 0
13.02.2005, 14:27
    #32913291
Fabrichenko Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Странно ... То ли потому что выходные, то ли никто действительно незнает ...
вообщем гугл рулит :-))

решение оказалось как всегда простым.
Нужно все переменные объявлять до того как собираешься их использовать (впринципе логично :-) ) вот теперь все работает.
Если не объявить строку 3 то на выходе всегда будет NULL, а если не объявить строку 6 то пропадает первый элемент (что тоже вполне логично ... ммда странные грабли может потому что PG 8.0 хотя я и с 7 то почти не работал)

и чегото я в документации про объявления не видел нигде ... ща глянем ...
смотри написанно что желательно объявлять

Код: 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.
 0 :: CREATE OR REPLACE FUNCTION "up_sys"."str_explode" (str varchar, separator char) RETURNS varchar [] AS
 1 :: $body$
 2 :: DECLARE
 3 ::   ret varchar[] := '{}';
 4 ::   i int2 :=  0 ;
 5 ::   c int2 :=  1 ;
 6 ::   tmp_val varchar( 255 ) := '';
 7 ::   tmp_char char := '';
 8 ::   len int2 :=  0 ;
 9 :: BEGIN
 10 ::   len = length(str) +  1 ;
 11 ::   WHILE i <= len LOOP
 12 ::     tmp_char := substr(str, i,  1 );
 13 ::       IF tmp_char = separator OR i = len THEN
 14 ::         ret[c] := tmp_val;
 15 ::         tmp_val := '';
 16 ::         c := c +  1 ;
 17 ::       ELSE
 18 ::         tmp_val := tmp_val || tmp_char;
 19 ::       END IF;
 20 ::     i := i +  1 ;
 21 ::   END LOOP;
 22 ::   RETURN ret;
 23 :: END;
 24 :: $body$
 25 :: LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

--------------------------
жизнь как пестня
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.05.2020, 21:45
    #39955479
Rinka777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Fabrichenko Viktor,

нужно обнулить tmp_val в начале.
но возникает другая проблема, пробел не считается символом и исчезает из строк
...
Рейтинг: 0 / 0
08.05.2020, 22:37
    #39955486
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Rinka777,

Не стоит изобретать велосипед. Предлагаю использовать функцию string_to_array
...
Рейтинг: 0 / 0
09.05.2020, 12:33
    #39955532
Rinka777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Swa111, а как же спортивный интерес? ))

regexp_split_to_array уже использовала
...
Рейтинг: 0 / 0
11.05.2020, 14:48
    #39955895
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Rinka777
Swa111, а как же спортивный интерес? ))

regexp_split_to_array уже использовала


спортивный интерес - это поднятие тем 15-летней давности.
...
Рейтинг: 0 / 0
15.05.2020, 12:45
    #39957947
Rinka777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из функции plpgsql вернуть массив??!
Ролг Хупин

спортивный интерес - это поднятие тем 15-летней давности.


передам решение Fabrichenko Viktor в батоне вместе с напильником )
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как из функции plpgsql вернуть массив??! / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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