Postgresql VARADI C функция, нужна помощь (новичок) - PullRequest
1 голос
/ 15 января 2020

Я новичок в программировании с plpg sql и сохраненными функциями в postgresql. Я запрограммировал одну функцию, которая называется так:

CREATE OR REPLACE FUNCTION public.uploadbutton(VARIADIC arr character varying[])
RETURNS text
LANGUAGE plpgsql
AS $function$DECLARE
arrayi ALIAS for $1;

result text;
begin

return result;

END;
$function$
;

Как видите, функция не имеет большого количества кода. Проблема в том, что я не совсем понимаю, как обращаться с массивами в Postgresql и plpg sql.

Мне нужно разделить массив каждые 3 разделителя до конца массива, массив может иметь много входов, но не менее 3.

SELECT uploadbutton('59373033336415021231','5','a','59373033335915022fff','5','b')

Вот пример для его вызова.

Результат должен выглядеть следующим образом:

('59373033336415021231','5','a')('59373033336415021231','5','a')

Можете ли вы научить меня, как справиться с этим?

С уважением, ребята!

РЕДАКТИРОВАТЬ:

После получения этого результата:

('59373033336415021231','5','a')('59373033336415021231','5','a')

Мне нужно поставить каждые 3 параметра и вызвать второй функция с первой частью результата в качестве параметров. И второе значение должно быть Int. Это должно выглядеть следующим образом:

edit ('59373033336415021231', 5, 'a') и то же самое для второй части редактирования результата ('59373033336415021231', 5, 'a')

В данный момент я пытаюсь это сделать и хочу получить идентификатор первого параметра с помощью моей функции edit (). Вот что у меня есть:

CREATE OR REPLACE FUNCTION public.upload(string_in text)
RETURNS integer
LANGUAGE plpgsql
AS $function$DECLARE
string_in ALIAS FOR $1;

 id integer;

 begin
id= (select id from public.buttons where fbisn = 
 split_part(string_in,',',1));

 return val;
 end;

$function$
;

string_in - каждый раз, когда завершается предложение for первой функции, строка результата этого. Эта функция будет вызываться каждый раз.

Но в настоящее время я не получу никакого результата.

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Мой ответ может показаться некрасивым, но это работает. Вы можете оптимизировать его, если хотите.

CREATE OR REPLACE FUNCTION uploadbutton(arr character varying[]) 
  RETURNS text AS $$
DECLARE

arr_data character varying[] := arr;
array_len integer;
ar_data text;
incr INTEGER := 1;
result_data TEXT;
start_scope text := '(';
end_scope text := ')';
ins_incr integer := 1;
next_val text := '';
BEGIN

    array_len := (select array_length(arr_data,1));

    WHILE incr <= array_len LOOP

        ar_data := CONCAT('''',arr_data[incr],'''');
        IF (result_data IS NULL) THEN 
            result_data := CONCAT(result_data,'',ar_data);
        ELSE 
            result_data := CONCAT(result_data,',',ar_data);
        END IF;

        ins_incr := ins_incr + 1;

        IF (ins_incr = 4) THEN
                result_data := CONCAT(start_scope,result_data,end_scope);
            next_val := CONCAT(next_val,result_data);
            result_data := NULL;
            ins_incr := 1;
        END IF;
        incr := incr + 1;
    END LOOP;

    RETURN CONCAT(next_val,'(',result_data,')');
END $$ 
LANGUAGE plpgsql;

Образец:

SELECT uploadbutton(array ['59373033336415021231','5','a','59373033335915022fff','5','b','59373033335915022CCC','6','C','59373033335915022KKK','77','KK'])
0 голосов
/ 15 января 2020

Может быть FOR LOOP с использованием BY 3 - это то, с чем вы боретесь

CREATE OR REPLACE FUNCTION public.uploadbutton(VARIADIC arr TEXT[])
RETURNS TEXT LANGUAGE plpgsql AS $$
DECLARE result TEXT DEFAULT '';
BEGIN
FOR i IN 1..array_length($1,1) BY 3 LOOP
  result := result || '(' || array_to_string($1[i:i+2],',') || ')';
END LOOP;
RETURN result;
END;
$$;

Тестирование

SELECT uploadbutton(VARIADIC '{"59373033336415021231","5","a","59373033335915022fff","5","b"}'::text[]);
                     uploadbutton                     
------------------------------------------------------
 (59373033336415021231,5,a)(59373033335915022fff,5,b)
(1 Zeile)

Если вам нужны кавычки ' в каждом элементе, просто измените конкатенацию переменной result соответственно:

result := result || E'(\'' || array_to_string($1[i:i+2],E'\',\'') || E'\')';

Редактировать : см. Комментарии

CREATE OR REPLACE FUNCTION public.uploadbutton(VARIADIC arr TEXT[])
RETURNS VOID LANGUAGE plpgsql AS $$
DECLARE slice TEXT[];
BEGIN
FOR i IN 1..array_length($1,1) BY 3 LOOP
  slice := $1[i:i+2];
  PERFORM edit(slice[1]::TEXT,slice[2]::INT,slice[3]::TEXT);
END LOOP;
END;
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...