带有来自节点 postgres 的文本数组参数的 plpgsql 函数
plpgsql function with text array parameter coming from node postgres
我在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}
该函数的行为符合我对 mixid 的预期 - 循环并为每个 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}。
我尝试传递“{''yes'',''no''}”,我得到的结果相同 {''yes'',''no''}.
我的函数是使用 node-postgres 作为准备语句调用的:
"select domix(,);"
和 $1,$2 由 req.body.mix, req.body.domix
传递
如果我必须显式转换为 ::TEXT[] 我应该在哪里做?
非常感谢
我不得不在函数调用中进行显式转换:
select function(,::TEXT[]);
现在数据输入正确了。
感谢帮助我找到解决方案的帮助和指点!
我在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}
该函数的行为符合我对 mixid 的预期 - 循环并为每个 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}。 我尝试传递“{''yes'',''no''}”,我得到的结果相同 {''yes'',''no''}.
我的函数是使用 node-postgres 作为准备语句调用的:
"select domix(,);"
和 $1,$2 由 req.body.mix, req.body.domix
如果我必须显式转换为 ::TEXT[] 我应该在哪里做?
非常感谢
我不得不在函数调用中进行显式转换:
select function(,::TEXT[]);
现在数据输入正确了。 感谢帮助我找到解决方案的帮助和指点!