gpt4 book ai didi

postgresql - 如何使用 plpgsql 函数插入数据?

转载 作者:行者123 更新时间:2023-11-29 11:48:39 24 4
gpt4 key购买 nike

我正在尝试使用 plpgsql 函数或存储过程将数据插入表中。但是,我想一次插入多条记录。我现在这些都是 VARCHAR,所以我想我可以使用像 function(tablename VARCHAR, records VARCHAR[][]) 这样的函数。但后来我发现 plpgsql 中的多维数组支持并不是那么好。

这就是我的函数目前的样子。这不会产生我正在寻找的结果。当我问

SELECT insert_data('tennis', ARRAY[ARRAY['1','2'], ARRAY['3','4']])

出现以下错误

ERROR:  syntax error at or near "{"
LINE 1: INSERT INTO tennis VALUES (null, {{1}}), (null, {{3}});
^
QUERY: INSERT INTO tennis VALUES (null, {{1}}), (null, {{3}});
CONTEXT: PL/pgSQL function "insert_data" line 26 at EXECUTE statement

但是我期待这样的查询

INSERT INTO tennis VALUES (null, '1', '2'), (null, '3', '4');

这会起作用,因为乒乓球具有这种结构。

CREATE OR REPLACE FUNCTION insert_data (dsetname_in VARCHAR, records VARCHAR[][])
RETURNS BOOLEAN AS $PROC$
DECLARE
insertquery TEXT;
val VARCHAR;
i INT;
j INT;
BEGIN
insertquery = $$INSERT INTO $$ || dsetname_in || $$ VALUES $$;
FOR i IN array_lower(records, 1)..array_upper(records, 1)
LOOP
insertquery = insertquery || $$(null, $$;
FOR j IN array_lower(records[i:i], 1)..array_upper(records[i:i], 1)
LOOP
val = records[i:i][j:j];
insertquery = insertquery || val;
IF j <> array_upper(records[i:i], 1) THEN
insertquery = insertquery || $$, $$;
END IF;
END LOOP;
insertquery = insertquery || $$)$$;
IF i <> array_upper(records, 1) THEN
insertquery = insertquery || $$, $$;
END IF;
END LOOP;
insertquery = insertquery || $$;$$;
EXECUTE insertquery;
RETURN TRUE;
END;$PROC$ LANGUAGE 'plpgsql';

最佳答案

我对整个方法的值(value)持怀疑态度,因为我看不到它增加了任何有用的抽象级别;但是如果你必须这样做,并且你所有的值都是字符串,我认为最干净的方法是这样的:

CREATE OR REPLACE FUNCTION insert_data(dsetname_in text, records text[])
RETURNS VOID LANGUAGE plpgsql AS $PROC$
DECLARE
insertquery text;
i int;
BEGIN
insertquery := 'INSERT INTO ' || dsetname_in || ' VALUES ';
FOR i IN array_lower(records, 1)..array_upper(records, 1)
LOOP
insertquery := insertquery || '(null, ' || records[i] || '),';
END LOOP;
insertquery := left(insertquery, char_length(insertquery) - 1);
EXECUTE insertquery;
END;
$PROC$;

然后你可以这样调用它,这看起来比你为嵌套数组显示的更干净:

SELECT insert_data('tennis',
ARRAY[$$'1','2'$$,
$$'3','4'$$]);

关于postgresql - 如何使用 plpgsql 函数插入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com