带有文本数组参数的plpgsql函数来自节点postgres

时间:2015-11-27 23:11:20

标签: arrays node.js postgresql plpgsql

我在plpgsql中有以下功能

create or replace  function domix(mix int[],newmix text[]) RETURNS integer AS \$$
DECLARE
  I INT;
  newmix_char text;
BEGIN
  FOREACH newmix_char IN ARRAY newmix
    LOOP
     insert into mix_table (name) values (newmix_char);
    END LOOP;
  FOREACH I IN ARRAY MIX
    LOOP
      insert into domix_table (id) values (I);
   END LOOP;
  RETURN 1;
 END;
 \$$ LANGUAGE plpgsql;

服务器是节点服务器。 我看过Pass array from node-postgres to plpgsql function并且我已经关注了它。 我传递了指示的值,(domixids是一个int数组,newmixes是一个字符串数组)

 'mix': '{'+domixids.join() +'}',
 'newmix':'{'+ newmixes.join()+'}',
在db调用显示之前在服务器上打印:mixids {14,13} newmix {si,non}

该函数的行为与我对mixids的预期一样 - 循环并为每个id插入一行。但是newmix被认为是1个字符串并且被插入,没有循环。 我试过{'si','non'},但结果相同。 我的错误在哪里?我显然没有发送它所期望的功能。或者我完全退出,这不是循环和字符串数组的方式?我正在使用Postgres 9.4 感谢任何指针

我正在添加更多细节(尝试过这些建议 - 因为它不起作用)。正如我所说的那样对整数都很有效,而且我显然没有正确传递字符串数组。我将列表作为一组字符串逗号从界面(newmix)中分离出来。我拆分

   var newmixes = newmix.split(/,/);
   console.log(new mixes);  --> ["yes", "non", "trois"]
   var infoWhat= { 'mix': '{'+domixids.join() +'}',
            'newmix':'{'+ newmixes.join()+'}'
               };
   console.log(infoWhat);   ----> Object {mix: "{}",new mix: "{yes,no}"}}

在数据库中,我得到:{yes,no}。 我尝试传递“{''是'',''不''}”,同样的结果我得到{''是'',''不''}。

使用node-postgres作为预准备语句调用我的函数:      “选择domix($ 1,$ 2);”
和$ 1,$ 2由req.body.mix,req.body.domix

传递

如果我必须显式转换为:: TEXT []我应该在哪里做?

非常感谢

1 个答案:

答案 0 :(得分:0)

我必须在函数调用中放置显式强制转换:

select function($1,$2::TEXT[]);

现在正确输入数据。 感谢帮助我找到解决方案的帮助和指示!