【问题标题】:Postgresql VARADIC function, need help (beginner)Postgresql VARIADIC 函数,需要帮助(初学者)
【发布时间】:2020-05-02 02:14:55
【问题描述】:

我是使用 plpgsql 编程和在 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 和 plpgsql 中处理数组。

我需要每隔 3 个分隔符拆分数组,直到数组结束,数组可以有很多输入,但最少 3 个。

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

这里是一个调用它的例子。

输出应该是这样的:

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

你能教我,如何处理吗?

各位小伙伴们好!

编辑:

得到这个结果后:

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

我需要输入每 3 个参数,并以结果的第一部分作为参数调用第二个函数。第二个值必须是 Int。这应该是这样的:

编辑('59373033336415021231',5,'a') 结果的第二部分也是如此 编辑('59373033336415021231',5,'a')

我现在正在尝试,想用我的 edit() 函数获取第一个参数的 id。这就是我所拥有的:

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 子句完成时的结果字符串。每次都会调用这个函数。

但目前,我不会得到任何结果。

感谢您的帮助

【问题讨论】:

  • 你能添加一个输出应该是什么样子的示例吗?
  • 输出应该是这样的:('59373033336415021231','5','a')('59373033336415021231','5','a')
  • 感谢您编辑问题,我是新来的。 :)
  • 我强烈建议不要这样做。不要将不同的东西混入一个巨大的参数数组。创建与您要传递的三种不同内容相匹配的三个输入参数,这样您还可以为它们提供正确的数据类型,例如uploadbutton(p_codes int[], p_numbers int[], p_text text[]).

标签: arrays postgresql function plpgsql


【解决方案1】:

也许 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'\')';

编辑:见 cmets

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;
$$;

【讨论】:

  • 嘿伙计,谢谢你的代码。我已经使用它并尝试对其进行扩展,但我遇到了下一个问题。我想使用每 3 个值执行第二个函数,如下所示: select insertfunction(59373033336415021231,5,a) 比第二个函数相同,依此类推。你能帮我解决这个问题吗?这就是我更改函数的方式: FOR i IN 1..array_length($1,1) BY 3 LOOP insertquery := result || E'\'' || array_to_string($1[i:i+2],',') || E'\')';结果 = 上传(插入查询);
  • 嗨@ChristophD,第二个函数是在一个参数中获取一个包含3个值的数组还是获取3个不同的参数?
  • @ChristophD 顺便说一句,您可以使用此信息以及收到的错误消息来编辑您的问题吗?还要解释一下函数upload 做了什么以及它返回了什么:) 如果我没看错,你根本不需要变量result,因为你在第一个函数内部调用了第二个函数。 . 对吧?
  • 完成 :) 抱歉我的英语和技能不好,我几周后还在学习 :)
  • 抱歉回答晚了,您的代码帮助我编写了函数。现在我有我想要的了。
【解决方案2】:

我的回答可能看起来很难看,但它确实有效。您可以根据需要对其进行优化。

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'])

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多