- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我声明我对对象问题的回答是"is",在我的情况下很方便,但我在这里问专家。 我开发了很多 plpgsql 函数,只有一个是用 C 语言开发的,但我已经明白学习曲线肯定更倾斜。 在可能的情况下,我需要一
我已经用谷歌搜索了很多,并且我有相当不错的阅读理解能力,但我不明白这个脚本是否可以在我的 postgres/postgis 盒子上的多个线程中工作。这是代码: Do $do$ DECLARE
我有一个名为 test 的表,我按名为 daterange 的范围的上限对它进行排序。我想获取此排序数据的顺序并将其保存在名为 bc_order 的同一表的另一列中。 排序的顺序必须保存在bc_ord
我在 Postgres 9.5 数据库中有以下表格: 产品 Column | Type |
我正在使用 PostgreSQL。 我需要使用 PLPGSQL 语言的存储过程,它将返回表 (SET OF RECORDS),其中包含来自 my_table 的前 2 个和后 2 个结果的计数。 例如
我想在我的应用程序中实现分页。我创建了返回记录数作为输出参数和引用游标数据本身的存储过程(具有限制和偏移量)但作为结果——我得到了——“由于 OUT 参数,函数结果类型必须是 bigint” 据我所知
我在数据库后端使用 Postgres 9.3 的报告中有以下相当简单的查询: SELECT * FROM source JOIN sourcelevel USING (source_id) JOIN
我曾经在邮件列表中读过这个条目 http://archives.postgresql.org/pgsql-hackers/2005-06/msg01481.php SELECT * FROM foo_
例如。 --Assigning value to variable in function as a parameter. create or replace function f1(number i
我正在尝试将记录或 json 存储到数组中并从函数返回 JSON: CREATE OR REPLACE FUNCTION stat_per_day() RETURNS json AS $$ DECLA
我正在尝试创建选择数据、处理并返回它们的过程,但我正在努力如何为多列定义数组变量。 这个有效: CREATE OR REPLACE FUNCTION testing_array_return() RE
为了能够在一个数据库中创建应用程序的不同实例,例如测试阶段,我想使用变量作为模式名称。创建表或序列时一切正常,但我想不出一种在函数内部使用变量的优雅方法。我已经阅读了一些文章关于美元引用的字符串常量,
我有一个表“消息”。对于每个 INSERT'ed 行,我必须在同一个表“消息”(用于群发邮件)中插入该行的多个副本。我为它创建了一个触发器(例如一个副本)。 CREATE OR REPLACE FUN
我想在一个函数中以两种不同的方式查找数据,并在找到结果后立即返回。 首先我想运行一个查询; select * from company where company.id = x 然后,如果没有返回结果
我正在将 postgres 与 postgis 结合使用,并且我有一个包含几何数据的表格。现在我想在 plpgsql 中编写一个循环遍历行并将每个几何值存储在数组中的过程。 我应该使用什么返回类型来返
create function dept_count (dept_name varchar(20)) returns integer as $$ begin declare d_count integ
我刚刚开始使用 postgres 并且对整个事情都是陌生的,我正在使用 postgres 9.6 版并试图创建一个新函数但是我不断收到错误 ERROR: syntax error at or near
有没有一种方法可以加速我们的 plpgsql 函数,该函数在循环执行的一个查询中计算某些类型的文档?全部在一个查询中? validador := (select count(id_doc) from
我已经编写了以下函数,但是当我运行它时它没有返回任何内容。有人可以帮助确定问题吗? CREATE OR REPLACE FUNCTION GenerateReadableRandomString (
我有 Postgresql 8.4 我有一个用户表 user_id INT, user_name VARCHAR(255), user_email VARCHAR(255), user_salt VA
我是一名优秀的程序员,十分优秀!