【发布时间】:2016-06-30 21:44:12
【问题描述】:
我正在尝试通过 postgres 函数插入数据,但我无法让它正常工作。我收到一条错误提示
错误:函数 unnest(integer) 不存在 SQL 状态:42883 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我使用的是Postgres 9.5,我的功能如下:
CREATE FUNCTION insert_multiple_arrays(
some_infoid INTEGER[],
other_infoid INTEGER[],
some_user_info VARCHAR,
OUT new_user_id INTEGER
)
RETURNS INTERGER AS $$
BEGIN
INSERT INTO user_table (user_info) VALUES ($3) RETURNING user_id INTO new_user_id;
INSERT INTO some_info_mapper (user_id, some_info_id) SELECT new_user_id, unnest($1);
INSERT INTO other_info_mapper (user_id, other_info_id) SELECT new_user_id,unnest($2);
END;
$$ LANGUAGE plpgsql;
我将通过 SELECT 语句从我的后端调用存储过程。一个例子是这样的:
createUser(user, callback){
let client = this.getDb();
client.query("SELECT insert_multiple_arrays($1, $2, $3)",
[user.some_info_ids, user.other_info_ids, user.info], function(err, results){
if(err){
callback (err);
}
callback(null, results);
});
};
我期望的输出如下:
user_table
user_id | user_info |
----------------------+-----------------+
1 | someInfo |
some_info_mapper
user_id | some_info_id |
----------------------+-----------------+
1 | 33 |
1 | 5 |
other_info_mapper
user_id | other_info_id |
----------------------+-----------------+
1 | 8 |
1 | 9 |
1 | 22 |
1 | 66 |
1 | 99 |
我该如何处理这个错误?我是否需要对我的数据进行某种处理以将其转换为 postgres 接受的格式?
【问题讨论】:
-
user.some_info_ids和user.other_info_ids是什么类型?它们是整数吗?这就是错误的意思。 -
是的,字段是整数,sql查询参数也是。
-
1-字段需要是整数数组,而不仅仅是整数。和 2-您的驱动程序必须支持在准备好的语句中传递数组。您在调用代码中使用的是什么语言/驱动程序版本?
-
我认为"unnest" 数组函数会将数组“分解”成新行。我不想在数据库中存储数组,而是解析数组并为每个元素创建一个新行。恐怕我们不在同一个页面上。我相信解决方案与类型转换有关,但我还没有弄清楚...
-
unnest正是这样做的,但是您传递的或后端接收的似乎不是一个数组,而是一个简单的整数。这就是为什么我建议您检查以数组作为参数的准备好的语句的驱动程序文档。否则,您应该在调用代码中implode 数组,并在 postgresql 端使用unnest和string_to_array的组合。您将发送带有分隔符的字符串来模拟数组并相应地修改您的函数以采用这种参数。
标签: sql database postgresql database-design