我的最后一个问题将数组传递给存储到postgres有点不清楚.现在,澄清我的目标:
我想创建一个Postgres存储过程,它将接受两个输入参数.一个将是一些数量的列表,例如(100, 40.5, 76),另一个将是一些发票的 列表('01-2222-05','01-3333-04','01-4444-08').之后我想使用这两个数字和字符列表并对它们做一些事情.例如,我想从这一组数字中取出每个金额,并将其分配给相应的发票.
在Oracle中类似的东西看起来像这样:
SOME_PACKAGE.SOME_PROCEDURE (
789,
SYSDATE,
SIMPLEARRAYTYPE ('01-2222-05','01-3333-04','01-4444-08'),
NUMBER_TABLE (100,40.5,76),
'EUR',
1,
P_CODE,
P_MESSAGE);
Run Code Online (Sandbox Code Playgroud)
当然,这两种类型SIMPLEARRAYTYPE,并NUMBER_TABLE出现在靠前的DB定义.
这是plpgsqlpostgres的一个函数9.6。它尝试INSERT一行,如果插入没有失败(由于违反键约束),那么它会运行更多的命令。
CREATE FUNCTION foo(int, text, text)
RETURNS void AS
$$
BEGIN
INSERT INTO table1 (id, val1, val2) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING;
IF FOUND THEN
INSERT INTO table2 (table1_id, val1) VALUES ($1, $2);
UPDATE table3 SET (val2, time) = ($3, now()) WHERE table1_id = $1;
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
这个函数处理单条记录,但如何修改它来处理一批数千条记录?
我找到了一个答案,它建议将 3 个函数参数中的每一个都设为数组。但是有没有办法做到这一点,我传递的参数更能代表记录在我的应用程序中的外观?
例如,理想的解决方案是我的应用程序代码调用select foo($1),其中参数$1是对象的JSON 数组,其中每个内部对象都是要插入的记录。
[
{ "id": "1", "val1": …Run Code Online (Sandbox Code Playgroud)