我有几个插入请求,如下所示:
insert into dummy (col1,col2) SELECT 'aa',one_col FROM another_table;
insert into dummy (col1,col2) SELECT 'bb',another_col FROM another_table;
我想将它们放在一个存储过程中并偶尔运行一次。
唉,我发现网上没有任何相关内容。我不想返回一个值,因此创建一个函数对我来说没用。我认为使用WITH
无济于事。
如果你有任何线索,我愿意接受它。
答案 0 :(得分:0)
通过认真阅读手册
我想通了CREATE OR REPLACE FUNCTION my_insert()
returns void AS
$$
BEGIN
insert into dummy (col1,col2) SELECT 'aa',one_col FROM another_table;
insert into dummy (col1,col2) SELECT 'bb',another_col FROM another_table;
END;
$$ language plpgsql
然后输入
执行它SELECT "my_insert"()
答案 1 :(得分:0)
PL/pgSQL function没有任何问题,但对于“偶尔进行一次调用”而且只有普通的SQL语句,LANGUAGE sql
是更合适的格式。详细讨论何时使用:
CREATE OR REPLACE FUNCTION my_insert()
RETURNS void AS
$func$
WITH sel AS (SELECT one_col, another_col FROM another_table WHERE <some_condition>)
, ins1 AS (INSERT INTO dummy (col1,col2) SELECT 'aa', one_col FROM sel)
INSERT INTO dummy (col1,col2) SELECT 'bb', another_col FROM sel;
$func$ LANGUAGE sql
由于从第一个SELECT
实现了集合,CTEs可能会有点贵,如果实际上节省了多次选择行,就像单独的INSERT
语句一样会。
您可能希望同一批中的所有INSERT
语句都基于相同的快照。如果可以并发写入操作,CTE将保证,因为整个查询基于所有相关表的相同快照。
如果并发不是问题且SELECT
便宜(或不相同),简单的单独INSERT可能会更快。