【问题标题】:Postgres Function to Insert Arrays用于插入数组的 Postgres 函数
【发布时间】: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_idsuser.other_info_ids 是什么类型?它们是整数吗?这就是错误的意思。
  • 是的,字段是整数,sql查询参数也是。
  • 1-字段需要是整数数组,而不仅仅是整数。和 2-您的驱动程序必须支持在准备好的语句中传递数组。您在调用代码中使用的是什么语言/驱动程序版本?
  • 我认为"unnest" 数组函数会将数组“分解”成新行。我不想在数据库中存储数组,而是解析数组并为每个元素创建一个新行。恐怕我们不在同一个页面上。我相信解决方案与类型转换有关,但我还没有弄清楚...
  • unnest 正是这样做的,但是您传递的或后端接收的似乎不是一个数组,而是一个简单的整数。这就是为什么我建议您检查以数组作为参数的准备好的语句的驱动程序文档。否则,您应该在调用代码中implode 数组,并在 postgresql 端使用 unneststring_to_array 的组合。您将发送带有分隔符的字符串来模拟数组并相应地修改您的函数以采用这种参数。

标签: sql database postgresql database-design


【解决方案1】:

您使用三个参数调用insert_multiple_arrays,但使用四个参数显示定义。也许你有一个旧的 3 参数版本仍然潜伏在那里,有 bug,并试图在 4 参数版本中找到实际上没有使用的 bug?

【讨论】:

  • 啊,我明白你的意思了。我只是忘了将 OUT 参数添加到查询中……我会更新它。基本上我要做的是创建一个新用户,返回新创建的用户 ID,并将其用作接下来两个插入语句的参数。
【解决方案2】:

在探索@cachiques cmets 之后,数据似乎根本没有正确发送。事实证明,传递到后端的数据是一个数组对象,需要比我意识到的更深入地解析。解析后,sql 运行良好。这是我用来从服务器端解析的代码,它将被发送到 sql 查询:

user.other_info_ids = req.body.other_info.map( function(obj) { return obj.info_id; } );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多