powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как из функции plpgsql вернуть массив??!
7 сообщений из 7, страница 1 из 1
Как из функции plpgsql вернуть массив??!
    #32913062
Fabrichenko Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция

Код: 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
Как из функции plpgsql вернуть массив??!
    #32913291
Fabrichenko Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно ... То ли потому что выходные, то ли никто действительно незнает ...
вообщем гугл рулит :-))

решение оказалось как всегда простым.
Нужно все переменные объявлять до того как собираешься их использовать (впринципе логично :-) ) вот теперь все работает.
Если не объявить строку 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
Период между сообщениями больше года.
Как из функции plpgsql вернуть массив??!
    #39955479
Фотография Rinka777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fabrichenko Viktor,

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

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

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

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


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

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


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


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