将多个 INSERT 语句放入存储过程

Put several INSERT statements into a stored procedure

我有几个如下的插入请求:

insert into dummy (col1,col2) SELECT 'aa',one_col FROM another_table;
insert into dummy (col1,col2) SELECT 'bb',another_col FROM another_table;

我想把它们放在一个存储过程中,偶尔运行一次。

唉,我在网上找不到相关的东西。我不想 return 一个值,因此创建一个函数对我来说毫无用处。我认为使用 WITH 无济于事。

如果你有什么线索,我愿意接受。

认真看说明书搞定了

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"()

@Dan:感谢踢球。我可以 ! :D

没问题 PL/pgSQL function, but for "a call once in a while" and only plain SQL statements, LANGUAGE sql 是更合适的格式。详细讨论何时使用:

  • Difference between language sql and language plpgsql in PostgreSQL functions

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

CTEs 由于从第一个 SELECT 开始实现集,因此可能会更昂贵一些 - 或者不是,如果这实际上节省了多次选择行的时间,例如单独的 INSERT 语句会。

您可能希望同一批中的所有 INSERT 语句都基于同一个快照。如果可以 并发写入操作 ,CTE 将保证这一点,因为整个查询基于所有相关表的 相同快照

如果并发不是问题并且 SELECT 很便宜(或不一样),简单、单独的 INSERT 可能会更快。