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

时间:2015-01-01 15:02:53

标签: sql postgresql stored-procedures plpgsql

我有几个插入请求,如下所示:

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无济于事。

如果你有任何线索,我愿意接受它。

2 个答案:

答案 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"()
@Dan:谢谢你的一脚。我可以 ! :D

答案 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可能会更快。