我正在 PostgreSQL 中编写一个函数。它基本上做了3个步骤:
- 从源表中获取记录。
- 检查目标表中获取的记录的值,如果在目标表中找到记录,则用获取的记录更新目标表的所有值,否则将获取的记录插入目标表。
如果我为插入/更新编写单个查询,而不是执行此循环,它会比上述方法更快吗?如何通过编写单个查询而不是遍历每条记录并进行更新/插入来获得相同的结果。
我目前的方法如下
CREATE OR REPLACE FUNCTION fun1()
RETURNS void AS
$BODY$DECLARE
source_tab_row RECORD;
v_col1 TEXT;
v_col2 TEXT;
v_col3 TEXT;
v_col4 double precision ;
cnt integer;
BEGIN
FOR source_tab_row IN (SELECT * FROM source_tab where col5='abc')
LOOP
v_col1=source_tab_row.col1;
v_col2=source_tab_row.col2;
v_col3=source_tab_row.col3;
v_col4=source_tab_row.col4;
select count(*) INTO cnt from dest_tab where col1=v_col1;
if (cnt =0) then
-- If records is not found
INSERT INTO dest_tab(col1, col2, col3,col4)
VALUES( v_col1, v_col2, v_col3,v_col4) ;
else
--if records found then update it
update dest_tab set col1=v_col1, col2=v_col2, col3=v_col3,col4=v_col4
where col1=v_col1;
end if;
END LOOP;
END;
$BODY$ LANGUAGE plpgsql;