Postgresql 如何在postgres中的函数中传递、数组和修改它

Postgresql 如何在postgres中的函数中传递、数组和修改它,postgresql,plpgsql,stored-functions,Postgresql,Plpgsql,Stored Functions,我正在尝试编写一个函数来实现这一点:基本上创建一个数组,该数组的数据元素与传递给该函数的数组的数据元素相同,但有时会有一些变化——例如,如果某个元素为偶数,则标志应该从N变为Y。该过程将包含两个元素的数组作为输入—一个数字和一个标志。1、'N',2、'N'。现在,如果传递的数字是偶数,那么proc应该修改该值并将其更改为2,'Y',而另一个保持为1,'N' 基本上,我的数组基础知识不清楚,通读细节对解决这个问题没有帮助 我尝试了以下方法,但不起作用……请您提出建议: CREATE TYPE te

我正在尝试编写一个函数来实现这一点:基本上创建一个数组,该数组的数据元素与传递给该函数的数组的数据元素相同,但有时会有一些变化——例如,如果某个元素为偶数,则标志应该从N变为Y。该过程将包含两个元素的数组作为输入—一个数字和一个标志。1、'N',2、'N'。现在,如果传递的数字是偶数,那么proc应该修改该值并将其更改为2,'Y',而另一个保持为1,'N'

基本上,我的数组基础知识不清楚,通读细节对解决这个问题没有帮助

我尝试了以下方法,但不起作用……请您提出建议:

CREATE TYPE test_n_t_num AS (
v_n double precision,
is_even character varying(1));

create function temp_n_proc_2(p_nums IN OUT test_n_t_num[])
as
$$
declare
   v_nums test_n_t_num[];
     v_cnt double precision;
BEGIN
  v_cnt := cardinality(p_nums);

   v_nums := ARRAY[]::test_n_t_num[];

  for i in 1..v_cnt LOOP
   if p_nums[i].v_n_double % 2 = 0 then
      v_nums [i].is_even := 'Y';
      p_nums [i].is_even := 'Y'
   else 
      v_nums [i].is_even := p_nums [i].is_even;
   end if;

   v_nums[i] := {p_nums[i].v_n,v_nums [i].is_even};  

  END LOOP;

END;
$$
language plpgsql;
稍后我还需要循环并打印数组v_nums中的值,该数组在函数中定义

谢谢,,
Nirav

我在当天尝试做这类事情时也遇到了类似的问题。基本上,您不能使用数组表示法分配给复合对象,即您的_数组[1]。字段:=值不起作用。这里有一点我不使用基数,因为我仍然在9.3上,并且是在9.4中添加的:

CREATE TYPE public.test1 AS (a INTEGER, is_even BOOLEAN);

CREATE OR REPLACE FUNCTION f1(ar INOUT public.test1[]) AS $$
DECLARE
        t public.test1;
BEGIN
        RAISE NOTICE '%', ar;
        FOR i IN 1..ARRAY_LENGTH(ar, 1) LOOP
                t := ar[i];
                t.is_even := t.a % 2 = 0;
                ar[i] := t;
        END LOOP;
        RAISE NOTICE '%', ar;
END
$$ LANGUAGE plpgsql;
因此,基本上创建一个这种类型的变量,将索引项读入变量,修改字段,然后将变量的内容复制回数组

从f1'{1,4,6,}'中选择*::public.test1[]返回{1,f,4,t,6,t}

使用pgadmin 3打印的消息包括:

NOTICE:  {"(1,)","(4,)","(6,)"}
NOTICE:  {"(1,f)","(4,t)","(6,t)"}

我甚至不能在我的系统上创建它,它不喜欢函数的语法。但无论如何,你的返回值是p_nums,但你的大部分作业都是v_nums。。。是吗?是的,我只是想在我的实际工作问题中也设置v_nums,我通过这个问题建模,我需要打印出v_nums。我在语法上非常混乱。而且我也编辑过一次p_nums。非常感谢!我在文档中没有看到任何地方指出这些细节。这很棘手!还有一个问题。如果在函数中,我想打印出传递的原始数组和修改后的数组,该怎么办。这可能吗?@dbusern不确定我是否理解你所说的打印-请参阅上面的编辑,是吗?由于相同的数组变量用于输入和输出,要打印原始版本,我需要在开始时调用raisenotice,然后再进行任何修改。然后在它返回之前的最后,它再次打印修改后的数组。嗨,Eurotrash,我明白你的意思了。我的错。我要说的是,;应用程序需要与修改后的数组一起返回。我想你已经提供了细节。我明天会测试并确认是否可行。再次感谢你。非常感谢你。它完全按照你说的那样工作,完全解决了我的问题。这是一个非常好的帮助。非常感谢。